Конвертор систем счисления

Описание

Задача - сделать устройство, конвертирующее двоичное восьмибитное число на входе (шина из 8 переключателей) в десятичное число, выведенное на семисегментный дисплей.

|=center=|

7 сегментный дисплей

Дисплей состоит из сегментов - каждый сегмент это светодиод. Поджигая нужные сегменты, мы формируем цифры. На дисплее 4 символа, в каждом 8 сегментов (восьмой это точка) - всего 32 светодиода. Первое, что бросается в глаза - ног на железяке сильно меньше.

Распиновка дисплея|300
Распиновка дисплея

Имена сегментов одного символа|200
Имена сегментов одного символа

Схема соединения светодиодов
Схема соединения светодиодов

Дело в том, что все аноды(+) идентичных сегментов подключены к одному контакту. В свою очередь, все сегменты одного символа объединены общим катодом(-). Поэтому когда мы подаем напряжение на сегмент А он загорится на тех символах, катод которых подключен к земле. Это можно проверить на и-н-т-е-р-а-к-т-и-в-н-о-й (то есть можно нажимать мышкой или пальцем) схеме внизу.

Наша задача "собирать" нужные нам сегменты на каждом символе (подаем 1 на нужные аноды и 0 на не нужные) подсвечивать его (подаем 0 на нужный катод и 1 на все остальные). Затем проделать то же самое для оставшихся трех. Быстро переключаясь между символами, мы получим иллюзию того, что горит 4 символа одновременно. В общем случае, это называется мультиплексинг.

Сдвиговый регистр 74hc595

Может так случиться, что занимать у микроконтроллера 12 ног вывода окажется накладно (часто у МК нет 12 ног). В реальных проектах, дисплеи подключается через драйвера (вспомогательные железки на плате). Например, в точечную матрицу установлен max7219.
В этой лабораторной мы будем использовать сдвиговый регистр 74hc595 в качестве примитивного драйвера.

Внутренности 74hc595|700
Внутренности 74hc595

Внутри он состоит из флип-флопов расположенных некоторым прикольным образом. Интересующиеся могут поэксперементировать в симуляторе c Verilog.

С этим регистром мы сможем последовательно отправлять данные с микроконтроллера и получать эти данные параллельно на выходе (SIPO)

|=center=|400

То есть, заняв у МК 3 пина(data, clock, latch), мы получим 8 пинов вывода (или больше - сдвиговые регистры можно составлять в цепочки).

У микросхемы два регистра - хранения и сдвига. Первый распаян на ножки вывода. Во второй мы побитово задвагием восьмибитное слово с помощью ножек clock и data. На каждом переходе clock из 0 в 1, микросхема сдвинет все биты в регистре сдвига и в освободившееся место положит значение из пина data (1 или 0).
При сдвиге последний бит не пропадает бесследно - он выдавливается на ногу Q7S - ее можно подключить к data следующей микросхемы в цепи.
Как только мы закончили сдвиг - дергаем latch (защелку) - при переходе из 0 в 1 микросхема перекинет значение из регистра сдвига в регистр хранения (все биты одновременно) - сигнал на ножках обновится мгновенно. Осознать смысл описанного поможет и-н-т-е-р-а-к-т-и-в-н-а-я (то есть можно нажимать мышкой или пальцем) схема:

10101010101010100000

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

Выдержка из главы 12.10.1
Выдержка из главы 12.10.1

Программно, работа с регистром не представляет ничего особенного, понадобится сконфигурировать 3 пина на output и дергать их методом digitalWrite(). Можно использовать утилиту shiftOut

Полезные ссылки

Сдвиговый регистр 74hc165

8 пинов входа это тоже много. Для считывания значения с восьмибитного переключателя, воспользуемся Parallel In Serial Out регистром (PISO). Работает почти так же, как и вышеописанный - через пины data, clock, latch. Только в этом случае data пин будет для микроконтроллера входным.
Обратите внимание на clk inh pin микросхемы - если его оставить в воздухе, наводки приведут к непредсказуемым эффектам.
Внутренней подтяжки у входов нет - поэтому если мы используем кнопки (а переключатели это кнопки), нужно их подтянуть.
Встроенная Arduino функция shiftIn не подходит. Она сначала дергает clock, что в нашем случае лишнее - данные с последнего flip-flop уже лежат на выходе. Поэтому чтобы не терять последний бит - нам нужно сначала его прочитать, потом сдвигать дальше.

Полезные ссылки

Заметки на wokwi

Задачи

2.1 - Запускаем дисплей

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

Подключить 7-сегментный дисплей к микроконтроллеру. Выводить значение с потенциометра, убирая незначащие нули. Значение с потенциометра считывать в некотором интервале, напремер 100ms.

2.2 - Запускаем дисплей через "драйвер"

Подключить 7-сегментный дисплей через сдвиговый регистр. Выводить значение с потенциометра.

2.3 - Считываем значение с переключателя

С помощью 74hc165 считать значение на битовом переключателе (красненький такой). Вывести в Serial.


2.4 - Все готово (Архив)

На дисплее отобразить значение с переключателя.

2.5 - И еще яркость меняется (Архив)

На 74hc595 есть пин OE (Output Enable). Если подать на него ШИМ, можно управлять яркостью дисплея. Значение яркости считывать с Serial в процентах (как это было в лаб. 1.4)