Avr портами микроконтроллеров называют

Порты микроконтроллера — это устройства ввода/вывода, позволяющие микроконтроллеру передавать или принимать данные. Стандартный порт микроконтроллера AVR имеет восемь разрядов данных, которые могут передаваться или приниматься параллельно. Каждому разряду (или биту) соответствует вывод (ножка) микроконтроллера. Ножки микроконтроллера также называют пинами. Для обозначения портов используются латинские буквы А, В, С и т.д. Количество портов ввода/вывода варьируется в зависимости от модели микроконтроллера.

Любой порт микроконтроллера можно сконфигурировать как вход или как выход. Для того чтобы это сделать, следует записать в соответствующий порту регистр DDRx необходимое значение. Кроме того, как вход или выход можно сконфигурировать отдельно любой вывод (пин) порта. В любом случае, хотите вы сконфигурировать весь порт или отдельный вывод, вам необходимо будет работать с ригистрами DDRx.

DDRx — регистр направления передачи данных. Этот регистр определяет, является тот или иной вывод порта входом или выходом. Если некоторый разряд регистра DDRx содержит логическую единицу, то соответствующий вывод порта сконфигурирован как выход, в противном случае — как вход. Буква x в данном случае должна обозначать имя порта, с которым вы работаете. Таким образом, для порта A это будет регистр DDRA, для порта B — регистр DDRB и т. д.

Используя AVR GCC, записать в необходимый регистр то или иное значение можно одним из следующих способов.

Для всего порта сразу.

Все выводы порта D будут сконфигурированы как выходы.

0xff — шестнадцатиричное представление числа ff, где 0x является префиксом, используемым для записи шестнадцатиричных чисел. В десятичном представлении это будет число 255, а в двоичном виде оно будет выглядеть как 11111111. То есть во всех битах регистра DDRD будут записаны логические единицы.

В AVR GCC для представления двоичных чисел используется префикс 0b. Таким образом, число 11111111 должно представляться в программе как 0b11111111. Мы можем записать предыдущую команду в более читабельном виде.

Хотя такая запись и выглядит более наглядной, при конфигурировании портов принято использовать шестнадцатиричное представление чисел.

Для того чтобы сконфигурировать все выводы порта D как входы, следует записать во все биты регистра DDRD логические нули.

В регистр DDRD можно записать и другие числа. Например:

0xb3 — шестнадцатиричное представление числа 179. В двоичном виде оно будет выглядеть как 10110011. То есть часть выводов порта D будет сконфигурирована как выходы, а часть — как входы.

PD0 — 1 (выход)
PD1 — 1 (выход)
PD2 — 0 (вход)
PD3 — 0 (вход)
PD4 — 1 (выход)
PD5 — 1 (выход)
PD6 — 0 (вход)
PD7 — 1 (выход)

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

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

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

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

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

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

При инверсии мы получаем вместо нулей единички, а вместо единичек — нули. Эта логическая операция иначе называется операцией НЕ (английское название NOT).

Таким образом, при побитном инвертировании 00000100 мы получаем 11111011. (Подробнее о работе с числами в микроконтроллере см. во врезке ниже.)

Получившееся число с помощью операции побитного логического умножения & умножается на число, хранящееся в регистре DDRD, и результат записывается в регистр DDRD.

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

То есть сдвинутая нами влево на две позиции единичка превращается при инвертировании в ноль и умножается на соответствующий бит, хранящийся в регистре DDRD. При умножении на ноль мы получаем ноль. Таким образом, бит PD2 становится равным нулю.

Кроме логических операций И, ИЛИ, НЕ существует также операция "исключающее ИЛИ" (английское название XOR). Она обозначается значком ^.

При исключающем ИЛИ значение бита, к которому "прибавляется" единичка, изменяется на противоположное.

Например, 110011 ^ 11010 = 101001.

Следует добавить, что работа с числами в 8-битном микроконтроллере проходит с использованием 8-битных регистров. Перед вычислениями аргумент помещается в один из специальных регистров, с которыми напрямую может работать арифметико-логическое устройство (АЛУ). Например, перед выполнением команды DDRD &=

