"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

вторник, 21 января 2020 г.

Управление портами контроллера для кружка

Управление портами контроллера


Порты микроконтроллера - это устройства ввода/вывода, позволяющие микроконтроллеру передавать или принимать данные. Стандартный порт микроконтроллера AVR имеет восемь разрядов данных, которые могут передаваться или приниматься параллельно. Каждому разряду (или биту) соответствует вывод (ножка) микроконтроллера. Ножки микроконтроллера также называют пинами. Для обозначения портов используются латинские буквы А, В, С и т.д. Количество портов ввода/вывода варьируется в зависимости от модели микроконтроллера.

Любой порт микроконтроллера можно сконфигурировать как вход или как выход. Для того чтобы это сделать, следует записать в соответствующий порту регистр DDRx необходимое значение. Кроме того, как вход или выход можно сконфигурировать отдельно любой вывод (пин) порта. В любом случае, хотите вы сконфигурировать весь порт или отдельный вывод, вам необходимо будет работать с ригистрами DDRx.

DDRx - регистр направления передачи данных. Этот регистр определяет, является тот или иной вывод порта входом или выходом. Если некоторый разряд регистра DDRx содержит логическую единицу, то соответствующий вывод порта сконфигурирован как выход, в противном случае - как вход. Буква x в данном случае должна обозначать имя порта, с которым вы работаете. Таким образом, для порта A это будет регистр DDRA, для порта B - регистр DDRB и т. д.

Используя AVR GCC, записать в необходимый регистр то или иное значение можно одним из следующих способов.

Для всего порта сразу.

DDRD = 0xff;

Все выводы порта D будут сконфигурированы как выходы.

0xff - шестнадцатиричное представление числа ff, где 0x является префиксом, используемым для записи шестнадцатиричных чисел. В десятичном представлении это будет число 255, а в двоичном виде оно будет выглядеть как 11111111. То есть во всех битах регистра DDRD будут записаны логические единицы.

В AVR GCC для представления двоичных чисел используется префикс 0b. Таким образом, число 11111111 должно представляться в программе как 0b11111111. Мы можем записать предыдущую команду в более читабельном виде.

DDRD = 0b11111111;

Хотя такая запись и выглядит более наглядной, при конфигурировании портов принято использовать шестнадцатиричное представление чисел.

Для того чтобы сконфигурировать все выводы порта D как входы, следует записать во все биты регистра DDRD логические нули.

DDRD = 0x00;

В регистр DDRD можно записать и другие числа. Например:

DDRD = 0xb3;

0xb3 - шестнадцатиричное представление числа 179. В двоичном виде оно будет выглядеть как 10110011. То есть часть выводов порта D будет сконфигурирована как выходы, а часть - как входы.

PD0 - 1 (выход)
PD1 - 1 (выход)
PD2 - 0 (вход)
PD3 - 0 (вход)
PD4 - 1 (выход)
PD5 - 1 (выход)
PD6 - 0 (вход)
PD7 - 1 (выход)






Каждый бит регистров DDRx может быть установлен отдельно. Например, чтобы сконфигурировать отдельно вывод PD2 как выход, нам необходимо в соответствующий бит регистра DDRD записать 1. Для этого применяют следующую конструкцию.

DDRD |= 1<<2;

1<<2 - осуществляет сдвиг единички влево на 2 бита, то есть справа добавляются два нулевых бита и получается 100, а знак "|", стоящий перед знаком присваивания "=", осуществляет операцию побитного логического сложения.

При логическом сложении 0+0=0, 0+1=1, 1+1=1. Операцию логического сложения по-другому называют операцией ИЛИ (английское название OR).

Таким образом, к битам, хранящимся в регистре DDRD, прибавляется двоичное 100, представленное в 8-битном регистре микроконтроллера как 00000100, и результат записывается обратно в регистр DDRD.





Чтобы сконфигурировать отдельно вывод PD2 как вход, нам необходимо в соответствующий бит регистра DDRD записать 0. Для этого применяют следующую конструкцию.

DDRD &= ~(1<<2);

В данном случае результат сдвига единицы на две позиции влево инвертируется с помощью операции побитного инвертирования, обозначаемой значком "~".

При инверсии мы получаем вместо нулей единички, а вместо единичек - нули. Эта логическая операция иначе называется операцией НЕ (английское название NOT).

Таким образом, при побитном инвертировании 00000100 мы получаем 11111011. (Подробнее о работе с числами в микроконтроллере см. во врезке ниже.)

Получившееся число с помощью операции побитного логического умножения & умножается на число, хранящееся в регистре DDRD, и результат записывается в регистр DDRD.

При логическом умножении 0*0=0, 0*1=0, 1*1=1. Операцию логического умножения иначе называют операцией И (английское название AND).

То есть сдвинутая нами влево на две позиции единичка превращается при инвертировании в ноль и умножается на соответствующий бит, хранящийся в регистре DDRD. При умножении на ноль мы получаем ноль. Таким образом, бит PD2 становится равным нулю.



Кроме логических операций И, ИЛИ, НЕ существует также операция "исключающее ИЛИ" (английское название XOR). Она обозначается значком ^.

При исключающем ИЛИ значение бита, к которому "прибавляется" единичка, изменяется на противоположное.

Например, 110011 ^ 11010 = 101001.

Следует добавить, что работа с числами в 8-битном микроконтроллере проходит с использованием 8-битных регистров. Перед вычислениями аргумент помещается в один из специальных регистров, с которыми напрямую может работать арифметико-логическое устройство (АЛУ). Например, перед выполнением команды DDRD &= ~(1<<2) аргумент помещается во вспомогательный регистр микроконтроллера. Содержимое такого регистра будет выглядеть как 11111011.
После этого осуществляется операция побитного умножения, что дает во втором бите регистра DDRD значение 0.






https://myrobot.ru/stepbystep/el_simple_robot_handmade.php

Новая мигалка - бегущие огни

На кружке робототехники была  рассмотрена схема бегущего огня, как показано ниже
Для создания программы был разработан алгоритм с помощью ИС ДРАКОН.

Листинг программы представлен ниже.
    // ИС Дракон. Маршрутный транслятор.

    // Y:\home\deniska\Документы\др длкр\новая мигалка.drt
    // 1. Схема - Гном, Изменение 21.01.2020 17:46:18
    // 3. Модуль, Начало
#include <avr/io.h>

    // Y:\home\deniska\Документы\др длкр\новая мигалка.drt
    // 2. Схема - процедура, Изменение 21.01.2020 18:09:35, Начало
int main()
{
int A, t;

    // ==================== Шампур

    // 4. Заголовок / main()

    // 5. Ветка / setup

    // 6. Действие / настройка портов
DDRB = 0xFF;
PORTB = 0x00;

    // 7. Действие / переменная сдвига
A = 0;

    // 8. Действие / установка задержки на 0
t = 0;

    // 9. Адрес -> 10. Ветка / telo

    // ==================== Шампур

    // 10. Цикл Ветка / telo

L11: ;
    // 11. Действие / зажигаем светодиод
PORTB |= 1 << A;

    // 12. Пауза / 300 мкс
de:;
t++;
if (t<30000) goto de;
t= 0;

    // 13. Действие / гасим предыдущий
PORTB &= ~(1 << A);

    // 14. Действие / сдвиг
A++;

    // 15. Вопрос / горит последний светодиод == Да
if (A == 6) goto L17;

    // 16. Цикл Адрес -> 10. Ветка / telo
goto L11;

    // ==================== Шампур

L17: ;
    // 17. Действие / обнуляем переменную сдвига
A = 0;

    // 18. Цикл Адрес -> 10. Ветка / telo
goto L11;

    // ==================== Шампур

    // 19. Ветка / aut

    // 20. Конец / Конец

    // 2. Схема, Конец
//
}

    // 3. Модуль, Конец
//



воскресенье, 19 января 2020 г.

Логические элементы

