С использованием параллельных портов
Данные, представленные в виде двоичных логических сигналов, являются одним из типов данных, наиболее часто используемых МК для обмена информацией с внешними объектами. Поэтому практически каждый МК имеет линии ввода-вывода таких данных, подключенные к внешним выводам. С помощью этих линий МК взаимодействует с внешними датчиками и управляет исполнительными устройствами.
Помимо обмена логическими данными через одиночные линии в МК используется и широко распространенный параллельный обмен информацией. Для этого одиночные линии ввода-вывода объединяются в параллельные восьмиразрядные порты ввода-вывода, подключенные к системной магистрали МК.
МК серии AVR в зависимости от модели имеют в своем составе от одного до семи параллельных портов ввода-вывода. Каждый разряд порта подсоединен к одному из выводов (ножек) микросхемы.
Порты являются двунаправленными, т.е. любую линию каждого порта можно независимо настроить как на ввод, так и на вывод. Каждый порт имеет в своем составе три расположенных в пространстве ввода-вывода регистра: регистр хранения выводимых данных PORTx, регистр направления данных DDRx и регистр входных данных PINx. Регистр входных данных PINx обеспечивает только возможность чтения, фактически он считывает информацию напрямую с вывода МК. Регистры данных PORTx и направления данных DDRx обеспечивают возможность и чтения и записи.
В том случае, если линия настроена на ввод, то для повышения помехоустойчивости имеется возможность подключения к линии ввода внутренних резисторов, подтягивающих ее к напряжению питания.
Содержимое регистров направления DDRx (Data Direct Register) определяет направление передачи данных по каждой линии порта. Если бит регистра DDRx установлен в 0, то соответствующая ему линия порта настраивается на ввод, в противном случае – линия используется для вывода цифровой информации.
Если линия порта настроена на вывод данных, то ее состояние будет определяться содержимым соответствующего разряда регистра PORTx.
Если же линия порта настроена на ввод данных, то установка в 1 соответствующего бита в регистре PORTx приведет к подключению к этой линии подтягивающего резистора.
Состояние линий порта, в зависимости от комбинации содержимого разрядов регистров DDRx и PORTx, приведено в табл. 3.1.
Таблица 3.1
DDRx | PORTx | Вх./Вых. | Состояние линии |
Вход | Третье состояние (Hi-Z) | ||
Вход | Режим входа с подтягивающим резистором | ||
Выход | Вывод логического нуля | ||
Выход | Вывод логической единицы |
Упрощенная схема одного разряда любого порта PORTхn представлена на рис. 3.1.
Рис. 3.1. Упрощенная схема одного разряда порта |
Если разряд регистра направления DDRxn установлен в 1, то ключ S2 замкнут, разряд PORTхn порта настроен на вывод данных и состояние порта передается на ножку МК Pхn.
Для настройки заданного разряда порта PORTхn на ввод данных соответствующий разряд регистра направления DDRxn должен быть сброшен в 0. Это приводит к размыканию ключа S2 и разряд порта PORTхn отключается от вывода Pхn и его состояние не искажает считываемых данных.
Для считывания входных данных используется команда IN, при выполнении которой формируется импульс чтения, замыкающий ключ S1. При этом вводимые данные не сохраняются в разрядах порта, а считываются непосредственно с контактов Pxn в шину данных. Если разряд DDRxn = 0 и разряд PORTxn = 1, то на выходе элемента «И-НЕ» устанавливается уровень логической 1, замыкающий ключ S3, с помощью которого подтягивающий резистор R подключается к внешнему выводу Pxn. Для всех остальных комбинаций на выходе элемента «И-НЕ» устанавливается уровень логического 0 и резистор будет отключен.
Если разряд DDRxn = 0 и разряд PORTxn = 0, то вывод порта Pxn находится в отключенном состоянии (все три ключа разомкнуты).
После сброса МК или подачи напряжения питания, начальное значение всех регистров направления DDRx равно 0х00 и по умолчанию все порты настроены на ввод, а начальное значение любого регистра PORTx также равно 0х00 и по умолчанию все разряды портов будут находиться в состоянии высокого импеданса.
В заключение раздела рассмотрим несколько примеров.
Пример 1.
DDRA = 0xFF; //настройка всех выводов порта A как выходов
PORTA = 0x0F; //вывод в разряды порта A значений 0b00001111
Пример 2.
Unsigned char a;
DDRD = 0; //настройка всех выводов порта D как входов
i = PIND; //прочитать 8 выводов порта D в переменную i
Пример 3.
// настроить разряды 1, 3, 5 порта C на выход
DDRC = DDRC|((1 << 1)|(1 << 3)|(1 << 5));
// вывести в разряды 1, 3, 5 порта C логические 1
PORTC = PORTC |((1 << 1)|(1 << 3)|(1 << 5));
Лабораторная работа № 1
Цель работы. Программирование процедур вывода информации на семисементный индикатор с использованием параллельного порта.
Перед выполнением работы установите тумблеры конфигурации стенда в состояние, показанное на рис. 3.4.