Особенности сопоставления имен и чисел. Прямая и косвенная адресацияРанее мы рассматривали регистры специального назначения, располагающихся в нулевом банке, но в дальнейшем мы будем не только рассматривать, но и практически использовать регистры специального назначения, расположенные в первом банке памяти, например, TrisA (адрес h85) и TrisB (адрес h86).
Регистрам специального назначения, расположенных в первом банке, назначаются адреса на h80 меньше.
неправильно
|
правильно
|
TrisA EQU h85
|
TrisA EQU h05
|
TrisB EQU h86
|
TrisB EQU h06
|
Этому есть достаточно простое объяснение. Мы знаем, что команда включает слово команды и регистр, указанный в команде. Эту конструкцию мы называем командной строчкой. Командная строчка, таким образом, имеет ширину 14 бит. Выполняя командную строчку, МК для определения адреса регистра использует первые семь бит из команды (берутся из адреса регистра, который указан в команде) и два бита выбора банка (берутся из регистра STATUS – это биты RP1 и RP0). Таким образом получается 9-битный адрес. Проиллюстрируем этот механизм на примере адресации регистра TrisA:
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RP1
|
RP0
|
Первые семь бит регистра, указанного в команде (TrisA)
|
0
|
1
|
0
|
0
|
0
|
0
|
1
|
0
|
1
|
Теперь посмотрим, что у нас получилось: 010000101 = h85.
С этой "заморочкой" разработчиков нужно согласиться и принципом "минус 80" руководствоваться всегда. Это нужно запомнить, в свою очередь мы будем об этом напоминать. На будущее обращаю ваше внимание, регистры TrisA и TrisB получат схожие адреса, что и регистры PortA (адрес h05) и PortB (адрес h06), это также не должно смущать.
В примере выше мы рассмотрели механизм работы "прямой адресации". Существует и "косвенная адресация", когда обращение к регистрам осуществляется через один и тот же регистр INDF (адрес h00). Для того, чтобы обратиться через этот регистр к какому либо другому регистру (например, PortA), необходимо адрес регистра PortA (число h05) прописать в регистр FSR (адрес h04).
Как определяется 9-битный адрес в команде при работе с косвенной адресацией? В этом случае берутся первые восемь бит из команды и берется бит IRP (7) из регистра STATUS. Если бит IRP установлен в ноль, то будут адресованы регистры с нулевой и первой страниц памяти. Если бит IRP установлен в единицу, то будут адресованы регистры со второй и третьей страниц памяти. PIC16F84A имеет только две страницы памяти, соответственно, использовать этот бит не имеет смысла.
Рассмотрим сегмент очистки 15-ти регистров (диапазон адресов h20 – h2F) с использованием косвенной адресации:
bcf STATUS,IRP ; установить банки 0 и 1
movlw h20 ; указываем первый очищаемый регистр
movwf FSR
m1 clrf INDF ; очистить регистр
incf FSR,F ; увеличить адрес
btfss FSR,4 ; проверка
goto m1 ; продолжить очистку
...
Сегмент достаточно прокомментирован, однако требует, на наш взгляд, сделать акцент на команде btfss FSR,4 . Используя конвертер BinHexDec проследим инкрементирование числа h20 до h2F. Если сделать еще один шаг инкрементирования, то 4-й бит в новом числе (h30) установится в единицу. Используя этот факт, мы выходим из сегмента очистки.
Следует отметить, что при использовании прописанного файла *.INC , MPLAB в процессе компиляции будет делать замечание о некорректных адресах регистров специального назначения расположенных в первом банке. Это объясняется тем, что регистры специального назначения из первого банка в файле файл *.INC описаны в традиционном виде, т.е. их адрес будет на h80 больше. При желании файл *.INC можно самим подкорректировать вручную.
Первое знакомство с прямой и косвенной адресаций достаточно ограничить прочтением этого раздела. Большая часть примеров основана на механизме прямой адресации. О сути механизма прямой адресации можно и не знать, однако, могут быть примеры с использованием механизма косвенной адресации, что потребует осмысления этого раздела.
|