Иногда может потребоваться изменить состояние счетчика команд из программы. Для этого младший байт PC напрямую доступен через регистр специального назначения PCL (Program Counter Low). А для изменения всех 13 бит требуется дополнительный регистр. Регистр-защелка старшего байта PCLATH не является в действительности старшим байтом PC, а служит в качестве буфера. Изменение содержимого регистра PCLATH не влияет на старший байт счетчика команд, однако одновременно с записью в регистр PCL новое значение PCLATH загружается в старший байт 13-битного счетчика команд. Таким образом, как показано на Рис. 4.8, все 13 бит счетчика команд обновляются одновременно. Запомните эту особенность, она потребуется вам при ответе на Вопрос для самопроверки 4.2.
Рис. 4.8. Изменение всех 13 битов счетчика команд при записи в регистр PCL
Для манипулирования счетчиком команд используются следующие регистры:
∙ PCL (h’02’)
Регистр PCL физически является младшим байтом счетчика команд. Этот регистр доступен как для чтения, так и для записи.
∙ PCLATH (h’0A’)
Регистр PCLATH является регистром-защелкой для хранения данных, которые должны быть загружены в старший байт счетчика команд. Загрузка старшего байта происходит при записи в регистр PCL, что обеспечивает одновременное обновление всех 13 бит счетчика.
Не забывайте, что регистр PCLATH используется только в качестве буфера, поэтому значение, считанное из него, не будет соответствовать текущему состоянию старшего байта счетчика команд[75].
Параллельные порты ввода/вывода
Способность одновременно изменять или контролировать состояние нескольких цифровых линий представляет собой воистину универсальную возможность систем на базе микроконтроллеров. В зависимости от типа корпуса микроконтроллеры среднего уровня имеют от 4 до 52 таких линий ввода/вывода. К примеру, в 40-выводном микроконтроллере PIC16F877 имеется в общей сложности 33 линии ввода/вывода.
Микроконтроллер PIC16F84 имеет 13 линий ввода/вывода, разделенных на два порта. ПортА имеет 5 линий ввода/вывода, отображенных на адресное пространство памяти данных по адресу h’05’. Остальные 8 линий относятся к порту В, размещенному по адресу h’06’. Эти порты можно считать своеобразными «окнами» в памяти данных, поскольку значения, записываемые в регистры с адресами h’05’ и h’06’, появляются на выводах микроконтроллера RA4…RA0 и RB7…RB0 соответственно (см. Рис. 10.2 на стр. 304). Однако физически и логически эти порты гораздо сложнее, чем обычные внутренние регистры. Мы еще вернемся к этому вопросу в главе 11, пока же скажем только, что линия порта может быть сконфигурирована как выход (при этом ЦПУ может управлять состоянием соответствующего вывода) или как вход (при этом ЦПУ может считывать состояние данного вывода). Для этого предназначены регистры направления данных TRISA и TRISB (для порта А и В соответственно), расположенные по адресам h’85’ и h’86’. Название TRIS образовано от слова TRIState[76] (см. Рис. 11.3 на стр. 333). Эти регистры находятся в 1-м банке, поскольку они обычно конфигурируются в начале программы и впоследствии не изменяются.
В качестве примера рассмотрим следующую ситуацию. Предположим, что нам необходимо сделать выводы RB[6:0] порта В входами, а вывод RB7 — выходом. Тогда код для конфигурирования порта будет выглядеть следующим образом:
bsf 5,3; Переходим к 1-му банку
movlw h’7F’; Двоичному числу 0111 1111 соответствует:
movwf h ’86’; RB7 — выход, RB6…0 — входы
bcf 5,3; Возвращаемся к 0-му банку
Несмотря на то что этот код совершенно корректен и благодаря комментариям его назначение в общем-то понятно, он все же не очень удобен для чтения. Второй вариант того же куска кода имеет куда более дружественный вид, но с точки зрения ассемблера совершенно идентичен первому (см. стр. 70).
STATUS equ 03; Регистр STATUS расположен по адресу h’03’
RP0 equ 05; Бит переключения банков — 5-й
TRISB equ h’86’; Регистр направления расположен по адресу h’86’
PORTB equ 06; Регистр данных порта расположен по адресу h’06
bsf STATUS,RP0; Переходим к 1-му банку
movlw b’ 01111111’; Двоичному числу 0111 1111 соответствует:
movwf TRISB ; RB7 — выход, RB6…0 — входы
bcf STATUS,RP0; Возвращаемся к 0-му банку
75
В моделях старшего семейства PIC18XXXX при чтении регистра PCLATH возвращается значение старшего байта счетчика команд.