Регистры сдвига основная схема принцип действия. Последовательные (сдвиговые) регистры. DS – вход данных

Одной из проблем, возникающих при разработке микроконтроллерных устройств часто становится необходимость экономии линий портов ввода/вывода. Многие периферийные устройства, которые могут работать в связке с процессором, требуют для передачи информации большого количества соединительных проводников. Актуальность этой задачи не снизилась даже с появлением процессоров с большим количеством выводов, так как одновременно усложнились и периферийные устройства. Для устройств индикации, одним из вариантов снижения количества требуемых линий может стать использование регистров сдвига (Shift register).

Регистр сдвига представляет собой цепочку из нескольких, последовательно соединенных D-триггеров. На первый триггер подключается информационный выход микроконтроллера. С каждым импульсом тактового сигнала, передаваемого по отдельной линии, уровень на входе каждого из триггеров записывается на выход. В итоге происходит сдвиг сигнала от начала к концу цепочки. Если использовать подключить выходные линии после каждого из триггеров, то сдвиговый регистр будет представлять собой последовательно-параллельный преобразователь. Это значит, что для организации каких-либо индикаторов, будет минимально необходимо использовать только два вывода микроконтроллера.

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

Использование регистра 74164

Регистр сдвига

Одной из наиболее простых и распространенных микросхем, реализующих функцию регистра сдвига, считается модель 74164 (555ИР8) и ее технологические варианты. Данная микросхема представляет собой 8-ми разрядный регистр с последовательной загрузкой и параллельным выходом. Используя 74164 можно сравнительно просто получить линейный индикатор из 8-ми светодиодов или односимвольный семисегментный индикатор. При необходимости, допускается последовательное соединение нескольких микросхем, что увеличит количество выходных линий, и подключенных к ним индикаторов.

Выходной ток каждой линии современных вариантов 74ACT164 и 74HCT164 составляет 25мА, что позволяет напрямую подключать маломощные одиночные светодиоды или семисегментные индикаторы. Время цикла этих микросхем может находиться на уровне 15нС, что соответствует возможности работы на частоте 66МГц. Учитывая, что подобная или более высокая частота работы процессоров встречается редко, для формирования тактовых импульсов достаточно просто включить и выключить выход контроллера, без какой-либо задержки.Для загрузки данного регистра сдвига достаточно двух линий: DATA и CLK. Это позволяет задействовать только две линии микроконтроллера, для управления устройством индикации. При этом во многих случаях может оказаться не важно, сколько микросхем будет соединено последовательно, и соответственно сколькими индикаторами управляет контроллер.

Вариантов использования 74164 существует множество. Можно выделить несколько из них. Первый, вышеназванный индикатор на основе нескольких светодиодов. Второй – одиночный семисегментный индикатор или линейка из них. Пример линейки индикаторов показан в статье – Термометр на микроконтроллере PIC12F629 .

Программирование индикации с использование регистра сдвига также не отличается высокой сложностью. Особенно если в микроконтроллере реализована такая операция, как сдвиг байта через бит переноса. Проверкой данного бита можно определить уровень, который требуется установить на линии данных. Циклически повторяя такой сдвиг и формируя тактовые импульсы можно полностью загрузить регистр сдвига.Следующим вариантом использования может стать схема динамической индикации, когда для снижения количества используемых линий микропроцессора, параллельный вывод на отдельные сегменты, заменяется на последовательный, с использованием последовательно-параллельного преобразователя. Этот же преобразователь может использоваться в схеме включения ЖК-индикатора на базе HD44780.

Использование регистров 74595 и 4094

Применение регистров сдвига позволяет строить большие схемы с использованием светодиодных индикаторов. Но в случае, если индикаторы потребляют большой ток (состоят из множества отдельных светодиодов), выходного сигнала регистра становится недостаточно. Для усиления сигнала можно применять различные схемы, состоящие из отдельных транзисторов, или сборок. Наиболее просто и выгодно в этом случае использовать микросхему ULN2803, содержащую 8 транзисторных ключей. Каждый ключ способен коммутировать ток до 500мА при напряжении до 50В, что позволяет подключать к нему до нескольких десятков отдельных светодиодов, маломощных ламп накаливания, либо сегменты крупногабаритных матричных индикаторов. Единственным отличием от вышеприведенных схем, будет использование светодиодных индикаторов с общим анодом, так как ULN2803, по сути, представляет собой ключ нижнего плеча.При всех своих достоинствах, микросхема 74164 имеет некоторые недостатки. В первую очередь к ним следует отнести непосредственное подключение выходов схемы к выходным линиям триггеров. В медленных системах светодиодной индикации, при загрузке регистра, можно наблюдать движение информации от входа к выходу в виде посторонней засветки сегментов. В случае частого обновления информации, подобная засветка вызывает несколько неприятные ощущения. Для ее устранения следует применять регистры, оснащенные выходной защелкой. Примером таких элементов служат микросхемы 74595 и 4094. Каждая из них имеет дополнительный вход стробирования SCLK. При неизменном принципе загрузки, информация на выходе этих устройств сможет появиться только после прохождения импульса по данному входу. Такое решение требует использования дополнительного вывода микроконтроллера, но позволяет строить индикаторы с большим количеством сегментов, без появления различных неприятных эффектов. Особенно полезно использование регистров, оснащенных защелками совместно с микроконтроллерами, работающими на пониженных частотах или от внутренних генераторов.

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

