Алгоритмы обмена данными

 

Порты ввода-вывода предназначены для связи микроконтроллера с различными объектами и могут реализовывать различные алгоритмы обмена данными: 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. При таком подключении задача ввода данных в микроконтроллер получает больший приоритет, чем задача вывода.