|
||||||||||||||||||||
Быстрая массовая и единичная установка режимов и значений пинов на Arduino. Обозначение портов (регистров)
Время создания: 29.11.2021 10:16
Текстовые метки: arduino, avr, pin, пин, порт, установка, значение, групповое, массовое, отдельное, единичное
Раздел: Компьютер - Аппаратное обеспечение - Arduino / Atmega8 - Программирование Arduino / Atmega8
Запись: xintrea/mytetra_syncro/master/base/1638170164tt8j6poa8f/text.html на raw.github.com
|
||||||||||||||||||||
|
||||||||||||||||||||
Массовая настройка и установка значений пинов Вместо медленного вызова функций digitalWrite() для установки значения каждого пина по отдельности, можно устанавливать значения цифровых пинов сразу для группы из 8 пинов. Делается это следующим кодом: void setup() { DDRD = B11111111; // Установка всех ножек порта D (digital 7~0) в режим OUTPUT } void loop() { PORTD = B11111111; // Установка значений всех пинов порта D (digital 7~0) в HIGH PORTD = B00000000; // Установка значений всех пинов порта D (digital 7~0) в LOW } Настройка и установка единичных пинов Пример, как установить отдельный вывод PB5 как выход: DDRB |= (1 << 5); // вывод PB5 как выход (OUTPUT) Пример периодической установки нуля и единицы на выводе PB5: while (1) { PORTB &= ~(1 << 5); // низкий уровень (0) на выводе PB5 _delay_ms(1000); // задержка 1000 миллисекунд PORTB |= (1 << 5); // высокий уровень (1) на выводе PB5 _delay_ms(1000); } Обозначения портов и управляющих регистров Каждый порт микроконтроллера AVR (обычно имеют имена A, B и иногда C или даже D) имеет 8 разрядов, каждый из которых привязан к определенной ножке корпуса. Каждый порт имеет три специальных регистра DDRx, PORTx и PINx, где x соответствует букве порта A, B, C или D. Кроме того, каждый бит порта далее обозначается буквой n. Назначение регистров:
Режимы входов и выходов Вход Hi-Z — режим высокоимпендансного входа. Этот режим включен по умолчанию. Все ключи разомкнуты, а сопротивление порта очень велико. В принципе, по сравнению с другими режимами, можно его считать бесконечностью. То есть электрически вывод как бы вообще никуда не подключен и ни на что не влияет. Но! При этом он постоянно считывает свое состояние в регистр PINn и мы всегда можем узнать что у нас на входе — единица или ноль. Этот режим хорош для прослушивания какой либо шины данных, т.к. он не оказывает на шину никакого влияния. А что будет если вход висит в воздухе? А в этом случае напряжение будет на нем скакать в зависимости от внешних наводок, электромагнитных помех и вообще от фазы луны и погоды на Марсе (идеальный способ нарубить случайных чисел!). Очень часто на порту в этом случае нестабильный синус 50Гц — наводка от сети 220В, а в регистре PINn будет меняться 0 и 1 с частотой около 50Гц Вход PullUp — вход с подтяжкой. При DDRxn=0 и PORTxn=1 замыкается ключ подтяжки и к линии подключается резистор в 100кОм, что моментально приводит не подключенную никуда линию в состояние лог.1. Цель подтяжки очевидна — не допустить хаотичного изменения состояния на входе под действием наводок. Но если на входе появится логический ноль (замыкание линии на землю кнопкой или другим микроконтроллером/микросхемой), то слабый 100кОмный резистор не сможет удерживать напряжение на линии на уровне лог.1 и на входе будет лог.0. Режим выхода. Тут, думаю, все понятно — если нам надо выдать в порт лог.1, мы включаем порт на выход (DDRxn=1) и выдаем лог.1 (PORTxn=1) — при этом замыкается верхний ключ и на выводе появляется напряжение, близкое к питанию. А если надо лог.0, то включаем порт на выход (DDRxn=1) и выдаем лог.0 (PORTxn=1) — при этом открывается уже нижний вентиль, что дает на выводе около нуля вольт. Примечание Еще одна фишка есть в новых атмеловских контроллерах: если порт настроен как выход (DDRxn = 1), то запись единицы в разряд PINxn инвертирует соответствующий бит PORTxn и переключает ногу (0→1, 1→0). Это происходит, например, на ATMega48/88/168. Очень удобная штука. |
||||||||||||||||||||
Так же в этом разделе:
|
||||||||||||||||||||
|
||||||||||||||||||||
|