You have no rights to post comments

Регистры сдвига или сдвиговые регистры (англ. shift register) представляют собой, последовательно соединенную цепочку триггеров.

Т.е. в сдвиговых регистрах все триггеры соединены в последовательную цепочку (выход каждого предыдущего триггера соединен со входом D следующего триггера). Тактовые входы всех триггеров (С) объединены между собой. В результате такой триггер может рассматриваться как линия задержки, входной сигнал которой последовательно перезаписывается из триггера в триггер по фронту тактового сигнала С. Информационные входы и выходы триггеров могут быть выведены наружу, а могут и не выводиться - в зависимости от функции, выполняемой регистром.

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

На схемах символом регистра служат буквы RG. Для регистров сдвига указывается также направление сдвига:

· → вправо (основной режим, который есть у всех сдвиговых регистров);

· ← влево (этот режим есть только у некоторых, реверсивных сдвиговых регистров);

· ↔ реверсивный (двунаправленный), т. е. записанную информацию можно сдвигать по линейке триггеров вправо или влево. Для включения режима сдвига предусматривают специальный управляющий вход.

Направление сдвига отражают внутреннюю структуру регистров сдвига (Рис. 4.14) и перезапись сигналов последовательно по цепочке триггеров. При этом триггеры, вполне естественно, нумеруются слева направо, например, от 0 до 7 (или от 1 до 8) для 8-разрядных регистров. В результате сдвиг информации регистром вправо представляет собой сдвиг в сторону разрядов, имеющих большие номера, а сдвиг информации регистром влево - это сдвиг в сторону разрядов, имеющих меньшие номера.

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

Регистры сдвига могут выполнять функции хранения и преобразования информации.

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


Регистры сдвига широко используются для выполнения различных временных преобразований цифровой информации: последовательное накопление последовательной цифровой информации с последующей одновременной выдачей (преобразование последовательной цифровой информации в параллельный код) или одновременный прием (параллельный прием) информации с последующей последовательной выдачей (преобразование параллельного кода в последовательный).

Регистры сдвига могут служить также в качестве элементов задержки сигнала, представленного в цифровой форме: регистры с последовательным приемом (вводом) и выводом осуществляют задержку передачи информации на m+1 тактов (m+1 - число разрядов регистра) машинного времени.

Регистры сдвига чаще все6го реализуются на D-триггерах (Рис.4.15, а) или на RS-триггерах (Рис.4.15, б), где для ввода информации в первый разряд включается инвертор (первый разряд представляет собой D-триггер).

Следует отметить, что все регистры сдвига строятся на базе двухступенчатых триггеров или синхронизируемых фронтом синхроимпульса.

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

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

Работу регистра сдвига рассмотрим на примере схемы, приведенной на Рис. Рис.4.15.

Можно предположить, что в начале все триггеры регистра находятся в состоянии логического нуля, т.е. Q0=0, Q1=0, Q2=0, Q3=0. Если на входе D-триггера Т1 имеет место логический 0, то поступление синхроимпульсов на входы «С» триггеров не меняет их состояния.

Как следует из Рис.4.15, синхроимпульсы поступают на соответствующие входы всех триггеров регистра одновременно и записывают в них то, что имеет место на их информационных входах. На информационных входах триггеров Т2, Т3, Т4 - уровни логического «0», т.к. информационные входы последующих триггеров соединены с выходами предыдущих триггеров, находящихся в состоянии логического «0», а на вход «D» первого триггера, по условию примера, подается «0» из внешнего источника информации.