(1 аргумент помещается во вспомогательный регистр микроконтроллера. Содержимое такого регистра будет выглядеть как 11111011 .
После этого осуществляется операция побитного умножения, что дает во втором бите регистра DDRD значение 0 .

Спасибо участникам форума Олегу (oleg) и VCOM за появление этого комментария и корректирование статьи.

После того как направление передачи данных у порта сконфигурировано, можно присвоить порту значение, которое будет храниться в соответствующем регистре PORTx .
PORTx — регистр порта, где x обозначает имя порта.

Если вывод сконфигурирован как выход, то единичка в соответствующем бите регистра PORTx формирует на выводе сигнал высокого уровня, а ноль — сигнал низкого уровня.

Если же вывод сконфигурирован как вход, то единичка в соответствующем бите регистра PORTx подключает к выводу внутренний подтягивающий pull-up резистор, который обеспечивает высокий уровень на входе при отсутствии внешнего сигнала.

Установить "1" на всех выводах порта D можно следующим образом.

А установить "0" на всех выводах порта D можно так.

К каждому биту регистров PORTx можно обращаться и по отдельности так же, как в случае с регистрами DDRx.

установит "1" (сигнал высокого уровня) на выводе PD3.

установит "0" (сигнал низкого уровня) на выводе PD4.

В AVR GCC сдвиг можно осуществлять и с помощью функции _BV() , которая выполняет поразрядный сдвиг и вставляет результат в компилируемый код.

В случае использования функции _BV() две предыдущие команды будут выглядеть следующим образом.

PORTD |= _BV(PD3); // установить "1" на линии 3 порта D

_BV(PD4); // установить "0" на линии 4 порта D

В микроконтроллерах AVR каждому параллельному порту ввода/вывода поставлен в соответствие также регистр PINx .
PINx является регистром выводов порта и в отличие от регистров DDRx и PORTx доступен только для чтения. PINx позволяет считывать входные данные порта на внутреннюю шину микроконтроллера. Об этом регистре мы поговорим чуть позже.

Теперь попробуем написать несколько простых программ для лучшего понимания принципа работы с портами микроконтроллера.

Первые наши программы будут состоять всего из нескольких строк, и в их задачу будет входить зажигание светодиода, подключенного к микроконтроллеру.

Подключить светодиод к микроконтроллеру можно различными способами.

Рисунок 1Рисунок 2

В зависимости от способа подключения светодиод будет загораться либо от сигнала высокого уровня, подаваемого на вывод PD1 микроконтроллера, как в первом случае, либо от сигнала низкого уровня в случае подключения, изображенного на втором рисунке.

Теперь попробуем мигнуть светодиодом, подключенным так, как это изображено на левом рисунке. Для этого используем функцию задержки _delay_ms().

Функция _delay_ms() формирует задержку в зависимости от передаваемого ей аргумента, выраженного в миллисекундах (в одной секунде 1000 миллисекунд). Максимальная задержка может достигать 262.14 миллисекунд. Если пользователь передаст функции значение более 262.14, то произойдет автоматическое уменьшение разрешения до 1/10 миллисекунды, что обеспечивает задержки до 6.5535 секунд. (О формировании более длительных задержек можно прочитать в статье "Циклы в языке Си. Формирование задержки".)

Итак, продолжим знакомство с микроконтроллерами!

Сегодня мы рассмотрим такую важную тему как порты ввода/вывода. С ними мы столкнулись уже в предыдущем уроке, когда зажигали светодиод. Взаимодействие микроконтроллера с внешними устройствами, происходит именно благодаря портам ввода/вывода (Порты I/O(Input/Output)).

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

I/O порт микроконтроллера AVR в программном виде представляет из себя 3 регистра, которые непосредственно отвечают за его работу. Так как микроконтроллеры AVR 8 разрядные, ножки контроллера для удобства были сгруппированы в порты по 8 штук.

То есть, ножки контроллера PB0-PB7 являются портом B микроконтроллера AtMega8. Точно так же с выводами PD0-PD7, которые являются портом D.

Каждой ножке соответствует бит в управляющих регистрах. То есть ножке под номером 4 (Например PB4) соответствует 4 бит в регистрах PORTB,DDRB,PINB.

Каждая ножка порта может быть как портом ввода, так и портом вывода. То есть, мы можем либо управлять чем либо (например зажигать светодиод), либо принимать данные с чего либо (например обрабатывать нажатие кнопки).

За работу порта отвечает 3 регистра:

Каждый из данных регистров 8 разрядный. То есть, каждый бит данного регистра регулирует работу одной ножки контроллера. Рассмотрим каждый из данных регистров подробнее.

Рассматривать будем на примере порта B микроконтроллера AtMega8.

DDRB:

Каждый бит регистра DDRB отвечает за режим работы соответствующей ножки (PB0-PB7). Записав 0 в соответствующий бит, мы настраиваем соответствующую ножку в режим входа. То есть, теперь мы сможем считывать с неё входящие с внешних устройств данные. Записав в соответствующий бит 1 мы установим ножку в режим вывода, что позволит нам управлять чем либо (Например зажигать светодиод).

Пример кода на C(Настройка ножки PD4 на вывод):

Итак, продолжим знакомство с микроконтроллерами!

Сегодня мы рассмотрим такую важную тему как порты ввода/вывода. С ними мы столкнулись уже в предыдущем уроке, когда зажигали светодиод. Взаимодействие микроконтроллера с внешними устройствами, происходит именно благодаря портам ввода/вывода (Порты I/O(Input/Output)).

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

I/O порт микроконтроллера AVR в программном виде представляет из себя 3 регистра, которые непосредственно отвечают за его работу. Так как микроконтроллеры AVR 8 разрядные, ножки контроллера для удобства были сгруппированы в порты по 8 штук.

То есть, ножки контроллера PB0-PB7 являются портом B микроконтроллера AtMega8. Точно так же с выводами PD0-PD7, которые являются портом D.

Каждой ножке соответствует бит в управляющих регистрах. То есть ножке под номером 4 (Например PB4) соответствует 4 бит в регистрах PORTB,DDRB,PINB.

Каждая ножка порта может быть как портом ввода, так и портом вывода. То есть, мы можем либо управлять чем либо (например зажигать светодиод), либо принимать данные с чего либо (например обрабатывать нажатие кнопки).

За работу порта отвечает 3 регистра:

Каждый из данных регистров 8 разрядный. То есть, каждый бит данного регистра регулирует работу одной ножки контроллера. Рассмотрим каждый из данных регистров подробнее.

Рассматривать будем на примере порта B микроконтроллера AtMega8.

DDRB:

Каждый бит регистра DDRB отвечает за режим работы соответствующей ножки (PB0-PB7). Записав 0 в соответствующий бит, мы настраиваем соответствующую ножку в режим входа. То есть, теперь мы сможем считывать с неё входящие с внешних устройств данные. Записав в соответствующий бит 1 мы установим ножку в режим вывода, что позволит нам управлять чем либо (Например зажигать светодиод).

Пример кода на C(Настройка ножки PD4 на вывод):

Оцените статью
Много толка
Добавить комментарий