2. Программирование портов ввода/вывода
Программирование работы с портами ЦВВ состоит в том чтобы задать направление ввода/вывода записью нужного кода в регистр TRISx, а после этого можно выводить данные по байтам записывая их в регистр PORTx ,например, командой
MOVWF PORTx, F,
или считывая командой в режиме ввода
MOVF PORTx.
Вместо команд пересылки можно применять любые другие команды, которые производят нужную запись или чтение соответственно.
При этом следует учитывать следующие особенности:
- регистры PORTx и TRISx обычно дублированы в нескольких банках памяти данных, но не во всех;
- в режиме ввода данных чтение производится с вывода разряда ЦВВ микроконтроллера, а не из защелки PORT;
- последовательное выполнение операции вывода в порт ЦВВ и чтения из него может происходить неверно вследствие наличия задержек во внешних цепях или за счет паразитных емкостей выводов.
2.1. Инициализация портов
Под инициализацией порта понимается процесс подготовки порта к работе после включения питания микроконтроллера. Процесс инициализации несколько отличается для разных портов. Типичная процедура может быть рассмотрена на примере PORTA.
Пример: Инициализация PORTA
BCF status, rpo ; Выбрать банк О
CLRF porta ; Инициализация защелок PORTA
BSF status, rpo ; Выбрать банк 1
MOVLW 0xCF ; Значение для инициализации
; направления каналов PORTA
MOVWF trisa ; Настроить RA<3:0> как входы,
; настроить RA<5:4> как
; выходы.
2.2. Модификация состояния портов
При необходимости модификации состояния порта надо учитывать, что в режиме ввода данные регистра PORTx берутся с вывода разряда, а не из триггера – защелки. Поэтому для избежания ошибок можно сохранять значение регистра PORTx перед записью. Модификацию можно проводить с копией содержимого PORTx, а в него записывать уже модифицированное значение, которое снова сохраняется.
Подобная процедура требует дополнительного расхода памяти и дополнительных команд. Поэтому применяют часто операции записи в порт по принципу "чтение - модификация - запись". Например, команды BCF и BSF считывают значение в регистр ЦПУ, выполняют битовую операцию и записывают результат обратно в регистр. Требуется некоторая осторожность при применении подобных команд к регистрам портов ввода/вывода. Например, команда BSF PORTB,5 считывает все восемь битов PORTB в ЦПУ, изменяет состояние бита 5 и записывает результат в выходные защелки PORTB Если другой канал PORTB (например, RB0) настроен на вход то сигнал на выводе будет считан в ЦПУ и записан в защелку данных, поверх предыдущего значения Пока RB0 настроен как вход, никаких проблем не возникает. Однако, если RB0 будет позже настроен как выход, значение в защелке данных может отличаться от требуемого.
В приведенном ниже примере показан эффект последовательного выполнения команд "чтение - модификация - запись" с регистром порта ввода/вывода
Пример. Эффект выполнения команд "чтение - модификация - запись"
Начальные установки порта: PORTB<7:4> - входы, PORTB<3:0> - выходы.
Выводы RB7:RB6 являются открытыми, т.е. не имеют верхнего транзистора в буферном усилителе, а к ним подключены внешние подтягивающие резисторы. Другие цепи схемы к выводам не подключены.
Защелка PORTB Выводы PORTB
BCF STATUS, RPO ; Банк 0
BCF PORTB, 7 ; 01pp pppp 11pp pppp
BCF PORTB, 6 ; 10pp pppp 11pp pppp
BSF STATUS, RPO ; Банк 1
BCF TRISB, 7 ;10pp pppp 11pp pppp
BCF TRISB, 6 ; 10pp pppp 10pp pppp
Обратите внимание. Возможно пользователь ожидал, что после выполнения программы на выходах PORTB будет значение 00pp pppp. Однако 2-я команда ВCF установила в '1' RB7.