Логика это не просто древнегреческое слово, а целая наука, изучение которой позволяет нам правильно и здраво рассуждать, и, соответственно, делать правильные выводы из наших рассуждений, чего, однако, очень не хватает в нашем современном мире (поэтому и говорят «нелогичный человек», «нелогичный поступок»).
Рассуждая о чем-либо, мы, на основе логических заключений, делаем соответствующие выводы. К примеру, думая о своем товарище, на основе каких-то фактах, характеризующих его, мы можем сделать вывод – друг он нам, или нет (или: «и не друг, и не враг, – а так»).
Все современные цифровые технологии основываются на логических операциях, без них никуда не деться. Все цифровые микросхемы в своей работе используют логические схемы (выполняют логические операции, в том числе и микроконтроллер).
Создавая программу, мы прописываем все действия микроконтроллера основываясь на своей логике с применением логических операций, иногда даже и не подозревая об этом, которые применяем к логическим выражениям.
В программировании логическая операция применяется не только к логическому выражению, но и для операций с двоичными числами, так называемые «логические побитовые (битовые) операции», которые очень сильно облегчают тяжелую жизнь программиста.

Основные логические операции

1. Инверсия
2. Конъюнкция
3. Дизъюнкция
Конъюнкция, оно же «Логическое И», оно же «Логическое умножение».
Мы выбираем название «Логическое И» – оно чаще встречается в программировании. Допустим, у нас есть два простых выражения – А и В. Эти выражения могут иметь значения или 1 (истина), или 0 (ложь). При выполнении операции «Логическое И» мы получим сложное выражение которое примет значение 1 (истина) только в том случае если и А, и В имеют значение 1 (истина), во всех других случаях результат будет 0 (ложь).
Операция «Логическое И» имеет обозначения (в языках программирования): И, &&, AND, &.
Дизъюнкция, оно же «Логическое ИЛИ», оно же «Логическое сложение».
Мы выбираем название «Логическое ИЛИ». Кстати, если логически подумать, то можно и догадаться какие результаты будут при выполнении этой операции.
В «Логическом И» результат равен 1, если и А, и В, равны 1, а в «Логическом ИЛИ» результат будет равен 1, если или А, или В, равны единице.
Операция «Логическое ИЛИ» имеет обозначения: ИЛИ, ||, OR, |.
Инверсия, оно же «Логическое НЕ», оно же «Отрицание».
Мы выбираем название «Логическое НЕ».
Операция «Логическое НЕ» имеет обозначения: НЕ, !, NOT.
Тут вообще все просто:
Если А=1 (истина), то после выполнения операции «Отрицание» А примет значение 0, то есть становится ложным. И наоборот.
Есть еще одно название этой операции «Инвертор», а применяется оно в отношении цифровых микросхем.
В программировании часто применяется еще одна логическая операция – симбиоз «Логического И» и «Логического ИЛИ»:
Строгая дизъюнкция, оно же «Исключающее ИЛИ», оно же «Логическое сложение, исключающее ИЛИ», оно же «Сложение по модулю 2»
Мы выбираем название «Исключающее ИЛИ»
Операция «Исключающее ИЛИ» имеет обозначения: Искл.ИЛИ, XOR, ^.
В этом случае, при выполнении операции «Исключающее ИЛИ», результат будет истинен (равен 1), если А не равно В.  В остальных случаях результат будет равен 0 (ложный).

Таблица истинности

https://microkontroller.ru/wp-content/uploads/2015/02/Tablitsa-istinnosti.jpg

https://microkontroller.ru/wp-content/uploads/2015/02/Tablitsa-istinnosti1.jpg

Логические элементы

https://microkontroller.ru/wp-content/uploads/2015/02/Logicheskiy-e%60lement.jpg   https://microkontroller.ru/wp-content/uploads/2015/02/Logicheskoe-I.jpg

https://microkontroller.ru/wp-content/uploads/2015/02/Logicheskoe-ILI.jpghttps://microkontroller.ru/wp-content/uploads/2015/02/Logicheskoe-NE.jpg https://microkontroller.ru/wp-content/uploads/2015/02/Logicheskoe-ILI-NE.jpg https://microkontroller.ru/wp-content/uploads/2015/02/Logicheskoe-I-NE.jpg

по материалам 

https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/logicheskie-operatsii/












четверг, 16 января 2020 г.

Общее устройство микроконтроллеров ATmega и ATtiny



