Логотип

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

Программирование микроконтроллеров. Урок 12
Подключение семисигментного индикатора

Урок 12 (Подключение семисигментного индикатора)

На прошлом занятии мы с вами ознакомились с возможностью программной организации ШИМ, а также сделали светодиодный куб для изучения массивов. Но т.к. тема динамической индикации, да и массивов в целом широка, я решил пока не использовать куб, а предложить вам начать изучение материала с более простых вещей. На мой взгляд подключение одиночного семисегментного индикатора к МК как раз задача для начинающих. Но мы не просто его подключим, а сделаем электронный кубик для настольных игр.

И так. О семисегментных индикаторах для начала можно почитать:
   С.А. Никулин, А.В. Повный «Энциклопедия начинающего радиолюбителя» 2011 год. Страница 101…108.

А также ознакомится с содержанием разных сайтов, например здесь.

Из прочитанного надо запомнить: Во-первых, что светодиодные индикаторы бывают с общим анодом или общим катодом. От этого зависит сигнал, подаваемый на индикатор. Если индикатор с общим катодом, то для того чтобы зажечь сегмент необходимо подать положительное напряжение на вывод сегмента при том, что общий будет замкнут на землю. Во-вторых, то, что токоограничительные резисторы необходимо ставить на сигнальных линиях, а не на общей. По поводу подбора этих сопротивлений можно пользоваться простым правилом. Если индикация непрерывная, это когда напряжение подается на индикатор постоянно, то при питании 5 В ставим 470…510 Ом. Если питание 3.3 вольта, то ставим 240…300 Ом. Если для отображения цифр мы используем динамическую индикацию, это когда питание на конкретный индикатор подается эпизодически и быстро переключается, то берем сопротивление от 120 до 200 Ом. И в-третьих, мощные индикаторы подключают не напрямую к МК, а через транзисторы подобранные соответственно потребляемой мощности индикатора.

Теперь давайте соберем схему и подключим индикатор к микроконтроллеру. Если у вас другой индикатор не беда. Необходимо посмотреть описание на него и разобраться, какие выводы отвечают за тот или иной сегмент. Для тех, кто обзавёлся нужным индикатором смотрим схему подключения.

Схема подключения семисигментного индикатора

Схема подключения семисигментного индикатора

Т.к. мы подключаем только один индикатор, то никакого управления для его общей линии нам делать не надо и поэтому общий контакт (выводы 3, 8) мы подтягиваем к питанию 3,3 вольта. Для проверки работоспособности индикатора замкните один из сигнальных проводов, идущих от индикатора через резистор к МК на землю. Если все хорошо, то должен загореться один из сегментов.

У меня подключение выглядит вот так.

Подключение семисигментного индикатора

Подключение семисигментного индикатора

Теперь давайте поподробней рассмотрим принцип вывода данных на один индикатор. Очевидно, что для отображения знака нам надо подать управляющее напряжения на определенные сегменты индикатора. А так как мы не используем специальные дешифраторы и все сегменты подключены к одному порту, то для отображения достаточно записать в порт нужное число. В нашем случае это:

            (0b10001000),         //0
            (0b11101011),         //1
            (0b01001100),         //2
            (0b01001001),         //3
            (0b00101011),         //4
            (0b00011001),         //5
            (0b00011000),         //6
            (0b11001011),         //7
            (0b00001000),         //8
            (0b00001001),         //9

Отсюда видно, что для записи этих чисел нам потребуется 10 переменных. Безусловно можно создать их по отдельности, а потом сделав конструкцию типа if else выбирать необходимую переменную из списка. Но намного проще организовать массив и записать его следующим образом.

        //массив переменных отображения цыфры
        const unsigned char symbol_numer [11] = {
            (0b10001000),         //0
            (0b11101011),         //1
            (0b01001100),         //2
            (0b01001001),         //3
            (0b00101011),         //4
            (0b00011001),         //5
            (0b00011000),         //6
            (0b11001011),         //7
            (0b00001000),         //8
            (0b00001001),         //9
            (0b11111111),         //10 DARK              
        };

Освежить память по теме массивов можно здесь. А я вкратце расскажу о том, как объявлять массив.

	сonst unsigned char symbol_numer [11] = {0b10001000, 0b11101011, 0b01001100, …};

При объявлении массива, как и при объявлении переменной впереди можно поставить необходимый модификатор. В нашем случае это (const). Говорящий нам о том, что этот массив нельзя изменять. Модификатор не обязателен. Но в данном случае он нужен для того что бы случайно не внести изменение в массив и тем самым не нарушить отображения чисел. Также, для МК, актуален модификатор (flash) который указывает компилятору записать массив во флэш память и не переносить его в оперативку при исполнении программы. Это делается в случае если элементы массива заранее определены и не будут изменяться в процессе работы. Применение модификатора (flash) существенно разгружает оперативную память, которой в МК не так уж и много. После модификатора идет указания на тип используемых в массиве данных. Далее имя массива, а вот потом идут квадратные скобки. Они могут оставаться пустыми, тогда длинна массива будет равна количеству инициализируемых значений. Но лучше всегда указывать необходимую длину массива. Про длину массива надо запомнить одно правило. Нумерация элементов массива начинается от нуля. (0, 1, 2, ….) а вот длинна массива при инициализации, это как раз значение в квадратных скобках, считается от единицы. Т.е. если длинна массива будет [10] элементов, то его старший элемент будет иметь порядковый номер (9)! Тут надо быть аккуратным. После знака равно в фигурных скобках происходит инициализация элементов массива. Данные каждого элемента записываются через запятую. Если необходимо написать комментарий к элементам массива, то их можно оформить в виде столбца. Если массив одномерный, то данным будут присвоены номера по порядку начиная с нуля, а если массив многомерный (например, char symbol [3] [3] [3]), то данные будут присваиваться согласно вложенности массива {0/0/0, 0/0/1, 0/0/2, 0/1/0, 0/1/1, 0/1/2, 0/2/0, 0/2/1, … и т.д.}.

Вот в вкратце о массивах в целом. Теперь давайте прикинем как нам используя массив выводить данные на индикатор. Для того чтобы иметь более широкие возможности в отображении чисел необходимо организовать алгоритм вывода чисел как подпрограмму.

Блок схема алгоритма вывода цифр

Блок схема алгоритма вывода цифр

В подпрограмму мы передаем данные о выводимой информации, которая состоит из (data) – номер элемента массива, который необходимо вывести на индикатор и (point) – флаг необходимости отображения точки. Строка

	PORTD = symbol_numer[data]; //Отображение цифры

Вытаскивает необходимый номер элемента из нашего массива и передает ее в порт, а затем в случае если надо отобразить точку, то устанавливается ноль, в бит порта который отвечает за отображение точки. Теперь напишем тестовую программу, которая по нажатию кнопки будет выводить числа от 0 до 9 по порядку.

Блок схема тестовой программы

Блок схема тестовой программы

В приложенный файлах имеется тестовая программа, написанная мной. Для проверки правильного отображения наших цифр запустите ее. У вас должно получится вот так.

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

И да… Не стоит мучится с генератором «случайных чисел». Сделайте его обычным счетчиком от одного до шести счет которого будет прерываться по нажатию кнопки.

У меня это работает вот так.

А на сон грядущий, для расширения кругозора необходимо почитать о блоках питания и о многообразии датчиков:
   С.А. Никулин, А.В. Повный «Энциклопедия начинающего радиолюбителя» 2011 год. Страница 135…155.

На следующем уроке мы подключим трех разрядный семисегментный индикатор и окунемся в принципы динамической индикации. Для этого, помимо того, что у нас есть, нам понадобится:
Индикатор E30361-1-K-8-W – 1 шт.;
Транзисторы кт814 – 3 шт.;
Резисторы 10 кОм – 3 шт.;
Резисторы 1 кОм – 3 шт.


А на сегодня всё. Удачи.


03.10.18



Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.



Приложение:
Схема и проект CV_AVR.