|
|
 |
Ответов
|
Aug 15 2018, 06:42
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792

|
да, спасибо, как водится, пока 5 раз одно и тоже в даташите не прочитаешь, не поймешь. добавил команду MOVF PCL и увидел в PCLATH реальный сегмент адреса. тема собственно меня забеспокоила потому, что в вызове подпрограммы, которая размещается в произвольном месте присутствует еще подпрограмма с т.н. вычисляемым переходом ADDWF PCL, в результате которого у меня вместо 0318h происходит перескок на 0018h
|
|
|
|
|
Aug 15 2018, 07:19
|
Местный
  
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081

|
Цитата(balk @ Aug 15 2018, 10:42)  добавил команду MOVF PCL и увидел в PCLATH реальный сегмент адреса Фигня какая-то. В том-то весь и фокус, что операции с програмным счётчиком никак не влияют на содержимое регистра PCLATH. Что туда запишите, то там и будет находиться до следующей перезаписи. Реальный сегмент находится в PCH. Цитата(balk @ Aug 15 2018, 10:42)  подпрограммы, которая размещается в произвольном месте Если в произвольном, то надо делать пару десятков строк дополнительного кода. В двух словах так: Сперва пишите в PCLATH старшую половину адреса метки начала таблицы переходов. Затем производите сложение PCL с переменной перехода, но с результатом в аккумулятор. Если поднят флаг переноса, инкрементируете PCLATH. Опять производите сложение с PCL, но уже результат в регистр. Если необходимо сократить код и/или повысить быстродействие (т.е. сократить количество команд), есть вариант размещать таблицу переходов строго в пределах 256-строчного сегмента адресов (чтобы при сложении PCL гарантировано не было переполнения).
|
|
|
|
|
Aug 15 2018, 08:34
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792

|
Цитата(Smen @ Aug 15 2018, 11:19)  Реальный сегмент находится в PCH. что такое PCH ? не нахожу в даташите на PIC18F2550 кстати, в отладчике среди SFR имеется PCLAT , тоже не понятно что это, ибо в даташите тоже не вижу, по разрядам вроде соответствует счетчику, но изменяется тоже только в пределах 256
|
|
|
|
|
Aug 15 2018, 09:58
|
Местный
  
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081

|
Цитата(balk @ Aug 15 2018, 12:34)  на PIC18F2550 Тогда понятно. Я говорил про 12-16 серии. Там такого не было, насколько помню. В 18 подшаманили. Цитата(balk @ Aug 15 2018, 12:34)  что такое PCH На десять строк выше Вашей цитаты.  Цитата(balk @ Aug 15 2018, 12:34)  среди SFR имеется PCLAT Это, видимо PCLATH и PCLATU вместе взятые. Разрядов-то сколько? Такая же фигня и с TMR1H и TMR1L, например. Удобнее смотреть целиком (ИМХО, разумеется).
|
|
|
|
|
Aug 17 2018, 06:44
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792

|
Smen спасибо за содействие с PCLATH я пока обошелся авантюрно- перед ADDWF PCL выставил один оператор MOVFF TOSH,PCLATH и он меня спасает, если таблица и ее вызов находятся в одном сегменте. пока для простой отладки мне достаточно. PCLAT Цитата(Smen @ Aug 15 2018, 13:58)  Это, видимо PCLATH и PCLATU вместе взятые. видимо, не так. адреса разные. а у PCL и PCLAT один и тот же адрес FF9, но разрядность у PCLAT 0x000000, хотя изменения почему происходят только в младшем байте. ну как водится со временем можно разобраться , если будет практическая необходимость.
|
|
|
|
|
Aug 17 2018, 07:46
|
Местный
  
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081

|
Цитата(balk @ Aug 17 2018, 10:44)  MOVFF TOSH,PCLATH Как-то совсем авантюрно.  Это сперва должен быть вызов ПП. А чем не устраивает обычный Код movlw hight Label movwf PCLATH Цитата(balk @ Aug 17 2018, 10:44)  видимо, не так. адреса разные Да какие адреса? Это же виртуальный регистр. Он существует только в отладчике для визуального удобства восприятия. Судя по разрядности, это PCLATU + PCLATH + PCL
|
|
|
|
|
Aug 18 2018, 09:18
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792

