что такое сдвиговый регистр
Электроника для всех
Блог о электронике
Сдвиговый регистр
Иногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело ATMega128 с ее полусотней выводов? Избыточно — для ламеров. Ставить i 2 с расширитель портов? Дорого. Для мажоров. Тут на помощь из вековых глубин выплывает старая добрая дискретная логика. На этот раз нас выручит грошовый сдвиговый регистр. Возьму, для примера, 74HC164 он же, для любителей совковых трешевых микросхем в неубиваемом каменном корпусе, наш КM555ИР8.
От МК, как видно, требуется только четыре выхода. Одним (RESET) мы сбрасываем состояние регистра. Из второго (Data) побитно вылазит байтик, а тактовый CLC обеспечивает продвижение битов по регистру. Самих регистров тут три. Они сцеплены паровозом. Когда переполняется первый, то биты из него вылазят во второй, потом в третий. Итого, 24 вывода.
Катоды диодов подключены все вместе через транзистор и как только будет слово мы подаем сигнал Ready и зажигаем всю эту ботву.
Наполнять регистр просто:
1) Поднимаем и держим RESET в 1
2) Выдаем первый (старший) бит на Data.
3) Опускаем в 0 и поднимаем в 1 тактовый выход. На восходящем фронте происходит занос в регистр и сдвиг всей цепочки на один шаг.
4) Повторить со второго пункта пока все биты не выдадим.
А для сброса достаточно уронить Reset в ноль на пару микросекунд.
Все просто 🙂
Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
120 thoughts on “Сдвиговый регистр”
mc14094 получше
я управлял 3мя индикаторами по 2м проводам
Что такое регистр?
Регистр. Регистр сдвига
Регистр это устройство, выполненное на триггерах для выполнения ряда действий с двоичными числами. Для тех, кто не знает, что такое триггер, рекомендуем познакомиться с простейшим RS-триггером.
Обычно используются регистры, состоящие из 4, 8, или 16 триггеров. Изображение четырёхразрядного регистра на принципиальных схемах может быть таким.
На рисунке не показаны инверсные выхода триггеров и сигнал R. Регистры всегда обозначаются латинскими буквами RG. Если регистр сдвигающий, то под обозначением рисуется стрелка направленная влево, вправо или двойная.
Сдвигающие регистры или регистры сдвига.
Регистр сдвига это устройство, состоящее из нескольких последовательно соединённых триггеров, число которых определяет разрядность регистра. Регистры широко используются в вычислительной технике для преобразования кодов. Параллельного в последовательный и наоборот.
Кроме того сдвигающие регистры являются основой (АЛУ) арифметико-логического устройства, так как при сдвиге записанного в регистр двоичного числа на один разряд влево производится умножение числа на два, а при сдвиге числа на один разряд вправо число делится на два. Поэтому наибольшее распространение получили реверсивные или двунаправленные регистры.
Регистр работает следующим образом. Первый информационный бит поступает на вход D0. Одновременно с этим битом приходит тактовый синхроимпульс на вход С. Входы С всех триггеров входящих в регистр, объединены между собой. С приходом первого тактового импульса уровень, находящийся на входе D0 записывается в первый триггер и с выхода Q0 приходит на вход следующего триггера, но записи во второй триггер не происходит, так как синхроимпульс уже закончился.
При поступлении следующего тактового импульса уровень, присутствующий на входе второго триггера запоминается в нём и поступает на вход третьего триггера. Одновременно следующий информационный бит запоминается в первом триггере. После прихода четвёртого тактового импульса в четырёх триггерах регистра будут записаны логические уровни, которые последовательно поступали на вход D0.
Допустим это уровни 01102. Тогда это двоичное число можно отобразить, подключив к выходам триггеров светодиоды. Так рассмотренный регистр изображается на принципиальной схеме.
Регистр содержит четыре D-триггера, которые соединены между собой с помощью дополнительных логических элементов И – ИЛИ, которые позволяют реализовать различные функции. На схеме:
V2 – вход управления. С его помощью выбирается режим работы регистра.
Q1 – Q4 выходы триггеров с которых снимается параллельный код.
V1 – вход для подачи последовательного кода.
C1, C2 – тактовые синхроимпульсы.
D1 – D4 – входы для записи параллельного кода.
Алгоритм работы регистра следующий. Если на вход V2 подать низкий потенциал, тактовые импульсы на C1, а на вход V1 подавать информационные биты, то регистр осуществляет сдвиг вправо. После приёма четырёх разрядов на выходах триггеров Q1 – Q4 мы получаем параллельный код. Таким образом осуществляется преобразование последовательного кода в параллельный.
Для обратного преобразования параллельный код записывается по входам D1 – D4, с подачей на вход V2 высокого потенциала и тактовых импульсов на вход С2. Затем подавая на вход V2 низкий потенциал, а тактовые импульсы на вход С1 мы сдвигаем записанный код, а с выхода последнего триггера снимается последовательный код.
По своей структуре это один из самых простых регистров сдвига.
Регистры сдвига в цифровой технике могут послужить основой, на которой собираются узлы с интересными свойствами. Это, например, кольцевые счётчики, которые называются счётчики Джонсона. Такой счётчик имеет количество состояний вдвое большее, чем число составляющих его триггеров. Например, если кольцевой счётчик состоит из трёх триггеров, то он будет иметь шесть устойчивых состояний. На вход счётчика ничего не подаётся кроме синхроимпульсов. В первоначальном состоянии все триггеры «сброшены», то есть на прямых выходах триггеров логические нули, а вот на входе D первого триггера с инверсного выхода третьего триггера находится логическая единица. Начнём подавать тактовые импульсы и процесс пошёл.
На таблице истинности хорошо видно, как изменяется двоичный код при поступлении шести тактовых импульсов.
N | Q2 | Q1 | Q0 |
---|---|---|---|
1 | 0 | 0 | 1 |
2 | 0 | 1 | 1 |
3 | 1 | 1 | 1 |
4 | 1 | 1 | 0 |
5 | 1 | 0 | 0 |
6 | 0 | 0 | 0 |
Всё о сдвиговом регистре
Ардуино: всё о сдвиговом регистре
Сдвиговый регистр — очень распространенное устройство, которое часто применяется для упрощения работы с сегментными индикаторами, с линейками и с матрицами светодиодов. Все эти устройства состоят из множества светодиодов, и если управлять ими напрямую, потребуется занять много выводов контроллера. К примеру, для подключения обычного сегментного индикатора необходимо задействовать восемь выводов. Два таких индикатора займут уже 16 ног Ардуино.
Регистр позволяет нам увеличить количество цифровых выводов микроконтроллера, и мы сможем управлять любым количеством светодиодов, реле, зуммеров и любых других цифровых устройств.
В электронике регистром называют устройство, которое может хранить небольшой объем данных для быстрого доступа к ним. Они есть внутри каждого контроллера и микропроцессора, включая и микроконтроллер Atmega328 — сердце Ардуино Уно. Как правило регистры представляют собой сборку из D-триггеров — элементарных ячеек памяти, с которыми мы уже встречались в отдельном уроке. Записывать данные в регистр можно либо последовательно, либо параллельно. Регистры первого типа называются сдвиговыми, второго типа — параллельными.
Считывать данные из регистра можно одновременно из всех ячеек. Именно это его свойство помогает нам работать с кучей светодиодов.
Принцип работы РСЛОС
Введение
Регистр сдвига с линейной обратной связью (РСЛОС, англ. Linear Feedback Shift Register, LFSR) — сдвиговый регистр битовых слов, у которого значение входного бита однозначно задается некоторой функцией, исходя из значений остальных битов регистра до сдвига. Регистр сдвига может представлять собой некоторую электрическую схему, составленную из дискретных компонентов: транзисторов, резисторов, также может быть интегрирован в микросхему или же реализован в программе. Добавление обратной связи превращает регистр сдвига в генератор псевдослучайных чисел, который находит широкое применение в криптографии. В статье мы разберем принцип работы РСЛОС от hardware до различных его применений.
Регистр, в общем случае – это схема, состоящая из связанных между собой однобитовых элементов памяти. Такие схемы умеют записывать, хранить, считывать n-разрядные двоичные данные. В статье рассматривается вид регистра, называемый регистром сдвига. Чаще всего регистр сдвига собирается на основе последовательно соединенных D-триггеров, притом количество этих триггеров равно числу разрядов n. С принципов работы D-триггера мы и начинаем статью.
D-триггер
Кратко затронем самые основы. Глобально, электронику можно разделить на два раздела: аналоговый и цифровой. Принципиальная особенность второго заключается в том, что сигналы задаются дискретными уровнями напряжения. Притом дискретных уровня всего два. Таким образом, вместо того, чтобы записывать напряжение в вольтах, достаточно просто называть один из двух дискретных уровней. Так и появляются названия «ноль» и «единица». В действительности, они определяют некоторые уровни напряжения, которые могут быть какими угодно. Хотя, в большинстве случаев, «ноль» обозначает уровень 0 Вольт, а «единица» уровень 5 В, 3.3 В, 1.8 В, 1.5 В и т.д. Таким образом, фраза «на входе ноль, на выходе единица» обозначает: «на входе напряжение, соответствующее уровню ноль, на выходе напряжение, соответствующее уровню единица».
Двигаемся далее. Теперь у нас есть цифровой сигнал, что же интересного можно с ним сделать? Подать на D-триггер и посмотреть, что будет! Но сначала дадим пару определений.
Триггер – электронное устройство, обладающее способностью длительно находиться в одном из двух устойчивых состояний и чередовать их под воздействием внешних сигналов.
D-триггер – триггер, сохраняющий состояние входа. Притом, это состояние отображается на выходе
На электрической схеме устройства D-триггер выглядит ровно так же, как на рисунке ниже. Такой вид триггера обязательно имеет три вывода: D (вход), C (вход синхронизации, вход тактирования, тактовый вход, clk, clock) и Q (выход). Помимо них могут иметься еще: инвертированный выход, входы сброса и установки значения на выходе, вход разрешения работы. Однако, суть работы заключается именно во взаимодействии трех обязательных выводов, поэтому именно их мы и рассмотрим.
Принцип работы D-триггера следующий: при подаче тактового сигнала на вход C, состояние на выходе становится равным состоянию на входе. Т. е. если в какой-то момент времени на входе был «ноль», а на выходе «единица», то в момент подачи тактового сигнала выход примет состояние входа и станет «нулём».
Сдвиговый регистр 74HC595
Плата Arduino содержит ограниченное число выводов и при сложном проекте их не хватает для полноценной работы. К примеру, для подключения сегментного индикатора необходимо задействовать восемь выводов, два индикатора займут уже 16 выводов. Сдвиговый регистр позволяет сэкономить число используемых выводов, беря часть управления выводами на себя.
Что такое сдвиговый регистр
В электронике регистром называют устройство, которое может хранить небольшой объем данных для быстрого доступа к ним. Они есть внутри каждого контроллера и микропроцессора, включая и микроконтроллер Atmega328, который входит в состав платы Arduino Uno. Как правило регистры представляют собой сборку из D-триггеров — элементарных ячеек памяти. Записывать данные в регистр можно либо последовательно, либо параллельно. Регистры первого типа называются сдвиговыми, второго типа — параллельными.
Считывать данные из регистра можно одновременно из всех ячеек. Именно это его свойство помогает нам работать с кучей светодиодов.
Регистр называется сдвиговым, потому что при добавлении каждого нового бита в него, мы как бы сдвигаем все остальные в сторону. Вспомним, что один бит позволяет нам хранить ноль или единицу, истину или ложь. Посмотрим на диаграмме, как это происходит.
Пусть в начальном состоянии регистр уже заполнен какими-то восемью битами. Попробуем «задвинуть» в него восемь новых бит: 11011010.
Как видно, после двух итераций, в начале регистра оказалось два новых бита, а два бита в последних ячейках «вывалились» через край и пропали. На восьмом шаге весь регистр оказался заполнен новыми битами.
Регистры можно соединять в цепочку. В таком случае, вытесненный бит не будет пропадать без следа, а отправится в начало следующего регистра. При этом увеличивается число доступных выводов.
74HC595
Самым популярным является восьмиразрядный (8 управляемых выходов) сдвиговый регистр 74HC595 (отечественный аналог КР1564ИР52), который можно встретить в стартовых наборах или купить отдельно.
74HC595 — восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защёлкой и тремя состояниями на выходе. Другими словами этот регистр позволяет контролировать 8 выходов, используя всего несколько выходов на самом контроллере. При этом несколько таких регистров можно объединять последовательно для каскадирования.
74HC595 может отдавать сигналы не только параллельно, но и последовательно. Это необходимо при объединении нескольких регистров, для получения 16 и более выходов. В этом случае первые 8 бит сигнала передаются на следующий регистр для параллельного вывода на нём.
Соберём схему, для которой понадобится сдвиговый регистр и восемь светодиодов с резисторами. При этом обратите внимание, что в нашем распоряжении восемь выводов регистра для светодиодов, а на плате используем только три цифровых вывода (экономия пяти выводов).
Установите сдвиговый регистр в центре макетной платы, чтобы ножки разделяла центральная разделительная дорожка.
Подключим контакты 16 (VCC) и 10 (MR) к выводу 5V на Arduino.
Соединяем контакты 8 (GND) и 13 (OE) с выводом GND на Arduino.
Соединяем три контакта, которыми мы будем управлять сдвиговым регистром:
Далее подключаем все восемь светодиодов с резисторами. Обратите внимание, что у регистра с одной стороны идут семь выводов подряд, а восьмой находится на выводе 15.
Вариант подключения (используются другие выводы платы).
Включаем один светодиод
В setup() устанавливаем для них режим OUTPUT и ставим защёлке высокий уровень, чтобы регистр не принимал сигналов.
В loop() попробуем что-нибудь отправить на регистр. Сначала ставим LOW на защёлку (начинаем передачу данных. Теперь регистр принимает сигналы с Arduino). Далее отправляем данные в двоичном виде. Например, отправим байт 0b10000000 (должен будет загореться первый светодиод). В конце выставляем HIGH на защёлку (заканчиваем передавать данные).
Если в shiftOut() поменять LSBFIRST на MSBFIRST, то включится не первый, а последний светодиод в цепочке схемы.
При работе с несколькими светодиодами не очень удобно постоянно писать три строчки кода для каждого светодиода в отдельности. Поэтому оформим код в виде функции и будем мигать третьим светодиодом.
Анимация светодиодов
В path[] мы указываем последовательность включённых и выключенных светодиодов. Между этими последовательностями будет происходит анимация.
Для анимации бегущих огней можно реализовать задачу через функцию bitWrite().
Код попроще, чтобы лучше понять происходящее.
В методе setup() мы просто инициализируем режимы выводов и переменную светодиодов.
В методе loop() очищаем биты в переменной leds в начале каждой итерации, так что все биты устанавливаются в 0, так как мы хотим только включать один светодиод за раз. После этого мы увеличиваем или перезапускаем текущую переменную currentLed, чтобы затем опять включать правильный светодиод.
После этих двух операций мы переходим к смещению бит. Начинаем с вызова метода bitSet(), которому передаём байт, что хранит биты, и переменную currentLed.
Этот метод позволяет нам установить отдельные биты байта, указав их положение. Например, если мы хотим вручную установить байт в 10010, мы могли бы использовать следующие вызовы, поскольку биты, которые нам нужно установить в 1, являются вторыми справа (это позиция 1, когда мы начинаем в позиции 0) и пятый справа, который находится в положении 4:
Таким образом, каждый раз, когда мы увеличиваем текущую переменную currentLed и передаем ее методу bitSet(), мы каждый раз устанавливаем бит слева от предыдущего до 1 и, таким образом сообщаем сдвиговому регистру активировать вывод слева от предыдущего.
После установки бит мы записываем на контакт защёлки указание сдвиговому регистру, что собираемся отправить ему данные. Как только мы это сделаем, мы вызываем метод shiftOut(). Метод позволяет сдвигать биты за один вызов. Для этого мы передаём данные и синхронизацию в качестве первых двух параметров, затем передаём константу LSBFIRST, которая сообщает методу, что первый бит должен быть наименее значимым, а затем мы проходим через байт, содержащий биты, которые мы действительно хотим перенести в регистр сдвига.
Как только мы закончим смещение битов, мы снова обращаемся на контакт защёлки (используя HIGH в этот раз), чтобы указать, что мы отправили все данные. После того, как операция записи будет завершена, загорится соответствующий светодиодный индикатор, а затем задержится на 250 миллисекунд, прежде чем всё повторится.
Последовательное соединение сдвиговых регистров
Для последовательного подключения большого количества сдвиговых регистров используется Q7 регистра — по нему данные продавливаются по мере поступления. Выходы 11 (SH_CP, задающий тактовые импульсы) и 10 (ST_CP, «защелка») подключаются параллельно и управляются синхронно.
Как же использовать ШИМ, ведь мы же часто управляем при помощи регистра светодиодами, а выходы регистра могут иметь только 3 состояния — логический ноль LOW, логическая единица HIGH и высокоимпедансное состояние (пин не имеет физического контакта с электрической цепью). И действительно ШИМ сдвиговым регистром не поддерживается, но есть одна небольшая хитрость — мы можем использовать выход регистра OE (Output Enable input) — он отвечает за переключение из высокомного состояния в ноль. Выход OE — можно назвать логическим нолем для всех выходов. Таким образом, если мы подключим этот пин к ШИМ-выходу Arduino, то сможем таким образом смещать логический ноль, тем самым имитировать ШИМ на светодиодах.
Минус данного подхода заключается в том, что в этом случае регулируется яркость всех светодиодов, подключённых к одному сдвиговому регистру. А что же делать, если нам нужно показать разную яркость светодиодов, подключённых к одному сдвиговому регистру. Здесь снова нужно будет пойти на хитрость — создать карту яркостей светодиодов, и зажигать каждую группу со своей яркостью по очереди, так быстро, чтобы создавалось ощущение постоянного свечения:
Но если вы начнёте экспериментировать с задержками и большим количеством карт яркости, то столкнётесь с очень неприятным эффектом мерцания — это связно с большим временем исполнения стандартных для языка Arduino функций-обёрток типа digitalWrite, digitalRead, analogWrite, analogRead и т.д.
Другие регистры, например, STP16C596 могут управлять 16 светодиодами одновременно без использования дополнительных резисторов.