КИПиА ЯМАЛ
Электронная библиотека учебной документации КИПиА
6-й разряд · МДК.01.02 · Билет № 4 · Вопрос 2

Управление портами микроконтроллеров AVR c помощью программ, написанных на языке С (Си).

Ответ

Ответ на вопрос

Управление портами микроконтроллеров 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 управляют светодиодами, реле, кнопками, датчиками и другими внешними устройствами.

Этот вопрос используется в билетах