|
Цитата(Smen @ Aug 17 2018, 11:46)  А чем не устраивает обычный Код movlw hight Label movwf PCLATH не совсем понимаю, что кроется под hight label. мой замысел был таков от строки вызова call pprog перехожу к метке pprog ( в этом же сегменте) делаю MOFF TOSH,PCLATH - записываю в PCLATH код сегмента вызывателя, чтоб потом через ADDWF PCL и соответствующий retlw вернуться именно к вызывателю, а не к вызывателю вызывателя, находящегося в другом сегменте Цитата(Smen @ Aug 17 2018, 11:46)  Да какие адреса? Это же виртуальный регистр. это просто констатация того, что изображает отладчик
|
|
|
|
|
Aug 18 2018, 09:40
|
Частый гость
 
Группа: Свой
Сообщений: 178
Регистрация: 19-09-07
Из: М.О. г.Фрязино
Пользователь №: 30 656

|
Цитата(balk @ Aug 18 2018, 12:18)  не совсем понимаю, что кроется под 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”).
|
|
|
|
|
Aug 22 2018, 16:08
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792

|
Спасибо, друзья , за ценные замечания ! всё-таки один момент мне не стал понятнее, как по команде ADDWF PCL программа перейдет на нужную RETLW, если при выполнении ADDWF произойдет запись в PCH из PCLATH, в котором адресный байт другого сегмента. ? Цитата(Марк_Я @ Aug 18 2018, 13:40)  При выполнении команды RETLW в таблице, возврат произойдет БЕЗ ПРИВЯЗКИ К PCLATH, в том то и дело , что до RETLW не доходим, а срываемся в другой сегмент. вот собственно хребет , который всё наглядно может продемонстрировать #include <p18f2550.inc> org 0 goto start nop nop nop nop org 0x20 start call module org 0x100 table addwf PCL,1,0 retlw 0x50 retlw 0xde retlw 0x62 retlw 0xc2 retlw 0xcc retlw 0xc1 module movlw 0x06 call table nop nop END после addwf программа перепрыгивает на выделенный жирным nop , а не возвращается в module.
|
|
|
|
|
Aug 23 2018, 10:26
|
Местный
  
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081

|
Цитата(balk @ Aug 22 2018, 21:08)  после addwf программа перепрыгивает на выделенный жирным nop В PCLATH - ноль (а в реале может быть любое число, поскольку нет инициализации регистра), вот он и подставляется в старший байт адреса. Что ж тут непонятного? Вставьте перед movlw Код mowlw high table movwf PCLATH,0 И попадёте куда нужно. P.S.: Только конструкция всё-равно кривая. И для записи листинга программы на форуме пользуйтесь тэгом code (см. кнопочки вверху окна сообщения).
|
|
|
|
|
Aug 27 2018, 13:06
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792

|
спасибо! вопросы остаются, но свернём тему , чтоб по второму кругу не начинать.
|
|
|
|
|
Aug 28 2018, 12:51
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 22-11-09
Пользователь №: 53 792

|
Цитата(balk @ Aug 27 2018, 17:06)  вопросы остаются Smenв смежной теме Вы предложили вернуться к PCLATH. Кстати вопрос у меня остался такой в Вашем коде Код movlw high table movwf PCLATH,0 используются две команды, кроме того ещё задействован регистр W, который должен передавать в таблицу вектор перехода, соответственно нужно предусматривать дополнительные манипуляции с W. В коде Код movff tosh,pclath addwf pcl,1,0 не нахожу ничего такого, чем бы он уступал Вашему .
|
|
|
|
Сообщений в этой теме
balk про PCLATH вопрос Aug 14 2018, 15:35 Smen Цитата(balk @ Aug 14 2018, 19:35) в PCLAT... Aug 15 2018, 04:49  balk Цитата(Smen @ Aug 15 2018, 11:19) В том-т... Aug 15 2018, 08:25   Smen Цитата(balk @ Aug 15 2018, 13:25) даташит... Aug 15 2018, 08:33        Smen Цитата(balk @ Aug 18 2018, 14:18) что кро... Aug 20 2018, 05:17         Марк_Я Цитата(Smen @ Aug 20 2018, 08:17) 18 семе... Aug 20 2018, 06:28          Smen У ТС 18F2550. Aug 20 2018, 06:36            Smen Цитата(balk @ Aug 28 2018, 16:51) Вы пред... Aug 28 2018, 13:12             balk Цитата(Smen @ Aug 28 2018, 17:12) Команда... Aug 28 2018, 13:36              Smen Цитата(balk @ Aug 28 2018, 18:36) я имел ... Aug 29 2018, 05:26               balk спасибо Smen
приятно получить развернутый ответ с ... Aug 29 2018, 06:57                Марк_Я Цитата(balk @ Aug 29 2018, 09:57) приятно... Aug 30 2018, 05:29 Марк_Я Я в курсе. Речь шла о Вашем упоминании. Aug 20 2018, 06:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|