При подаче на вход «D» первого триггера «1», с приходом первого синхроимпульса, в этот триггер запишется «1», а в остальные триггеры - «0», т.к. к моменту поступления фронта синхроимпульса на выходе триггера Т1 «ещё» присутствовал логический «0». Таким образом, в триггер Т1 записывается та информация (тот бит), которая была на его входе «D» в момент поступления фронта синхроимпульса и т.д.

При поступлении второго синхроимпульса логическая «1» , с выхода первого триггера, запишется во второй триггер, и в результате происходит сдвиг первоначально записанной «1» с триггера Т1 в триггер Т2, из триггера Т2 в триггер Т3 и т.д.. Таким образом, производится последовательный сдвиг поступающей на вход регистра информации (в последовательном коде) на один разряд вправо в каждом такте синхроимпульсов.

После поступления m синхроимпульсов регистр оказывается полностью заполненным разрядами числа, вводимого через последовательный ввод «D».

В течение следующих четырех синхроимпульсов производится последовательный поразрядный вывод из регистра записанного числа, после чего регистр оказывается полностью очищенным (регистр окажется полностью очищенным только при условии подачи на его вход уровня «0» в режиме вывода записанного числа).

Реверсивные регистры сдвига объединяют в себе свойства регистров прямого и обратного сдвига.

1. Умножение на 2 – это сдвиг двоичного числа влево на 1 разряд.

Деление на 2 – это сдвиг числа вправо на 1 разряд.

Каждый последующий сдвиг числа – это дальнейшее умножение или деление на степень двойки.

2 Преобразование параллельного кода в последовательный и наоборот можно осуществить по схеме, приведенной на рис. 3.43.

Рис. 3.43. Схема преобразования кода параллельный\последовательный

S – data serial - последовательный вход данных

P/ S – вход управления режимом ввода (параллельный/последовательный)

Для осуществления преобразования регистр RG1 переводят в режим параллельного приема информации, а RG2 последовательного приёма, воздействуя на входы управления P/S соответствующим логическим уровнем сигнала. Параллельный код через входы D 1 - D 4 загружается в передающий регистр RG1, появляясь в параллельном виде на его выходах Q 1 – Q 4 . После этого оба регистра переводят в режим сдвига и на тактовый вход «с» подают серию из четырех импульсов. Передаваемый код вытесняется из передающего регистра в линию связи начиная со старших разрядов числа. Регистр–приёмник принимает и сдвигает каждый бит информации синхронно с передающим регистром. Таким образом, с окончанием серии из четырех тактовых импульсов, передаваемый код будет размещен в принимающем регистре и может быть прочитан из него в параллельном виде, т. к. появится на его выходах Q 1 – Q 4 . Это синхронный способ передачи кода.

При асинхронном способе синхронизирующий перепад, называемый стартовым битом, сопровождает цепочку из 5-8 бит (чаще всего байт). Это стандартный последовательный интерфейс .

Для выполнения функции как приемника так и передатчика при обмене в стандартном последовательном формате выпускаются специальные микросхемы КР580ВВ51 (ввод-вывод) или КР581ВА1.

Экономические расчеты стоимости кабеля связи и аппаратуры преобразования показывают, что при разрядности в 1-2 байта передача последовательным кодом уже при расстояниях в несколько метров становится выгоднее передачи параллельным кодом.

Сигналы сдвига подаются на RG непрерывно, а выход замкнут на вход DS. В результате однажды записанный в регистр код будет в этом кольце циркулировать. Поставив параллельно m одинаковых регистров можно записывать и считывать m-разрядные слова параллельным кодом.

Недостаток – большое время обращения

Достоинства – малые аппаратурные затраты и низкая стоимость.

Например 144ИР3 имеет ёмкость 64 бит.

4. Кольцевые распределители

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

Применяют для управления шаговыми двигателями, обслуживания матриц ПЗС и др. многоразрядных объектов (рис. 3.44).

Рис. 3.44. Кольцевой распределитель

Схема предусматривает внесение единицы через элемент ИЛИ на вход последовательного приема информации DS. Последующие импульсы сдвига с частотой следования f вх перемещают эту единицу от младших разрядов к старшим, выделяя её на выходах Q 1 – Q 4 (рис. 3.45).

Рис. 3.45 Диаграмма кольцевого распределителя

Очевидно, что частота выходных импульсов на каждом из выходов окажется в четыре раза меньше входной, а в общем виде это соотношение зависит от числа разрядов сдвигового регистра – n. f вых = f вх / n

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

Недостаток схемы – после сбоя работоспособность можно восстановить только путем внесения новой единицы.

