Часть 1: Прямое управление портами (Регистры PORTB, PORTC, PORTD)

Добро пожаловать в мир регистров портов и Pin Change Interrupts — это джедайские техники, которые сделают ваш код быстрее в сотни раз и позволят обрабатывать события так, как не снилось обычным digitalRead().

Почему digitalWrite() — это зло?

Когда вы пишете digitalWrite(13, HIGH), Arduino IDE выполняет внутри себя огромную прослойку:

  1. Проверяет, существует ли пин 13.
  2. Ищет, к какому порту (B, C или D) он относится.
  3. Вычисляет маску бита.
  4. Отключает прерывания на всякий случай.
  5. Меняет бит.
  6. Снова включает прерывания.

Все это занимает около 5 микросекунд (при 16 МГц это ~80 тактов процессора!). А теперь представьте, что вам нужно вывести картинку на LED-матрицу или управлять 8 реле одновременно — задержки становятся критическими.

Как устроены порты на Arduino Uno (ATmega328P):

Микроконтроллер разбивает все 20 пилов на три порта:

ПортБит 7Бит 6Бит 5Бит 4Бит 3Бит 2Бит 1Бит 0
PORTBPB7PB6PB5PB4PB3PB2PB1PB0
Пины1312111098
PORTCPC6PC5PC4PC3PC2PC1PC0
ПиныResetA5A4A3A2A1A0
PORTDPD7PD6PD5PD4PD3PD2PD1PD0
Пины7654321 (TX)0 (RX)

У каждого порта есть три регистра:

  • PORTx — записываем сюда, чтобы установить HIGH (1) или LOW (0) на пинах.
  • DDRx (Data Direction Register) — определяем, пин работает как вход (0) или как выход (1).
  • PINx — читаем состояние пинов (входной регистр).

Вам также может понравиться

About the Author: ардуинчиков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *