balk 0 14 августа, 2018 Опубликовано 14 августа, 2018 · Жалоба имеется asm-программа . в MPLAB IDE 8.33 запущен отладчик MPLAB SIM. двигаясь по шагам , перехожу на подпрограмму с адреса 0050 на адрес 0140. в окне WATCH наблюдаю изменение PCL на 40, а PCLATH почему-то остается в 00, хотя отладчик двигается дальше 0142.. и в PCLATH я ожидал видеть 01. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба в PCLATH я ожидал видеть 01.Вы неправильно понимаете смысл регистра PCLATH. 01 (так понимаю, это - хексы, поэтому не забывайте указывать 01h, или 0x01, и т.п.) у Вас в старшем регистре програмного счётчика. PCLATH используется, когда опкод не содержит значение для в/у регистра. Тогда предварительно надо в PCLATH записать значение, которое будет переписано в старший регистр програмного счётчика, при выполнении команд с таким опкодом. Ну, и как принято говорить: читайте даташит. :rolleyes: Там всё очень хорошо разрисовано (за что люблю Майкрочип). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
balk 0 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба да, спасибо, как водится, пока 5 раз одно и тоже в даташите не прочитаешь, не поймешь. добавил команду MOVF PCL и увидел в PCLATH реальный сегмент адреса. тема собственно меня забеспокоила потому, что в вызове подпрограммы, которая размещается в произвольном месте присутствует еще подпрограмма с т.н. вычисляемым переходом ADDWF PCL, в результате которого у меня вместо 0318h происходит перескок на 0018h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба добавил команду MOVF PCL и увидел в PCLATH реальный сегмент адресаФигня какая-то. В том-то весь и фокус, что операции с програмным счётчиком никак не влияют на содержимое регистра PCLATH. Что туда запишите, то там и будет находиться до следующей перезаписи. Реальный сегмент находится в PCH. подпрограммы, которая размещается в произвольном местеЕсли в произвольном, то надо делать пару десятков строк дополнительного кода. В двух словах так: Сперва пишите в PCLATH старшую половину адреса метки начала таблицы переходов. Затем производите сложение PCL с переменной перехода, но с результатом в аккумулятор. Если поднят флаг переноса, инкрементируете PCLATH. Опять производите сложение с PCL, но уже результат в регистр. Если необходимо сократить код и/или повысить быстродействие (т.е. сократить количество команд), есть вариант размещать таблицу переходов строго в пределах 256-строчного сегмента адресов (чтобы при сложении PCL гарантировано не было переполнения). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
balk 0 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба В том-то весь и фокус, что операции с програмным счётчиком никак не влияют на содержимое регистра PCLATH. влияют вот даташит говорит, что содержимое PC транслируется в PCLATH при любом чтении PC. the upper two bytes of the program counter are transferred to PCLATH and PCLATU by an operation that reads PCL. проверьте в отладчике , если сомневаетесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба даташит говоритДавайте-ка по прядку. Что у Вас за камень? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
balk 0 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба Реальный сегмент находится в PCH. что такое PCH ? не нахожу в даташите на PIC18F2550 кстати, в отладчике среди SFR имеется PCLAT , тоже не понятно что это, ибо в даташите тоже не вижу, по разрядам вроде соответствует счетчику, но изменяется тоже только в пределах 256 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 15 августа, 2018 Опубликовано 15 августа, 2018 · Жалоба на PIC18F2550Тогда понятно. Я говорил про 12-16 серии. Там такого не было, насколько помню. В 18 подшаманили. что такое PCHНа десять строк выше Вашей цитаты. :rolleyes: среди SFR имеется PCLATЭто, видимо PCLATH и PCLATU вместе взятые. Разрядов-то сколько? Такая же фигня и с TMR1H и TMR1L, например. Удобнее смотреть целиком (ИМХО, разумеется). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
balk 0 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба Smen спасибо за содействие с PCLATH я пока обошелся авантюрно- перед ADDWF PCL выставил один оператор MOVFF TOSH,PCLATH и он меня спасает, если таблица и ее вызов находятся в одном сегменте. пока для простой отладки мне достаточно. PCLAT Это, видимо PCLATH и PCLATU вместе взятые. видимо, не так. адреса разные. а у PCL и PCLAT один и тот же адрес FF9, но разрядность у PCLAT 0x000000, хотя изменения почему происходят только в младшем байте. ну как водится со временем можно разобраться , если будет практическая необходимость. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 17 августа, 2018 Опубликовано 17 августа, 2018 · Жалоба MOVFF TOSH,PCLATHКак-то совсем авантюрно. :rolleyes: Это сперва должен быть вызов ПП. А чем не устраивает обычный movlw hight Label movwf PCLATH видимо, не так. адреса разныеДа какие адреса? Это же виртуальный регистр. Он существует только в отладчике для визуального удобства восприятия. Судя по разрядности, это PCLATU + PCLATH + PCL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
balk 0 18 августа, 2018 Опубликовано 18 августа, 2018 · Жалоба А чем не устраивает обычный movlw hight Label movwf PCLATH не совсем понимаю, что кроется под hight label. мой замысел был таков от строки вызова call pprog перехожу к метке pprog ( в этом же сегменте) делаю MOFF TOSH,PCLATH - записываю в PCLATH код сегмента вызывателя, чтоб потом через ADDWF PCL и соответствующий retlw вернуться именно к вызывателю, а не к вызывателю вызывателя, находящегося в другом сегменте Да какие адреса? Это же виртуальный регистр. это просто констатация того, что изображает отладчик Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
my504 2 18 августа, 2018 Опубликовано 18 августа, 2018 · Жалоба не совсем понимаю, что кроется под hight label. Под hight label кроется номер сегмента, в котором размещена таблица. Если таблица имеет размер более одного сегмента, то hight label нужно предварительно вычислить. При выполнении команды RETLW в таблице, возврат произойдет БЕЗ ПРИВЯЗКИ К PCLATH, поскольку стек имеет ПОЛНУЮ РАЗРЯДНОСТЬ счетчика команд. Из чего следует, что Ваши выкрутасы с вершиной стека не имеют никакого смысла и лишь приведут к разрушению стека. Регистр PCLATH - это просто буфер, с помощью которого синхронизируют изменение младшего байта счетчика команд с изменением старшего байта того же счетчика. Никакого отношения PCLATH не имеет к самому PC (PCL:PCH), который собственно и управляет выборкой из программного флеша очередной команды. 5.1.1 PROGRAM COUNTER The Program Counter (PC) specifies the address of the instruction to fetch for execution. The PC is 21 bits wide and is contained in three separate 8-bit registers. The low byte, known as the PCL register, is both readable and writable. The high byte, or PCH register, contains the PC<15:8> bits; it is not directly readable or writable. Updates to the PCH register are performed through the PCLATH register. The upper byte is called PCU. This register contains the PC<20:16> bits; it is also not directly readable or writable. Updates to the PCU register are performed through the PCLATU register. The contents of PCLATH and PCLATU are transferred to the program counter by any operation that writes PCL. Similarly, the upper two bytes of the program counter are transferred to PCLATH and PCLATU by an operation that reads PCL. This is useful for computed offsets to the PC (see Section 5.1.4.1 ”Computed GOTO”). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба что кроется под hight labelСтарший (точнее средний) байт адреса метки (т.е. то, что должно находиться в PCLATH). :rolleyes: Выше я расписывал алгоритм. При выполнении команды RETLW в таблице, возврат произойдет БЕЗ ПРИВЯЗКИ К PCLATHДля retlw PCLATH не нужен, но он необходим при переходе на этот retlw. И никакого разрушения стэка быть не должно, хотя я тоже считаю, что данная конструкция "через Ж". balk, если у Вас вся таблица только из retlw (т.е. долько данные), то 18 семейство позволяет использовать специальные команды табличного чтения. Может Вам посмотреть в эту сторону? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
my504 2 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба 18 семейство позволяет Нынче и все относительно новые 12...16-ые тоже позволяют. Причем даже проще, чем 18-ые. Флеш доступен, начиная с адреса оперативной памяти 0x8000. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 20 августа, 2018 Опубликовано 20 августа, 2018 · Жалоба У ТС 18F2550. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться