Работа с портами ввода/вывода



Порты ввода/вывода пожалуй важнейшая часть микроконтроллера, без неё всё остальное просто бессмысленно. Сколько бы не было у контроллера памяти, периферии, какой бы высокой не была тактовая частота - это всё не имеет значения если он не может взаимодействовать с внешним миром. А взаимодействие это осуществляется через эти самые порты ввода/вывода.

Каждому порту в МК AVR соответствуют минимум 3 регистра:

- DDRx – регистр направления данных (х – буква соответствующего порта, например DDRB – регистр направления данных Порта В). Этот регистр определяет, как должен быть сконфигурирован вывод порта – как вход или как выход. Если в бит этого порта записать 1, то соответствующий вывод порта будет работать как выход; если записать 0, то соответствующий вывод порта будет работать как вход. Например, если в регистре DDRB записано число 01000011, то это значит, что 0-й, 1-й, и 6-й выводы Порта В сконфигурированы как выходы, а остальные как входы.

- PORTx – выходной регистр порта х (например, PORTВ – выходной регистр Порта В). В биты этого регистра записывают те значения, которые хотят получить на выводах порта, при условии, что выводы сконфигурированы как выходы.

Если вывод сконфигурирован как вход, то при записи в соответствующий бит регистра PORTx 1 этот вывод становится «входом с подтяжкой», т.е. этот вывод через резистор примерно 100…150 кОм, находящийся внутри МК, подключается («подтягивается») к напряжению питания МК. Т.о., при отсутствии сигнала на этом входе будет уровень логической 1.

- PINx – выводы порта х (например, PINВ – выводы Порта В). Этот регистр содержит значения логических уровней, которые к настоящему времени присутствуют на физических (т.е. реальных) выводах порта. Этот регистр доступен только для чтения.

Рис. 1.5. Моделирование работы регистров портов ввода/вывода эмулятора AVR Studio 4

Побитовый доступ к регистрам ввода/вывода осуществляется путем добавления битов после имени регистра. Например, DDRB.1=0; PORTB.3=1; a=PINB.5.

Запись DDRB = 0xFF; означает, что все выводы порта B будут сконфигурированы на выход. Префикс 0x означает, что в данной записи используется шеснадцатиричная система счисления (иногда используют букву h – от англ. Hexadecimal). Для обозначения двоичной системы счисления используется префикс b (От англ. binary). Тогда вышеуказанная запись будет иметь вид – DDRB = 0b11111111;

Каждый бит регистров DDRx может быть установлен отдельно. Например, чтобы сконфигурировать отдельно вывод PD2 как выход, нам необходимо в соответствующий бит регистра DDRD записать 1. Для этого применяют следующую конструкцию.

DDRD |= 1<<2;

1<<2 - осуществляет сдвиг единички влево на 2 бита, то есть справа добавляются два нулевых бита и получается 100, а знак "|", стоящий перед знаком присваивания "=", осуществляет операцию побитного логического сложения.

При логическом сложении 0+0=0, 0+1=1, 1+1=1. Операцию логического сложения по-другому называют операцией ИЛИ (английское название OR).

Таким образом, к битам, хранящимся в регистре DDRD, прибавляется двоичное 100, представленное в 8-битном регистре микроконтроллера как 00000100, и результат записывается обратно в регистр DDRD.

Чтобы сконфигурировать отдельно вывод PD2 как вход, нам необходимо в соответствующий бит регистра DDRD записать 0. Для этого применяют следующую конструкцию.

DDRD &= ~(1<<2);

В данном случае результат сдвига единицы на две позиции влево инвертируется с помощью операции побитного инвертирования, обозначаемой значком "~".

Например, запись PORTC &= ~(1<<2); будет аналогична записи PORTC = PORTC & ~(1<<2); Порядок выполнения операций следующий:

Пусть в порт С записано число PORTC = 0 b 00011111;

1: (1<<2) – сдвиг единицы влево на две позиции = 00000100;

2: ~(1<<2) – инверсия предыдущего результата = 11111011;

3: PORTC &= ~(1<<2); – конъюнкция предыдущего значения, записанного в порт С, и полученного результата, то есть (00011111) & (11111011) = 00011011;


Дата добавления: 2018-11-24; просмотров: 331; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!