MyTetra Share
Делитесь знаниями!
Быстрая массовая и единичная установка режимов и значений пинов на 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 разрядов, каждый из которых привязан к определенной ножке корпуса. Каждый порт имеет три специальных регистра DDRxPORTx и PINx, где x соответствует букве порта A, B, C или D. Кроме того, каждый бит порта далее обозначается буквой n.


Назначение регистров:

DDRx – Настройка разрядов порта x на вход или выход.

PORTx – Управление состоянием выходов порта x (если соответствующий разряд настроен как выход), или подключением внутреннего pull-up резистора (если соответствующий разряд настроен как вход).

PINx – Чтение логических уровней разрядов порта x.

PINхn – это регистр чтения. Из него можно только читать. В регистре PINxn содержится информация о реальном текущем логическом уровне на выводах порта. Вне зависимости от настроек порта. Так что если хотим узнать что у нас на входе — читаем соответствующий бит регистра PINxn. Причем существует две границы: граница гарантированного нуля и граница гарантированной единицы — пороги за которыми мы можем однозначно четко определить текущий логический уровень. Для пятивольтового питания это 1.4 и 1.8 вольт соответственно. То есть при снижении напряжения от максимума до минимума бит в регистре PINx переключится с 1 на 0 только при снижении напряжение ниже 1.4 вольт, а вот когда напряжение нарастает от минимума до максимума переключение бита с 0 на 1 будет только по достижении напряжения в 1.8 вольта. То есть возникает гистерезис переключения с 0 на 1, что исключает хаотичные переключения под действием помех и наводок, а также исключает ошибочное считывание логического уровня между порогами переключения.

При снижении напряжения питания, разумеется, эти пороги также снижаются.

DDRxn – это регистр направления порта. Порт в конкретный момент времени может быть либо входом либо выходом (но для состояния битов PINxn это значения не имеет. Читать из PINxn реальное значение можно всегда).

DDRxy = 0 – вывод работает как ВХОД.

DDRxy = 1 – вывод работает на ВЫХОД.

PORTxn – режим управления состоянием вывода. Когда мы настраиваем вывод на вход, то от PORTх зависит тип входа (Hi-Z или PullUp, об этом чуть ниже).

Когда ножка настроена на выход, то значение соответствующего бита в регистре PORTx определяет состояние вывода. Если PORTxn=1 то на выводе лог.1, если PORTxn=0 то на выводе лог.0.

Когда ножка настроена на вход, то если PORTxn=0, то вывод в режиме Hi-Z. Если PORTxn=1 то вывод в режиме PullUpс подтяжкой резистором в 100к до питания.

Таблица. Конфигурация выводов портов.



DDRxn

PORTxn

I/O

Comment

0

0

(Input) Вход

Высокоимпендансный вход. (Не рекомендуется использовать, так как могут наводится наводки от питания)

0

1

(Input) Вход

Подтянуто внутренне сопротивление.

1

0

(Output) Выход

На выходе низкий уровень.

1

1

(Output) Выход

На выходе высокий уровень.



Режимы входов и выходов


Вход 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. Очень удобная штука.



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования