Порты ввода/вывода микроконтроллеров AVR, их конфигурирование
В данной статье я хочу подробно остановится на портах ввода-вывода. Как основной элемент для получения информации микроконтроллером всегда используется порт. Порт в микроконтроллере может быть настроен на вход:
DDRB = 0x00; или на выход DDRB = 0xFF;
Синтаксис Си подразумевает конфигурацию портов именно таким, так сказать оператором DDR(я так подозреваю аббревиатура от дословного перевода Data Direction, может и нет :-))
То есть для того чтобы сконфигурировать весь порт B на вход или выход достаточно указать следующий код:
... int main (void) { DDRB = 0x00; ... } ...
"..." - подразумевает какой-то код.
код 0x00 - соответствует шестнадцатиричному коду "00000000", для тех кто впервые сталкивается с микроконтроллерами будет полезно знать, что есть несколько вариантов записи числа, то есть, несколько вариантов в двоичной системе и в шестнадцатиричной. Для обозначения двоичного ввода числа в синтасисе Си предусмотрено использование опаретора:
0byyyyyyyy - где "y" 8 бит порта микроконтроллера. Для шестнадцатиричного вида записи числа в синтаксисе Си предусмотрен следующий оператор:
0xyy - где "y" 4 тетрады порта микроконтроллера. Для справки: тетрада - 4 бита, то есть "0000" к примеру, байт - 8 бит или соответственно 2 тетрады, то есть "00000000".
Для конвертирования кода из двоичной системы исчисления в шестнадцатиричную, из шестнадцатиричной в десятичную рекомендую использовать программу BinHexDec Converter.
Порт не обязательно настраивать полностью на вход или на выход. Возможны варианты частичного конфигурирования, такие как:
DDRB = 0x0F; (равносильно 0b00001111 - 4 бита на вход, 4 бита на выход)
Для удобства я иногда записываю побитово конфигурацию порта:
DDRD &= ~_BV(PD2);//вход DDRD &= ~_BV(PD3);//... DDRD &= ~_BV(PD4);//... DDRD &= ~_BV(PD5);//вход DDRB |= _BV(PB0);//выход DDRB |= _BV(PB1);//... DDRB |= _BV(PB2);//... DDRB |= _BV(PB3);//выход
На рисунке пример работы с BinHexDec Converter.
Порты ввода/вывода у каждого контроллера по своему мощны, некоторые могут выдержать нагрузку светодиода напрямую подключенного к выводу порта(например AtTiny2313 а некоторые не могут ATmega8), в результате чего порт просто выгорает. Поэтом, очень советую на, те же светодиоды, ставить ограничивающий ток резистор, номиналом от 750 Ом до 1кОм. И будете уверены что ни порт, ни светодиод не сгорит.
Честно говоря существует еще два вида записи конфигурации порта на ввод/вывод, но они уже устарели, да и они менее наглядные чем пред идущие с использованием операторов "0x.." и "0b........".
DDRB |= 1<<2; - сконфигурировать бит номер 2 порта B на выход то же самое означает запись: DDRB |= _BV(PB2);
гугль говорит
DDR - data direction register
и кажется нашел ответ на один из сегодняшних вопросов. но наверное даже если использовать Attiny2313 резисторы лишними не будут? или они там уже в самом чипе есть?
Подтягивающие есть в самом
Подтягивающие есть в самом чипе, но внешние лишними не будут.
терминология
подтягивающие = ограничивающие?
нет, они "подтягивают"
нет, они "подтягивают" потенциал на ножке до логической единицы.
При подключение светодиода к порту МК нужно ставить ограничительный резистор, иначе порт МК или светодиод может сгореть.