Краткие характеристики микроконтроллеров AVR семейства Mega и Tiny:
— тактовая частота от 0 герц до 20 мегагерц
— объем памяти программ 1-16 килобайт для семейства Tiny и 8-256 килобайт для семейства Mega
— напряжение питания от 1,8 до 5,5 вольт (для разных типов микроконтроллеров диапазон питающих напряжений разный, также встречается и от 0,7 вольт, и до 6 вольт)
— ток потребления микроконтроллером — в среднем около 5 миллиампер и сильно зависит от питающего напряжения и тактовой частоты, чем выше эти значения — тем больший ток потребления
https://microkontroller.ru/wp-content/uploads/2015/05/Obshhee-ustroystvo-mikrokontrollerov-AVR-ATmega-i-ATtiny.jpg

CPU — процессор микроконтроллера

Его задача сформировать адрес очередной команды, выбрать команду из памяти и организовать ее выполнение.
Основные устройства CPU:
— АЛУ — арифметико-логическое устройство
— блок регистров общего назначения (РОН)
АЛУ — устройство, которое выполняет арифметические и логические операции над данными, которые поступают из регистров общего назначения.
РОН — регистры общего назначения (всего 32 РОН, от R0 до R31), основная задача которых — обмен данными между АЛУ и ячейками памяти.

Память микроконтроллера

Микроконтроллеры AVR имеют три разновидности памяти:
FLASH
SRAM
EEPROM
FLASH-память — постоянное запоминающее устройство, она-же память программ. Предназначена для хранения кодов программ и констант (англ. flash memory) — разновидность полупроводниковой технологии электрически перепрограммируемой памяти (EEPROM).
SRAM-память — оперативное запоминающее устройство, она-же память данных. Предназначена для хранения данных, получаемых в процессе выполнения программы (при выключении питания — данные теряются)
EEPROM-память — постоянное запоминающее устройство, она-же энергонезависимая память данных. Предназначена для хранения констант и данных, получаемых в процессе выполнения программы (при выключении питания — данные не теряются) (англ. Electrically Erasable Programmable Read-Only Memory) — электрически стираемое перепрограммируемое ПЗУ (ЭСППЗУ), один из видов энергонезависимой памяти (таких, как PROM и EPROM). Память такого типа может стираться и заполняться данными до миллиона раз.)

Периферийные устройства

Порты ввода-вывода
Параллельный восьмиразрядный порт ввода-вывода предназначен для ввода и вывода данных. Количество портов — от 1 до 7 (зависит от модели микроконтроллера)и обозначаются они буквами A, B,C, D … .
Аналоговый компаратор
Присутствует во всех моделях МК
Аналоговый компаратор – устройство сравнения. Основная задача компаратора – это сравнение двух напряжений: одно из них – образцовое (с чем сравниваем), а второе – измеряемое (сравниваемое). Если сравниваемое напряжение больше образцового – компаратор вырабатывает сигнал логической единицы. Если сравниваемое напряжение меньше образцового – компаратор формирует на своем выходе логический ноль.
С помощью компаратора можно, к примеру, контролировать напряжение на заряжаемом аккумуляторе. Пока напряжение не достигнет нужного уровня, на выходе компаратора – логический ноль, как только напряжение аккумулятора достигло уровня нужного нам, компаратор вырабатывает логическую единицу, и значит можно завершить зарядку аккумулятора.
АЦП – аналогово-цифровой преобразователь
Имеют не все МК
АЦП – преобразователь аналогового напряжения в цифровую форму.
Аналоговое напряжение – это напряжение которое изменяется по напряжению во времени. Например – синусоидальный сигнал с выхода генератора частоты, напряжение в бытовой розетке, звуковой сигнал на колонках.
АЦП постоянно анализирует на своем входе величину напряжения и выдает на своем выходе цифровой код, соответствующий входному напряжению.
Примеры применения:
– цифровой вольтметр или амперметр
– процессорный стабилизатор напряжения
МК, которые имеют АЦП, также имеют раздельное питание для цифровой и для аналоговой частей.
Таймер/счетчик
Присутствует во всех моделях МК, но в разных количествах – от 1 до 4, и с разными возможностями
Таймер/счетчик – это как бы два устройства в одном флаконе: таймер + счетчик.
Таймер – устройство, которое позволяет формировать временные интервалы. Таймер представляет собой цифровой счетчик который считает импульсы или от внутреннего генератора частоты, или от внешнего источника сигнала.
С помощью таймера/счетчика можно:
– отсчитывать и измерять временные интервалы
– подсчитывать количество внешних импульсов
– формировать ШИМ-сигналы
К примеру, мы хотим создать прибор позволяющий измерять частоту входного сигнала (частотомер). В этом случае мы можем использовать два счетчика/таймера. Первый будет отсчитывать временные интервалы равные 1 секунде, а второй будет считать количество импульсов за промежуток времени в 1 секунду которые отсчитывает первый таймер. Количество импульсов подсчитанное вторым таймером/счетчиком за 1 секунду будет равно частоте входного сигнала.
ШИМ— широтно-импульсный модулятор, предназначен для управления средним значением напряжения на нагрузке.
ШИМ – один из вариантов работы таймера/счетчика, позволяющий генерировать на выходе МК прямоугольное импульсное напряжение с регулируемой длительностью между импульсами (скважностью), которое применяется в различных устройствах:
– регулирование частоты вращения электродвигателя
– осветительные приборы
– нагревательные элементы
Сторожевой таймер
Есть во всех моделях МК. Может быть включен или выключен по усмотрению программиста
У сторожевого таймера только одна задача – производить сброс (перезапускать программу) МК через определенный промежуток времени.

