Так как контроллер Arduino UNO основан на микроконтроллере(МК) ATMega328P, к портам Arduino можно обращаться не только по их номерам, которые присвоили разработчики Arduino, но и с помощью регистров, заложенные в МК ATMega328P, служащие для управлении портами. В большинстве МК фирмы ATMEL, порты объединены в группы по 8 выводов. Если количество портов не кратна 8, то группа может состоять из меньшего количества выводов. Для каждой группы портов отводится три регистра по одному байту, которые для первой группы называются PORTA, PINA и DDRA, для второй группы PORTB, PINB и DDRB и т.д. С помощью регистра DDRx, где x — A, B, C … задается режим работы порта на чтение или запись (аналогично команде Arduino pinMode). Нулевой бит (младший бит) этого регистра настраивает первый вывод группы, первый бит настраивает следующий вывод и т.д. Регистр PORTx служит для управления уровнем напряжения на выводе аналогично команде Arduino digitalWrite. Так же, как и с регистром DDRx, нулевой бит PORTx управляет первым выводом, первый бит — вторым выводом и т.д. Регистр PINx используется для чтения из портов, при этом соответствующий вывод должен быть настроен на вход с помощью регистра DDRx. Ниже представлено изображение, показывающее логическую связь битов регистров с выводами.
Соответствие нумерации портов Arduino с регистрами МК легко можно найти в Интернете. Ниже, в качестве примера представлена картинка, показывающая соответствие портов Arduino UNO c его регистрами, взятая из Интернета:
В качестве примера использования регистров контроллера в среде Arduino IDE ниже реализована программа, которая моргает светодиодом, подключенный к 13-му выводу. Из картины выше видно, что ему соответствуют регистры PORTB, PINB и DDRB. А именно, их 5-е биты.
void setup() { DDRB=32;//Устанавливает 5-й бит регистра в 1 } void loop() { PORTB=32;//Выдает высокий уровень напряжения delay(1000);//задержка в 1 секунду PORTB=0;//Выдает низкий уровень напряжения delay(1000); }
Здесь в DDRB пишется 32. в двоичном представлении 32 в ячейке размером в 1 байт имеет вид 00100000. То есть 5-й бит числа равно 1, что нам и нужно было (Биты нумеруются от нуля справа налево).
Работа с портами через их регистры в Arduino IDE происходит в разы быстрее, чем его стандартными командами pinMode и digitalWrite.