Порты ввода-вывода предназначены для связи микроконтроллера с различными объектами и могут реализовывать различные алгоритмы обмена данными: 0 асинхронный программный обмен, 0 синхронный обмен, 0 ввод-вывод с сигналами квитирования.
Обмен данными между портами и объектами обеспечивается специальными подпрограммами - драйверами, создаваемыми индивидуально для каждого объекта.
Асинхронный обмен
В режиме асинхронного программного обмена ввод и вывод данных производится по программе в моменты выполнения инструкций ввода и вывода данных. Предполагается, что объект всегда готов к обмену: при вводе - данные в момент выполнения инструкции in присутствуют на линиях порта, при выводе - данные будут прочитаны с линий порта до следующего вывода.
Например, микроконтроллер ATmega163 осуществляет асинхронный вывод данных при выполнении фрагмента программы:
.equporta = $1B ;
.equ ddra = $1А ;
.cseg
ldi r1 6,$FF ;запись $FF в r1 6
out ddra, r16 включение порта А на вывод
out porta, r0 ;вывод данных из регистра r0 в порт A.
Время выполнения команды вывода равно двум периодам тактового сигнала.
Тот же микроконтроллер в течении двух тактов введет данные с линий порта при выполнении фрагмента программы:
.equ pina = $19 ;
.cseg
in r0, pina ; ввод данных из порта pina в регистр r0.
По адресу $19 в пространстве ввода-вывода микроконтроллера размещен регистр pina, с входных линий которого и будут взяты данные во время выполнения инструкции.
Симплексный обмен
Симплексным считается однонаправленный обмен данными. Такой обмен обычно является синхронным. В этом случае каждое изменение данных на линиях порта сопровождается сигналом синхронизации (стробом). Строб генерируется источником данных и предназначается для задания момента записи данных в регистр приемника.
При выводе данных сигнал строба должен сформировать микроконтроллер, используя для этого специальные линии шины управления или отдельные биты портов ввода-вывода.
На рис. 9.2 показан вариант соединения микроконтроллера ATmega163 c посимвольным принтером, имеющим 8-битный вход для приема данных DATA, выход сигнала готовности READY и вход стробирования #STB. Активным на входе стробирования является сигнал низкого уровня.
Порт PORTA микроконтроллера и бит PB6 порта PORTB программируются на вывод данных, бит PB2 порта PORTB на ввод. Подпрограмма вывода должна:
0 осуществить проверку готовности принтера (чтение сигнала готовности
принтера READY и его анализ),
0 при обнаружении сигнала READY=1 вывести данные в порт PORT А,
0 подтвердить вывод данных выводом сигнала стробирования #STB=0 для записи данных в принтер.
Если принтер не готов к обмену микроконтроллер через заданный интервал времени повторяет операцию.
Рис. 9.2. Подключение принтера к микроконтроллеру
Режим синхронного ввода позволяет точно задать момент считывания данных с объекта. В этом режиме сигнал стробирования, подтверждающий готовность данных, поступает с объекта на микроконтроллер. При появлении строба микроконтроллер должен осуществить ввод данных с порта.
Полудуплексный обмен
Полудуплексным считается двунаправленный синхронный обмен, при котором в любой момент времени передача данных может производиться только в одном направлении. Направление передачи данных порта меняется в процессе работы в зависимости от решаемой в текущий момент задачи. На рис. 9.3 изображен вариант соединения микроконтроллера ATmega163 с объектом для обмена данными в полудуплексном режиме.
В схеме на рис. 9.3 передача данных в параллельном формате осуществляется по линиям порта PORTA. Для выдачи и приема четырех сигналов управления обменом (сигналы квитирования): строб ввода #STB IN (Strobe Input), строб вывода #STB OUT (Strobe Out), подтверждение ввода #ACK IN (Acknowledge Input) и подтверждение вывода #ACK OUT (Acknowledge Out), использованы две линии порта PORTB и входы запросов на прерывания INT0 и INT1.
При поступлении сигнала #STB IN = 0 контроллер должен выставить сигнал подтверждения #ACK IN = 0 и осуществить запись во входной регистр порта PORTA.. При низком уровне сигнала ASK IN объекту запрещается формировать новый сигнал #STB IN. По окончании записи контроллер снимает сигнал #ACK IN, разрешая повторную передачу данных.
Работа микроконтроллера в режиме вывода аналогична. Микроконтроллер выводит данные в порт PORTA, подтверждая вывод сигналом #STB OUT = 0. Объект формирует сигнал подтверждения #ACK OUT = 0, сообщая контроллеру о готовности к приему данных. При снятии сигнала #ACK OUT контроллер должен снять сигнал #STB OUT и может вновь перейти к выводу данных.
Одновременная передача данных в двух направлениях при полудуплексном обмене невозможна.
Дуплексный обмен
Дуплексным считается двунаправленный синхронный обмен, при котором в любой момент времени возможна передача данных в двух направлениях. В этом случае для передачи данных в каждом направлении выделяется свой однонаправленный порт.
На рис. 9.4 изображен вариант соединения микроконтроллера ATmega 163 с объектом для обмена данными в дуплексном режиме.
Рис. 9.3. Подключение микроконтроллера при полудуплексном обмене
Рис. 9.4. Подключение микроконтроллера при дуплексном обмене
В схеме на рис. 9.4 порт PORTA работает на ввод данных, порт PORTB - на вывод, а линии PC0 и РС1 порта PORTC использованы для вывода сигналов квитирования #ACK IN и #ACK OUT. Для ввода сигналов квитирования от объекта #STB IN и #ACK OUT использованы входы запросов на прерывания INT0 и INT1. При таком подключении задача ввода данных в микроконтроллер получает больший приоритет, чем задача вывода.