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

четверг, 17 декабря 2020 г.

КРУЖОК ОТ 18.12.20

 И да, светодиодом на прошлом занятии помигали. Получилось. Зто хорошо, теперь усложним задачу. Поработаем с светодиодной цифрой. Соберем сначала в виртуальной лаборотории схему показанную ниже

Светодиоджная цифра состоит из восьми сегментов, где каждый сегмент - светодиод. Сопротивления необходимо для огроаничения тока протекающего через светодиоды. Положительный сигнал подаем на общий вход устройства с платы микроконтроллера (+5). Сопротивления в свою очередь подключим к пинам микроконтроллера 1 - 7. 0 пин задействовать не будем. 
Алгоритм работы устройства довольно прост - назначаем определенным пинам низкий уровень сигнала, и подключеные к ним светодиоды зажигаются образуя определенную цифру. Далее задержка и новая комбинация пинов. Всего комбинаций десять по числу отображаемых цифр. Ниже приведен примерный скетч для загрузки в микроконтроллер.

Данная программа занимает 4% памяти микроконтроллеравсего - 1336 байт. Можно ли уменьшить объем занимаемой памяти при записи точно такого же алгоритма? Давайте попробуем.
Для начало внимательно рассмотрим нашу плату микроконтроллера.


Порты микроконтроллеров 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 доступны и для чтения, и для записи.

Обратим внимание, что наше устройство подключено к порту D, а значит мы можем обращаться к нему на прямую. На языке С можно задать направление передачи данных сразу для всего порта.

Пример:

DDRB = 0xff;

С помощью этой команды все выводы (контакты) порта B будут сконфигурированы как выходы.

0xff представляет собой шестнадцатиричное представление числа ff, а 0x является префиксом, указывающим на то, что число записано в шестнадцатиричное форме. В десятичном представлении число 0xff будет равно 255, а в двоичном – 11111111. То есть с помощью представленной команды во все биты регистра DDRB будут записаны логические единицы.

В языке Си для микроконтроллеров AVR для представления двоичных чисел применяется префикс 0b. Соответственно, представленную выше команду записи логических единиц во все биты регистра DDRB можно записать и с помощью двоичного вида числа 255:

DDRD = 0b11111111;

Эта запись команды является более наглядной, но все таки правилом "хорошего тона" в программировании для микроконтроллеров считается использование шестнадцатиричного представления чисел.

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

PORTx - регистр порта, где x обозначает имя порта.

Если вывод (контакт) сконфигурирован как выход, то единица в соответствующем бите регистра PORTx формирует на выводе сигнал высокого уровня, а ноль - сигнал низкого уровня.

Если вывод (контакт) сконфигурирован как вход, то единица в бите регистра PORTx подключает к выводу внутренний подтягивающий pull-up резистор, который обеспечивает высокий уровень на входе при отсутствии внешнего сигнала.

Установить "1" на всех выводах (контактах) порта B можно c помощью следующей команды:

PORTB = 0xff.

Аналогично установка "0" на всех выводах порта B выполняется следующим образом:

PORTB = 0x00.

К каждому биту регистров PORTx можно обращаться и по отдельности так же, как и в рассмотренном выше случае с регистрами DDRx. К примеру, команда

PORTB |= 1<<3;

установит "1" (сигнал высокого уровня) на контакте PB3.

Команда

PORTB &= ~(1<<4);

установит "0" (сигнал низкого уровня) на контакте PB4.

В нашем случае мы будем переписывать значение  PORTD двоичным числом, создавая сразу нужные комбинации пинов для работы светодиодов. Примерно так:


Данный скетч использует 2% памяти устройства - 776 байтов, что примерно в два раза короче предыдущего скетча и это только начало. 

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