Управление портами микроконтроллеров AVR с помощью программ на языке C (Си)
Порты ввода-вывода микроконтроллеров AVR позволяют подключать кнопки, светодиоды, реле, датчики и другие внешние устройства.
Для управления портами в AVR обычно используются специальные регистры:
DDRx — задаёт направление работы выводов;
PORTx — задаёт состояние выходов или включает подтягивающие резисторы;
PINx — используется для чтения состояния входов.
Где x — имя порта, например B, C или D.
1. Регистр DDRx
Регистр DDRx определяет, является вывод входом или выходом.
Если соответствующий бит равен:
0 — вывод работает как вход;
1 — вывод работает как выход.
Например:
DDRB |= (1 << PB0);Это означает:
PB0 — выходА команда:
DDRB &= ~(1 << PB1);настраивает:
PB1 — вход2. Регистр PORTx
Если вывод настроен как выход, регистр PORTx задаёт его логическое состояние.
Например:
PORTB |= (1 << PB0);устанавливает на выводе PB0 логическую единицу.
А:
PORTB &= ~(1 << PB0);устанавливает логический ноль.
Условно:
PORTB бит = 1 → высокий уровень PORTB бит = 0 → низкий уровень3. Регистр PINx
Регистр PINx используется для чтения текущего состояния входного вывода.
Например:
if (PIND & (1 << PD2)) { // На входе PD2 высокий уровень }Если бит PD2 установлен, значит на входе присутствует логическая единица.
Пример управления светодиодом
Пусть светодиод подключён к выводу PB0.
Сначала необходимо настроить вывод как выход:
DDRB |= (1 << PB0);Включение светодиода:
PORTB |= (1 << PB0);Выключение:
PORTB &= ~(1 << PB0);Полная программа
#include <avr/io.h> #include <util/delay.h> int main(void) { DDRB |= (1 << PB0); while (1) { PORTB |= (1 << PB0); _delay_ms(500); PORTB &= ~(1 << PB0); _delay_ms(500); } }Программа заставляет светодиод мигать с интервалом 500 мс.
Работа с кнопкой
Пусть кнопка подключена к PD2.
Настраиваем вывод как вход:
DDRD &= ~(1 << PD2);Для включения внутреннего подтягивающего резистора:
PORTD |= (1 << PD2);Теперь при использовании типичной схемы с кнопкой на землю:
кнопка отпущена — на входе логическая 1;
кнопка нажата — логический 0.
Проверка нажатия:
if (!(PIND & (1 << PD2))) { // Кнопка нажата }Пример: кнопка управляет светодиодом
#include <avr/io.h> int main(void) { DDRB |= (1 << PB0); DDRD &= ~(1 << PD2); PORTD |= (1 << PD2); while (1) { if (!(PIND & (1 << PD2))) { PORTB |= (1 << PB0); } else { PORTB &= ~(1 << PB0); } } }При нажатии кнопки светодиод включается.
Основные операции с битами
Для AVR на языке C очень часто применяются побитовые операции.
Установка бита
PORTB |= (1 << PB0);Сброс бита
PORTB &= ~(1 << PB0);Проверка бита
if (PINB & (1 << PB0))Инвертирование бита
PORTB ^= (1 << PB0);Последняя команда меняет состояние:
0 → 1 1 → 0Управление сразу несколькими выводами
Например:
DDRB = 0b00001111;означает:
PB0–PB3 — выходы PB4–PB7 — входыЗадать состояния:
PORTB = 0b00000101;Тогда:
PB0 = 1;
PB1 = 0;
PB2 = 1;
PB3 = 0.
Для чего применяется управление портами
Через порты AVR можно управлять:
светодиодами;
реле;
транзисторами;
зуммерами;
дисплеями;
двигателями через драйверы;
кнопками и переключателями;
цифровыми датчиками;
внешними микросхемами.
При этом мощную нагрузку, например двигатель или реле, обычно нельзя подключать непосредственно к выводу микроконтроллера. Применяют транзисторный ключ, драйвер или другой согласующий элемент.
Кратко для ответа по билету
Управление портами AVR на языке C выполняется через регистры DDRx, PORTx и PINx. DDRx задаёт направление вывода: 1 — выход, 0 — вход. PORTx используется для установки уровня на выходе и включения внутренней подтяжки на входе. PINx применяется для чтения состояния входа.
Для управления отдельными выводами широко используются побитовые операции:
DDRB |= (1 << PB0); PORTB |= (1 << PB0); PORTB &= ~(1 << PB0);Таким способом программы на C управляют светодиодами, реле, кнопками, датчиками и другими внешними устройствами.