От этого недостатка свободна схема с самовосстановлением после сбоя (рис. 3.46).

Рис. 3.46. Кольцевой распределитель с самовосстановлением после сбоя

Очевидно, что при смещении единицы в четвертый триггер регистра будет выполняться условие: Q̅ 1 ·Q̅ 2 ·Q̅ 3 = 1. Эта единица по цепи обратной связи поступит на вход DS, после чего цикл повторится.

5. Счетчик импульсов

Кольцевой распределитель можно рассматривать как счетчик-делитель с коэффициентом счета равным числу триггеров. Соединив последовательно два регистра по четыре разряда можно построить делитель на 16 (рис. 3.47).

Рис. 3.47 Счетчик-делитель на 16

Явным недостатком такой конструкции является малая ёмкость. Действительно, затратив те же 8 триггеров, можно собрать двоичный счетчик с коэффициентом деления 2 8 = 256.

6. Кольцевой распределитель с перекрестной связью

Сдвиговый регистр - это набор последовательно соединённых триггеров (обычно их 8 штук). В отличии от стандартных регистров, сдвиговые поддерживают функцию сдвига вправо и влево. (т. е. переписывание данных с каждого предыдущего триггера на следующий по счёту).

Функционал и назначение у сдвиговых регистров довольно велик. Сегодня мы познакомим одного из них с Arduino (Отличный способ множить выходы у Arduino: занимаем 3, получаем 8).

Наверное самая популярная микросхема, представляющая собой такой регистр - это 74HC595.

Работает на интерфейсе SPI: ноги DS, ST_CP, SH_CP - это шины управления. Соответственно: шина данных(MOSI), защёлка(SS) и тактовая линия(SCK). Подключаем на любые 3 контакта Arduino (библиотека SPI в коде не будет задействована). У меня это 12, 10, 13 выходы Arduino (стандарт).

Ноги Q0, Q1, ..., Q7 - это выходы регистра (разряды). Для того, чтобы следить за состоянием каждого из них, повесим на каждый вывод по светодиоду (с последовательно соединённым резистором. Номинал от 150 до 330 Ом)

VCC и GND - это питание. Подключаем к +5v и GND.

Выход Q7` не трогаем (предназначен для последовательного соединения таких регистров)

MR - это сброс. Подключаем к +5v (сброс не активен).

Ну и OE притягиваем к земле (подключаем к контакту GND).

Получается вот, такая схема:

На BreadBoard можно разместить вот, так:

Теперь к коду:

Как говорилось ранее, библиотека SPI использоваться не будет. Есть удобная функция shiftOut() .

для начала именуем наши пины (тактовая линия - clock, данные - data, защёлка - latch):

#define clock 13 #define data 12 #define latch 10

потом в void setup() обозначаем их как выходы и сразу ставим защёлке высокий уровень, чтобы регистр не принимал сигналов:

Void setup(){ pinMode(clock, OUTPUT); pinMode(data, OUTPUT); pinMode(latch, OUTPUT); digitalWrite(latch, HIGH); }

теперь давайте попробуем что-нибудь отправить на регистр:

Для начала ставим LOW на защёлку (начинаем передачу данных. Теперь регистр принимает сигналы с Arduino).

DigitalWrite(latch, LOW);

Потом отправляем данные (т. е. отправляем байт в цифровом или двоичном виде. В двоичном проще, т. к. каждый из 8 битов отвечает за свой разряд в регистре. Проще сориентироваться глазами):

Для начала отправим байт 0b10000000; (должен будет загореться первый светодиод):

ShiftOut(data, clock, LSBFIRST,0b10000000);

И в конце выставляем HIGH на защёлку (заканчиваем передавать данные).

DigitalWrite(latch, HIGH);

В итоге весь наш код:

#define clock 13 #define data 12 #define latch 10 void setup() { pinMode(clock, OUTPUT); pinMode(data, OUTPUT); pinMode(latch, OUTPUT); digitalWrite(latch, HIGH); } void loop() { digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, 0b10000000); digitalWrite(latch, HIGH); }

Теперь вгружаем в ардуину. Результат должен быть таким (зажёгся первый светодиод):

(если у вас зажёгся не первый, а последний светодиод, то в функции shiftOut поменяйте LSBFIRST на MSBFIRST и всё станет на свои места).

Итак, получилось! Предлагаю создать функцию для того, чтобы каждый раз не писать эти 3 СТРОЧКИ:

Я назову её: sendbyte;

Void sendbyte(byte value){ digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(latch, HIGH); }

Эта функция отправляет регистру состояние всех разрядов сразу. Это пригодится для (например). Но, чтобы использовать регистр как расширитель портов, нужно управлять каждым разрядом по-отдельности (аналогично функции digitalWrite()):

Мы можем отправлять регистру только полный байты (8 бит - 0b00000000). Если отправить не 8, а 5 бит (например: 0b00000 000) , то регистр будет ждать недостающие 3 бита. Значит, что когда мы хотим изменить состояние одного разряда регистра (включить его, или выключить) мы должны, по сути, послать ранее отправленный байт, с изменением на один бит.

(P. S.: Сейчас долгое и нудное объяснение (новичкам), кому не интересно, спуститесь чуть ниже:);

Итак, сначала создаём, так называемую (мною), базу данных, в которой будет храниться состояние каждого разряда (включен(HIGH) или выключен(LOW)). тип: boolean :

Boolean states;

Каждая переменная в данном массиве обозначает свой разряд (в нулевой (по счёту) будет храниться состояние 1 разряда, второй - 3-го, и т. д.)

Теперь напишем функцию (я назову её: sendpin). Она будет принимать 2 значения: номер разряда, и уровень, который нам надо этому разряду приписать: высокий(HIGH) или низкий(LOW).

Void sendpin(int pin, boolean state){ pin--; states=state; byte value = 0; byte add = 1; for(int i=0; i<8; i++){ if(states[i]==HIGH) value+=add; add*=2; } digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(latch, HIGH); }

Из-за того, что счёт начинается с нуля, нам придётся называть первый пин нулевым. Чтобы это исправить (мы будем писать как есть(первый, значит первый), а Arduino будет сама отбавлять один), Я написал:

Затем отмечаем изменения в базе данных:

States=state;

Теперь надо сформировать из 8 битов байт и отправить его на регистр.

Для начала создаём переменные:

value - тот байт, который будем отправлять. (по умолчанию его нужно сделать нулём):

Byte value = 0;

add - это переменная, которая будет хранить в себе байт текущего разряда. для первого разряда это байт 1 (0b10000000);

Byte add = 1;

теперь нам нужно прокрутить в базе данных все 8 переменных и сформировать байт (делать это будем с помощью цикла for() :

For(int i=0; i<8; i++){ }

Итак, каждый раз мы проверяем очередной разряд в базе данных. Если он должен иметь высокий уровень, то мы прибавляем к value add и переходим на следующий разряд в цепочке (как бы сдвигаемся на разряд выше (левее). Т. е., в двоичном коде всё просто: было так: 0b01000000; сдвинули единичку влево и получилось так: 0b10000000. А вот в цифровом виде всё по-другому. Сдвиг влево аналогичен умножению на 2 (а вправо, кстати, - делению на 2)). Получается примерно так:

If(states[i]==HIGH) value+=add; add*=2;

Теперь остаётся только послать value на регистр:

DigitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(latch, HIGH);

В принципе, если понять, то всё очень просто.

Итак, давайте попробуем включить 2, 4, 6, и 8 разряды отдельно (4 раза напишем в цикле нашу функцию):

Sendpin(2, HIGH); sendpin(4, HIGH); sendpin(6, HIGH); sendpin(8, HIGH);

И кстати, в setup-e нужно очистить регистр (послать 0).

Можно даже такую функцию создать:

Void cleanreg(){ for(int i=0; i<8; i++) states[i]=LOW; digitalWrite(latch, LOW); shiftOut(data, clock, LSBFIRST, 0); digitalWrite(latch, HIGH); }

В общем результат таков:

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino

Arduino Uno

1

Этот обзор посвящен, собственно, начинающим пользователям Arduino или желающим приобщиться к этому делу. Речь пойдёт об увеличении количества выходов микроконтроллера при помощи сдвигового регистра, причём что это не требует больших затрат (по сравнению с покупкой Arduino Mega, например). Самое простое применение - помигать светодиодами, вот и попробуем это на практике.

Когда начинал знакомство с микроконтроллерами (собственно и сейчас всё ещё продолжаю «начинать знакомиться»), один из первых вопросов был: как же имея всего десяток выходов на контроллере управлять той же сотней, тысячей светодиодов? Да, можно использовать мультиплексирование сигнала, встречное включение и множество других ухищрений, но всё равно максимальное количество подключаемых светодиодов ограничено, и необходимо искать другое решение. И подсказали мне один из вариантов - «возьми одну, две, десяток микросхем сдвиговых регистров и развлекайся». Было решено сразу же их заказать, а в перспективе даже собрать светодиодный куб с их применением. От последнего правда пришлось отказаться, нашёл более простой вариант, но это - тема другого обзора.
Заказал сразу 20 штук 74HC595N, благо стоят сущие копейки. Буква N в конце маркировки обозначает, что микросхема в корпусе DIP-16, очень удобно для экспериментов на макетной плате, ничего даже паять не надо. Выглядит вот так:




Что же собой представляет эта микросхема? Это восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защелкой и тремя состояниями на выходе.
Проще говоря, используя всего 3 выхода контроллера можно управлять 8 выходами сдвигового регистра. А если микросхемы соединить последовательно друг за другом, то количество контролируемых выходов можно наращивать до любого разумного предела (не нашёл предельного количества, но сотнями вроде как объединяются без проблем; если кто знает, от чего зависит предельное количество включенных в каскад микросхем - интересно было бы узнать в комментариях).
Данные к микросхеме передаются последовательно. Биты 0 и 1 передаются в регистр друг за другом, считывание битов происходит при поступлении синхроимпульса. Передал 8 бит - получил 8 выходных состояний на выходах регистра. При каскадном включении 74HC595 (при необходимости получения 16, 24 и т.д. выходов) данные от первого регистра передаются к следующему.
Выход регистра может находиться не только в состоянии логических 0 или 1, но и быть в высокоимпедансном состоянии, когда выход отключен от схемы. В это состояние могут быть переведены только все выходы сразу. Это редко используется, но может быть полезно при переключении управления на другой контроллер, например.

Распиновка входов/выходов

Q0…Q7 – выходы регистра, могут быть в состоянии 0, 1 или высокоимпедансном
GND – земля
Q7′ – выход для последовательного соединения регистров.
MR – сброс значений регистра
SH_CP – вход тактовых импульсов
ST_CP – вход «защёлкивающий» данные
OE – вход переводящий выходы из высокоимпедансного в рабочее состояние
DS – вход данных
VCC – питание 2-6 вольт

Остаётся проверить работу, для этого соберем популярную среди новичков схему. GND (пин 8) подключаем на землю, Vcc (пин 16) к питанию 5В, OE (пин 13) на землю, MR (пин 10) к питанию 5В. Теперь к сдвиговому регистру подключено питание и все выходы активны. Теперь время подключить микросхему к Arduino: вход данных DS (пин 14) подключим к 9-ому цифровому выходу ардуино, вход тактовых импульсов SH_CP (пин 11) к 10-ому цифровому выходу, вход-защелку ST_CP (пин 12) к 8-ому пину ардуино. Между землёй и защелкой рекомендуется поставить конденсатор на 0,1 мкФ для минимизации шумов.
Осталось подключить светодиоды - через резисторы 150-300 Ом подключаем их от выходов регистра к земле. Собственно и всё. Вот нашёл схему, кто любит наглядные материалы (обратите внимание, распиновка реальной микросхемы и схематическое изображение на данной схеме различаются!)


Собрал схему на макетной плате, у меня получилось вот так.

собранная схема








В ардуино удобно воспользоваться функцией shiftOut(), которая выводит байт информации на порт вход/выхода последовательно (побитно). . Загружаем тестовый код в Arduino и получаем счётчик от 0 до 255 в двоичном виде:
int latchPin = 8; //ST_CP int clockPin = 10; //SH_CP int dataPin = 9; //DS void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) { // установка синхронизации "защелки" на LOW digitalWrite(latchPin, LOW); // передаем последовательно на вход данных shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); //"защелкиваем" регистр, устанавливаем значения на выходах digitalWrite(latchPin, HIGH); delay(500); } }
Вот так получилось у меня, всё работает как положено:


Таким образом, при минимальном использовании пинов контроллера можно управлять большим количеством светодиодов (или ещё чем-нибудь). Всё бы хорошо, но расскажу и о недостатках. Как видим, ток для каждого светодиода необходимо ограничивать резистором, и при построении больших светодиодных матриц это становится достаточно трудоёмко. Есть более интересное решение для управления светодиодами - драйвер DM13A, который представляет собой сдвиговый регистр, при этом ещё и ограничивает ток на каждом выходе. Про него расскажу в следующий раз, а в качестве бонуса - тот самый мой первый LED куб, 5x5x5, собранный на упрощенной элементной базе, уже без применения 74HC595.

Планирую купить +37 Добавить в избранное Обзор понравился +35 +61
Похожие публикации