Последовательные порты

Последовательный периферийный интерфейс SPI
Имеется во всех моделях МК
Мы его в большинстве случаях применяем для программирования МК.
Кроме программирования МК, интерфейс SPI позволяет:
– обмениваться данными между МК и внешними устройствами
– обмениваться данными нескольким МК между собой
Универсальный приемопередатчик UART
Имеют все модели МК, но разных типов:
– USART
– UART
Предназначены для обмена данными по последовательному каналу по двухпроводным линиям связи. Прием и передача могут вестись одновременно.
Последовательный двухпроводный интерфейс TWI (I2C)
Встречается только в серии Mega.
Предназначен для обмена данными по двухпроводной линии. Всего к такой линии можно подключить до 128 устройств.
TWI является полным аналогом интерфейса I2C.

 По материалам:

  1. https://microkontroller.ru/ustroystvo-mikrokontrollerov-avr/obshhee-ustroystvo-mikrokontrollerov-avr/

  2. https://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%B5%D1%88-%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C

  3. https://ru.wikipedia.org/wiki/EEPROM

суббота, 11 января 2020 г.

Постоянная память данных EEPROM

Микроконтроллер ATmega328P имеет постоянное запоминающее устройство - память EEPROM, имеющая емкость 1024 Байта. При отключении питания и сбросе микроконтроллера все данные, хранящиеся в EEPROM остаются без изменений.

Регистры EEPROM:
  • EEAR (16 бит) - регистр адреса 
  • EEDR - регистр данных
  • EECR - регистр управления
Регистр EEARH:
7
6
5
4
3
2
1
0
-
-
-
-
-
-
EEAR9
EEAR8

Регистр EEARL:
7
6
5
4
3
2
1
0
EEAR7
EEAR6
EEAR5
EEAR4
EEAR3
EEAR2
EEAR1
EEAR0

Для управления прерываниями, а также чтением и записью в EEPROM используется регистр EECR:
7
6
5
4
3
2
1
0
-
-
EEPM1
EEPM0
EERIE
EEMPE
EEPE
EERE
Биты EEPM1 (5) и EEPM0 (4) регистра EECR управляют режимами обновления EEPROM:
  • 00 - стирание старого значения и запись нового (3.4 мс)
  • 01 - только стирание старого значения (1.8 мс)
  • 10 - только запись нового значения (1.8 мс)
  • 11 - резерв
Бит EERIE (3) регистра EECR разрешает прерывания по завершению записи в EEPROM при записи в него 1.
Бит EEMPE (2) регистра EECR разрешает запись в EEPROM если в него записать 1 (сбрасывается в 0 через 4 машинных цикла).
Бит EEPE (1) регистра EECR управляет записью в EEPROM (если записать в него 1, то будет произведена запись данных из регистра EEDR в EEPROM по адресу EEAR).
Бит EERE (0) регистра EECR управляет чтением в EEPROM (если записать в него 1, то будет произведено чтение данных из EEPROM по адресу EEAR в регистр EEDR ).

пятница, 3 января 2020 г.

Порты ввода/вывода

Характеристики портов ввода/вывода:

  • Возможность подключения подтягивающих резисторов
  • Независимое использование функции ввода/вывода для отдельных разрядов одного порта
Регистры портов ввода/вывода:
  • DDRB, DDRC, DDRD - регистры выбора режимов работы порта
  • PORTB, PORTC, PORTD - регистры состояния порта ввода/вывода
Каждый разряд регистра DDR указывает, будет ли работать данный контакт на ввод или на вывод (если 1, то порт работает на вывод, если 0 - на ввод).
Каждый разряд регистра PORT управляет вводом или выводом ( если порт работает на вывод, то при установке в него 1 на выходе появляется логическая 1, в противном случае 0 / если порт работает на ввод, при установке в данный разряд 1 ко входу подключается подтягивающий к Vпитания резистор).
Порты  B и D имеют по 8 разрядов, а порт C всего лишь 6, начиная с младшего.

Для запрещения использования подтягивающих резисторов на всех портах, бит PUD (4) регистра MCUCR необходимо установить в 1.

Регистр MCUCR:
7
6
5
4
3
2
1
0
-
BODS
BODSE
PUD
-
-
IVSEL
IVCE

четверг, 26 декабря 2019 г.

Общие сведения о портах микроконтроллеров AVR

Порты микроконтроллеров AVR — это устройства ввода/вывода, позволяющие микроконтроллеру передавать или принимать данные. Стандартный порт микроконтроллера AVR содержит восемь разрядов данных, которые могут передаваться или приниматься параллельно. Ножки микроконтроллера также называют пинами, контактами или выводами. Порты обозначаются латинскими буквами А, В, С и т.д. Количество портов зависит от конкретной модели микроконтроллера.
Kонфигурирование каждой линии порта (задание направления передачи данных) может быть произведено программно в любой момент времени. Входные буферы портов построены по схеме триггера Шмитта. Для линий, сконфигурированных как входные, также имеется возможность подключения внутреннего подтягивающего резистора сопротивлением 35…120 кОм между входом и проводом питания. Kроме того, если вывод (вход) с подключенным внутренним подтягивающим резистором подключить к общему проводу, он может служить источником тока.
Обращение к портам производится через регистры ввода/вывода, причем под каждый порт в адресном пространстве ввода/вывода за-резервировано по 3 адреса. По этим адресам размещаются три регистра: регистр данных порта PORTx, регистр направления данных DDRx и регистр выводов порта PINx. Разряды этих регистров имеют названия: Px7…Px0 — для регистров PORTx, DDx7…DDx0 — для регистров DDRx и PINx7…PINx0 — для регистров PINx.
Действительные названия регистров (и их разрядов) получаются подстановкой названия порта вместо символа «x», соответственно для порта A регистры называются PORTA, DDRA, PINA, для порта B — PORTB, DDRB, PINB и т.д.
Следует заметить, что «регистры» PINx на самом деле регистрами не являются, по этим адресам осуществляется доступ к физическим значениям сигналов на выводах порта. Поэтому они доступны только для чтения, тогда как регистры PORTx и DDRx доступны и для чтения, и для записи.
Таким образом, запись в порт означает запись требуемого состояния для каждого вывода порта в соответствующий регистр данных порта PORTx. А чтение состояния порта выполняется чтением либо регистра данных порта PORTx, либо регистра выводов порта PINx. При чтении регистра выводов порта PINx происходит считывание логических уровней сигналов, присутствующих на выводах порта. А при чтении регистра данных порта PORTx происходит считывание данных, находящихся в регистре-защелке порта – это справедливо как для входных, так и для выходных контактов.
Любой порт микроконтроллера AVR можно сконфигурировать как вход или как выход. Для этой цели используется регистр DDRx. На вход или выход можно сконфигурировать сразу весь порт или только отдельный его вывод (контакт, пин).
Регистр DDRx определяет, является тот или иной вывод порта входом или выходом. Если некоторый разряд регистра DDRx содержит логическую единицу, то соответствующий вывод порта сконфигурирован как выход, в противном случае — как вход. Буква x в данном случае должна обозначать имя порта, с которым вы работаете. Таким образом, для порта A это будет регистр DDRA, для порта B — регистр DDRB и т. д.

по материалам "Мир микроконтроллеров" https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/upravlenie-portami-avr-na-yazyke-c/