Знакомство с микросхемой регистра сдвига 74HC595 — управление 16 светодиодами
Из этого руководства вы узнаете, как управлять 16 светодиодами используя всего 3 линии управления. Мы осуществим это путем последовательной передачи данных в сдвиговые регистры 74HC595.
Микросхема 74HC595 содержит 8 битный регистр хранения и 8 битный сдвиговый регистр. Данные последовательно передаются в сдвиговый регистр, затем фиксируются в регистре хранения. К регистру хранения подключены 8 выходных линий. На картинке ниже показано расположение выводов микросхемы 74HC595.
Вывод 14 (DS) это вывод данных. В некоторых описаниях он обозначается как «SER».
Когда уровень на выводе 11 (SH_CP, иногда обозначается как SRCLK) переходит из низкого в высокий, значение на выводе DS сохраняется в сдвиговом регистре, при этом данные сдвигаются на один разряд, чтобы предоставить место для нового бита.
Пока на выводе 12 (ST_CP, иногда обозначается как RCLK) низкий уровень, данные записываются в регистр сдвига. Когда уровень переходит в высокий, данные из сдвигового регистра фиксируются в регистре хранения, из которого поступают на выводы Q0…Q7.
На представленной ниже временная диаграмме, показано, каким образом можно установить на выходах Q0…Q7 микросхемы значение 11000011, учитывая что изначально там было значение 00000000.
Ниже показана схема, которую мы соберем в несколько шагов.
Мы используем перфорированную макетную плату с контроллером Atmega8, которую использовали во многих наших проектах. Добавим еще 2 пустых макетных платы и подведем к ним питание.
Установим микросхему регистра сдвига и подключим к ней питание +5 В и общий провод.
Теперь проведем 3 линии управления между микроконтроллером и регистром сдвига, для чего подсоединим:
- PC0 к DS
- PC1 к ST_CP
- PC2 к SH_CP
Этими линиями являются 3 синих провода на картинке ниже.
Затем подключим светодиоды и резисторы. Я использовал резисторы сопротивлением 510 Ом, но допустимы и другие номиналы.
Для демонстрации работы схемы я написал небольшую программу, которая выводит перемещающийся из стороны в сторону огонек на 8 светодиодах.
Все это конечно впечатляет, но разве я не говорил, что мы будем управлять 16 светодиодами? Чтобы сделать это, нам потребуется еще один сдвиговый регистр 74HC595, больше светодиодов, больше резисторов и больше оранжевых и голубых проводов.
Мы используем вывод Q7, чтобы соединить регистры сдвига в одну цепочку.
Модифицированная схема показана ниже.
Мы остановились на 16 светодиодах, но можно соединить в одну цепочку еще больше регистров сдвига. Эта методика конечно не ограничивается управлением светодиодами, ее можно использовать для увеличения числа портов вывода, чтобы управлять другими видами устройств.
Одно предупреждение касательно этой методики. Когда вы включаете схему, на выходах регистров наблюдаются некоторое произвольное значение. Для того чтобы записать требуемое значение, требуется меньше микросекунды, но для некоторых схем это может стать причиной проблем. В этом случае вы должны использовать выводы MR и OE, для сброса регистров хранения.
Управление семисегментным дисплеем с помощью ПЛИС
Привет, Хабр! Хочу внести свою посильную лепту в продвижение ПЛИС. В этой статье я постараюсь объяснить, как на языке VHDL описать устройство, управляющее семисегментным дисплеем. Но перед тем как начать, хочу кратко рассказать о том как я пришел к ПЛИС и почему я выбрал язык VHDL.
Где-то пол года назад решил попробывать свои силы в программировании ПЛИС. До этого со схемотехникой никогда не сталкивался. Был небольшой опыт использования микроконтроллеров (Atmega328p, STM32). Сразу после решения освоиться с ПЛИС, встал вопрос выбора языка, который я буду использовать. Выбор пал на VHDL из-за его строгой типизации. Мне, как новичку, хотелось как можно больше возможных проблем отловить на этапе синтеза, а не на рабочем устройстве.
Почему именно семисегментный дисплей? Мигать светодиодом уже надоело, да и логика мигания им не представляет из себя ничего интересного. Логика управления дисплеем с одной стороны сложнее, чем мигание светодиодом (т. е. писать ее интереснее), а с другой достаточно простая в реализации.
Что я использовал в процессе создания устройства:
- ПЛИС Altera Cyclone II (знаю, что он безнадежно устарел, зато у китайцев его можно купить за копейки)
- Quartus II версии 13.0.0 (на сколько я знаю это последняя версия поддерживающая Cyclone II)
- Симулятор ModelSim
- Семисегментный дисплей со сдвиговым регистром
Задача
Создать устройство, которое будет в цикле показывать числа 0 — 9. Раз в секунду отображаемое на дисплее значение должно увеличиваться на 1.
Реализовать данную логику можно по-разному. Я разделю данное устройство на модули, каждый из которых будет выполнять какое-то действие и результат этого действия будет передаваться следующему модулю.
Модули
- Данное устройство должно уметь отсчитывать время. Для подсчета времени я создал модуль «delay». Этот модуль имеет 1 входящий и 1 исходящий сигнал. Модуль принимает частотный сигнал ПЛИС и, через указанное количество периодов входящего сигнала, меняет значение исходящего сигнала на противоположное.
- Устройство должно считать от 0 до 9. Для этого будет использоваться модуль bcd_counter.
- Для того, чтобы зажечь сегмент на дисплее, нужно выставить в сдвиговом регистре дисплея соответствующий сегменту бит в 0, а для того, чтобы погасить сегмент в бит нужно записать 1 (мой дисплей имеет инвертированную логику). Установкой и сбросом нужных битов будет заниматься декодер bcd_2_7seg.
- За передачу данных будет отвечать модуль transmitter.
Как видно из схемы устройство имеет 1 входящий сигнал (clk) и 3 исходящих сигнала (sclk, dio, rclk). Сигнал clk приходит в 2 делителя сигнала (sec_delay и transfer_delay). Из устройства sec_delay выходит исходящий сигнал с периодом 1с. По переднему фронту этого сигнала счетчик (bcd_counter1) начинает генерировать следующее число для отображения на дисплее. После того, как число сгенерировано, декодер (bcd_2_7seg1) преобразует двоичное представление числа в горящие и не горящие сегменты на дисплее. Которые, с помощью передатчика (transmitter1), передаются на дисплей. Тактирование передатчика осуществляется с помощью устройства transfer_delay.
Для создания устройства в VHDL используется конструкция из двух составляющих entity и architecture. В entity декларируется интерфейс для работы с устройством. В architecture описывается логика работы устройства.
Через поле generic мы можем задать устройству нужную задержку. А в поле ports описываем входящие и исходящие сигналы устройства.
Код внутри секции process исполняется последовательно, любой другой код исполняется параллельно. В скобках, после ключевого слова process указываются сигналы, по изменению которых данный процесс будет запускаться (sensivity list).
Устройство bcd_counter в плане логики выполнения идентично устройству delay. Поэтому на нем я подробно останавливаться не буду.
Вся логика данного устройства выполняется параллельно. О том как получить формулы для данного устройства я рассказывал в одном из видео на своем канале. Кому интересно, вот ссылка на видео.
В сигнал sclk я перенаправляю значение входящего в передатчик сигнала clk, но только в том случае, если устройство в данный момент выполняет передачу данных (сигнал ready = false). В противном случае значение сигнала sclk будет равно 0. В начале передачи данных (сигнал enable = true), я объединяю данные из двух входящих в устройство 8-и битных векторов (digit_pos и digit) в 16-и битный вектор (data_v) и передаю данные из этого вектора по одному биту за такт, устанавливая значение передаваемого бита в исходящий сигнал dio. Из интересного в этом устройстве хочу отметить то, что данные в dio устанавливаются на задний фронт сигнала clk, а в сдвиговый регистр дисплея данные с пина dio будут записаны по приходу переднего фронта сигнала sclk. По завершению передачи, установкой сигнала ready <= true сигнализирую другим устройствам, что передача завершилась.
Это устройство управляет другими устройствами. Здесь, перед объявлением вспомогательных сигналов, я объявляю компоненты которые буду использовать. В самой архитектуре (после ключевого слова begin) я создаю экземпляры устройств:
- sec_delay — экземпляр компонента delay. Исходящий сигнал направляется в сигнал sec_s.
- transfer_delay — экземпляр компонента delay. Исходящий сигнал направляется в сигнал transfer_clk.
- bcd_counter1 — экземпляр компонента bcd_counter. Исходящий сигнал направляется в сигнал bcd_counter_s.
- bcd_to_7seg1 — экземпляр компонента bcd_to_7seg. Исходящий сигнал направляется в сигнал disp_out_s.
- transmitter1 — экземпляр компонента transmitter. Исходящие сигналы направляются в сигналы sclk, dio, tr_ready_s.
Временная диаграмма
Сначала передаются данные “10011111“. Затем передается позиция числа на дисплее “00010000“ (этот параметр приходит в передатчик, как константа X”10”). В обоих случаях первым передается крайний правый бит (lsb).
ФОРМИРОВАТЕЛЬ СИГНАЛА —
RAWR
Самый, простой вариант — во-
обще обойтись без формирователя
(рис.5). Здесь сигнал -RDDATA "по
совместительству" является и сигна-
лом -RAWR, проходя напрямую че-
рез интерфейсный разъем Х1.
Резистор R1
служит нагрузкой
открытого коллек-
тора микросхемы
DD1. Его наличие
обязательно для
всех последующих
схем. Номинал
R1 обычно колеблется в пределах
от 150. 330 Ом (желательно) до 10
кОм. При низких номиналах R1 улуч-
шается согласование волнового со-
противления ленточного кабеля, ко-
торый находится между дисководом
и контроллером. При этом увеличи-
вается крутизна фронта сигнала —
RDDATA.
(Продолжение. Начало в N4/99)
Схема, показанная на рис.5 бу-
дет работать, если имеется полная
уверенность в том, что в конкрет-
ном дисководе длительность сигна-
ла -RDDATA (а значит, и -RAWR) не
превышает 600 нс. Однако дисковод
дисководу рознь. К примеру, соглас-
но техническим данным на НГМД
"Электроника МС5305" [3], макси-
мальная длительность -RDDATA со-
ставляет 1,5 мкс.
Понятно, что приведенная про-
стейшая схема в контроллерах не
прижилась. Очередной шаг напра-
шивается сам собой — сделать
длительность сигнала -RDDATA пос-
тоянной. С этим может справиться
од-новибратор (рис.6).
Длительность выходных импуль-
сов од-новибратора DD2 рассчиты-
вается по приближенной формуле
Ти = 0,45*R1*C1. В схемах обычно
добиваются значения Ти в пре-
делах 200. 300 нс.
Иногда одновибратор стро-
ится по схеме формирователя с
RC-задержкой (рис.7, [5]).
Сигнал RDD (вывод 23 БИС
i8272A) функционально экви-
валентен сигналу -RAWR ВГ93. Его
длительность определяется цепоч-
кой задержки R1, С1. "Необычный"
логический элемент DD1 образован
Следует заметить,
что в схемах рис. 6, 7
импульсы одновибра-
тора никак не связаны
с тактовыми сигнала-
ми контроллера. Это
вносит дополнитель-
ную погрешность в
к импульсам синхронизации FCLK
(рис.8). Поясняющие временные
диаграммы приведены на рис.9.
Длительность сигнала -RAWR
строго нормирована величиной 250
нс независимо от периода (4; 6 или
8 мкс). Тактовые импульсы FCLK
частотой 4 МГц поступают от внут-
реннего кварцевого генератора конт-
роллера. Их период определяет дли-
тельность сигнала -RAWR.
Сдвиг во времени переднего
фронта сигналов -RDDATA и -RAWR
(рис.9) не носит принципиального
характера, поскольку основная ин-
формация переносится периодом
следования сигнала.
Существует несколько разновид-
ностей данной схемы, отличающих-
ся типом применяемого логического
элемента DD2, вплоть до замены его
диодом и резистором. Общим клас-
сифицирующим признаком является
подача сигнала -RDDATA на D-вход
триггера DD1.1.
прошивкой программируемой матри-
цы.
процесс выделения информации.
Как следствие, во многих контролле-
рах схемы были усовершенствова-
ны. В частности, изменить ситуацию
помогает привязка сигнала -RDDATA
В схеме на рис.10 сигнал чтения
подается на С-вход триггера DD2.1.
Логика работы (рис.11) и возмож-
ности схемы от этого не меняются.
Новизна заключается в применении
сигнала WF/DE, блокирующего вы-
дачу импульсов -RAWR в режиме
записи информации. Это может по-
надобиться для корректной работы
некоторых схем формирователя сиг-
нала RCLK.
Еще один нюанс, который заслу-
живает внимания — можно ли "сэ-
кономить" на буферном элементе
DD1.1? Не секрет, что D-триггеры
ТТЛ-серий ТМ2 очень чувствитель-
ны к крутизне фронта импульса на
синхровходе. К примеру, согласно
техническим условиям,
на вход С микросхемы
К555ТМ2 желательно
подавать сигналы с
длительностью фрон-
та и среза не более 15
нс.
Учитывая это, эле-
мент DD1.1 нужен, а
вот устанавливаемый в некоторых
схемах конденсатор С1 (отмечен
пунктиром) — под вопросом. Если
С1 удаляет "иголки" сигнала, то сто-
ит вначале попытаться уменьшить
номинал резистора R2.
Схемы на рис.8, 10 относятся к
разряду "четырехмегагерцовых"^
CLK). В некоторых контроллерах
имеется дополнительно частота 8
МГц. Разработчики не преминули
воспользоваться такой возможнос-
тью, что позволило уменьшить дли-
тельность сигнала -RAWR до 125 нс
(рис.12, [6]).
Микросхема DD2 содержит син-
хронно тактируемые D-триггеры.
Временные диаграммы (рис.13) по-
казаны для случая WF/DE=0, т.е. для
режима чтения.
Закономерен вопрос, а зачем
вообще нужно уменьшать длитель-
ность сигнала -RAWR? Ответ дает
рис.14, на котором показаны вре-
менные соотношения в "окне детек-
тирования" согласно техническим
данным на ВГ93 [4].
Запас "окна детектирования"
(ЗП) определяется по формуле
ЗП = ±(Т/2 — х1 — т2 — Ти)/2.
Ти — это не что иное как дли-
тельность сигнала -RAWR. Если
принять т1 = т2 = 40 нс, то для Ти
= 125 нс значение ЗП равно +897
мкс (+0.224Т), а для Ти — 250 нс
ЗП равно ±835 мкс (+0.209Т).
Следовательно, схема на рис.12
теоретически имеет на 7,4% боль-
ший запас "окна детектирования",
чем схемы на рис.8,10, что позволя-
ет ближе подойти к пределу +0.25Т.
Нередко встречаются "гибрид-
ные" схемы, у которых -RAWR рас-
щепляется на два сигнала: один из
них, длительностью 250 нс, подается
на вывод 27 ВГ93; другой, длитель-
ностью 125 нс — на схему выделе-
ния синхросерии. К чему это приво-
дит, станет ясно при рассмотрении
схемотехники формирования сигна-
ла RCLK.
ФОРМИРОВАТЕЛЬ СИГНАЛА
RCLK
Изложение данного материала в
радиолюбительских статьях обычно
сопровождается кратким описанием
принципа работы, иногда — графом
переходов [6]. Думается, этого недо-
статочно, ведь за общими фразами
не видно физики процесса, а вузов-
ская подготовка имеется далеко не у
каждого. Отсюда путаница в поняти-
ях, отсутствие какой-либо классифи-
кации.
Динамическая индикация и 7 сегментный индикатор, модуль на двух 74HC595, код из видео
4bit Digital Tube LED Display Module — Обзор модуля с семисегментным индикатором и двумя сдвиговыми регистрами 74HC595. разберем работу с динамической индикацией.
Особенности модуля:
Модуль базируется на двух сдвиговых регистрах TM74HC595 к которым подключен 4х разрядный 7 сегментный индикатор ZS3641BS. Схема похожего модуля, с двумя индикаторами ZS3641BS и 8 сегментами ниже, отличие только в дополнительном индикаторе.
Один TM74HC595 управляет сегментами, причем всеми разом, ибо они все параллельны, а второй управляет разрядами. Если на один регистр отправить байт, в котором будет символ, он будет на всех четырех разрядах, но отобразится на том, который будет включен вторым регистром, и соответственно для этого, на него нужно отправить второй байт.
Динамическая индикация:
Для отображения всех разрядов применяется динамическая индикация, что это и как работает показано в видео ниже.
Подключение модуля к Arduino:
Подключать индикатор можно на любые свободные выходы Arduino, питание у модуля 5 вольт.
Для работы с модулем можно использовать код выше, можно использовать библиотеки, например эту.