Среда, 30 мая 2012 10:54

Вычисляемый переход .

Written by
Rate this item
(0 votes)

Для чтения памяти программ  применяют,   в том числе и вычисляемый переход. Суть его заключается в том , что при выполнении команды  ADDWF PCL  происходит сложение содержимого регистров W и младшего регистра счетчика команд (PC). В результате программа «перескакивает» на выполнения команды, расположенной по адресу  PC+W.

Если после команды ADDWF PCL   расположить группу команд RETLW (как ниже в примере), то  в результате произойдет  «прыжок» на одну из команд, в пределах  256-байтного блока. Обычно  данный алгоритм применяется в подпрограммах табличной перекодировки, где таблица позволяет сопоставить одному 8-битному числу другое произвольное 8-битное число.

В качестве примера рассмотрим ПП перевода десятичного числа в семисегметный код:

;----------------------------------------------------------------------------
; ПП перевода десятичного числа в семисегментный код.
;----------------------------------------------------------------------------
PER_10_7   mullw               .2 ; Умножаем W на 2.
           movf           PRODL,0 ; Результат умножения в W
           addwf              PCL ; Увеличение PCL на величину содержимого W.
           retlw      b'00111111' ; Символ "0".
           retlw      b'00000110' ; Символ "1".
           retlw      b'01011011' ; Символ "2".
           retlw      b'01001111' ; Символ "3".
           retlw      b'01100110' ; Символ "4".
           retlw      b'01101101' ; Символ "5".
           retlw      b'01111101' ; Символ "6".
           retlw      b'00000111' ; Символ "7".
           retlw      b'01111111' ; Символ "8".
           retlw      b'01101111' ; Символ "9".
           retlw      b'00000000' ; Символ потушен 10
           retlw      b'00000001' ; Символ прочерк  (верхний)  11
           retlw      b'00001000' ; Символ прочерк (нижний) 12
           retlw      b'01000000' ; Символ прочерк  (средний) 13     


Те кто имеет опыт программирования на микроконтроллерах 16 серии и применяли данной метод заметили разницу  в коде программы. Дело в том, что в микроконтроллерах 18 серии память программ 16 разрядная и соответственно "прыжок" должен быть "четным"  (0,2,4,6...128) и максимальной длиной 128  , при условии размещения начала таблицы на границе 256-байтного блока.

В данном примере  до вызова ПП было записано некое 8-битное число в регистр  "W"   (0-128), это число умножается на 2, результат умножения из младшего  регистра PRODL (младший регистр результата умножения)  снова копируется в W, тем самым производится коррекция  "прыжка" при выполнении команды ADDWF PCL.

При разработки приложений необходимо  что бы таблица находилась в пределах 256-байтного блока, т.е. не было переполнения регистра PCL при "прыжке" на одну из команд ADDWF.  Что бы избежать данного недоразумения нужно после компиляции приложения в MPLAB посмотреть как расположилась таблица с данными.  И в случае "неудачного" расположения  сместить таблицу ниже. Для этого можно применить директиву ORG (org     XXXXh), вставив ее перед таблицей данных.

Кроме этого можно сделать программную  защиту от максимального значения регистра W.

На пример как сделано в этой подпрограмме.

Read 1535 times

Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru