Описание
Задача - сделать устройство, конвертирующее двоичное восьмибитное число на входе (шина из 8 переключателей) в десятичное число, выведенное на семисегментный дисплей.
7 сегментный дисплей
Дисплей состоит из сегментов - каждый сегмент это светодиод. Поджигая нужные сегменты, мы формируем цифры. На дисплее 4 символа, в каждом 8 сегментов (восьмой это точка) - всего 32 светодиода. Первое, что бросается в глаза - ног на железяке сильно меньше.
Дело в том, что все аноды(+) идентичных сегментов подключены к одному контакту. В свою очередь, все сегменты одного символа объединены общим катодом(-). Поэтому когда мы подаем напряжение на сегмент
А он загорится на тех символах, катод которых подключен к земле. Это можно проверить на и-н-т-е-р-а-к-т-и-в-н-о-й (то есть можно нажимать мышкой или пальцем) схеме внизу.Наша задача "собирать" нужные нам сегменты на каждом символе (подаем 1 на нужные аноды и 0 на не нужные) подсвечивать его (подаем 0 на нужный катод и 1 на все остальные). Затем проделать то же самое для оставшихся трех. Быстро переключаясь между символами, мы получим иллюзию того, что горит 4 символа одновременно. В общем случае, это называется мультиплексинг.
Сдвиговый регистр 74hc595
Может так случиться, что занимать у микроконтроллера 12 ног вывода окажется накладно (часто у МК нет 12 ног). В реальных проектах, дисплеи подключается через драйвера (вспомогательные железки на плате). Например, в точечную матрицу установлен max7219.
В этой лабораторной мы будем использовать сдвиговый регистр 74hc595 в качестве примитивного драйвера.
Внутри он состоит из флип-флопов расположенных некоторым прикольным образом. Интересующиеся могут поэксперементировать
С этим регистром мы сможем последовательно отправлять данные с микроконтроллера и получать эти данные параллельно на выходе (SIPO)
То есть, заняв у МК 3 пина(
data, clock, latch), мы получим 8 пинов вывода (или больше - сдвиговые регистры можно составлять в цепочки).У микросхемы два регистра - хранения и сдвига. Первый распаян на ножки вывода. Во второй мы побитово задвагием восьмибитное слово с помощью ножек clock и data. На каждом переходе clock из 0 в 1, микросхема сдвинет все биты в регистре сдвига и в освободившееся место положит значение из пина data (1 или 0).
При сдвиге последний бит не пропадает бесследно - он выдавливается на ногу Q7S - ее можно подключить к data следующей микросхемы в цепи.
Как только мы закончили сдвиг - дергаем latch (защелку) - при переходе из 0 в 1 микросхема перекинет значение из регистра сдвига в регистр хранения (все биты одновременно) - сигнал на ножках обновится мгновенно. Осознать смысл описанного поможет и-н-т-е-р-а-к-т-и-в-н-а-я (то есть можно нажимать мышкой или пальцем) схема:
По уму, при подключении дисплея желательно подключать катоды через транзистор, но в этой лабораторной и так много проводов, поэтому я не настаиваю.
Программно, работа с регистром не представляет ничего особенного, понадобится сконфигурировать 3 пина на output и дергать их методом digitalWrite(). Можно использовать утилиту shiftOut
Полезные ссылки
Сдвиговый регистр 74hc165
8 пинов входа это тоже много. Для считывания значения с восьмибитного переключателя, воспользуемся Parallel In Serial Out регистром (PISO). Работает почти так же, как и вышеописанный - через пины data, clock, latch. Только в этом случае data пин будет для микроконтроллера входным.
Обратите внимание на clk inh pin микросхемы - если его оставить в воздухе, наводки приведут к непредсказуемым эффектам.
Внутренней подтяжки у входов нет - поэтому если мы используем кнопки (а переключатели это кнопки), нужно их подтянуть.
Встроенная Arduino функция shiftIn не подходит. Она сначала дергает clock, что в нашем случае лишнее - данные с последнего flip-flop уже лежат на выходе. Поэтому чтобы не терять последний бит - нам нужно сначала его прочитать, потом сдвигать дальше.
Полезные ссылки
Задачи
2.1 - Запускаем дисплей
Если по теории все понятно, можно прыгнуть сразу на следующую задачу
Подключить 7-сегментный дисплей к микроконтроллеру. Выводить значение с потенциометра, убирая незначащие нули. Значение с потенциометра считывать в некотором интервале, напремер 100ms.
2.2 - Запускаем дисплей через "драйвер"
Подключить 7-сегментный дисплей через сдвиговый регистр. Выводить значение с потенциометра.
2.3 - Считываем значение с переключателя
С помощью 74hc165 считать значение на битовом переключателе (красненький такой). Вывести в Serial.
2.4 - Все готово (Архив)
На дисплее отобразить значение с переключателя.
2.5 - И еще яркость меняется (Архив)
На 74hc595 есть пин OE (Output Enable). Если подать на него ШИМ, можно управлять яркостью дисплея. Значение яркости считывать с Serial в процентах (как это было в лаб. 1.4)