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

Иногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело ATMega128 с ее полусотней выводов? Избыточно — для ламеров. Ставить i2с расширитель портов? Дорого. Для мажоров. Тут на помощь из вековых глубин выплывает старая добрая дискретная логика. На этот раз нас выручит грошовый сдвиговый регистр. Возьму, для примера, 74HC164 он же, для любителей совковых трешевых микросхем в неубиваемом каменном корпусе, наш КM555ИР8.

У него есть 8 выходов и четыре входа. R-сброс, С-тактовый, А1 и А2 вход. На самом деле, внутри они заведены через логический элемент 2И-НЕ и идут на D триггеры. D — это такой тип триггера, который по тактовому импульсу схватывает и отправляет на выход то, что у него на входе. Как видишь, тут они цепью стоят ,передавая бит от одного к другому и нет принципиальной разницы сколько их тут будет, восемь штук или восемь миллиардов. Но чем больше, тем дольше по этой эстафете гнать данные до конца. Поэтому мы смело можем эти регистры соединять последовательно.
Получается вот такая схема:

От МК, как видно, требуется только четыре выхода. Одним (RESET) мы сбрасываем состояние регистра. Из второго (Data) побитно вылазит байтик, а тактовый CLC обеспечивает продвижение битов по регистру. Самих регистров тут три. Они сцеплены паровозом. Когда переполняется первый, то биты из него вылазят во второй, потом в третий. Итого, 24 вывода.
Катоды диодов подключены все вместе через транзистор и как только будет слово мы подаем сигнал Ready и зажигаем всю эту ботву.

Наполнять регистр просто:
1) Поднимаем и держим RESET в 1
2) Выдаем первый (старший) бит на Data.
3) Опускаем в 0 и поднимаем в 1 тактовый выход. На восходящем фронте происходит занос в регистр и сдвиг всей цепочки на один шаг.
4) Повторить со второго пункта пока все биты не выдадим.

А для сброса достаточно уронить Reset в ноль на пару микросекунд.
Все просто :)

З.Ы.
Кружок на входе регистра означает, что вход инверсный. Т.е. подал ноль — сработало
Треугольник на входе показывает по какому фронту произойдет срабатывание. Запомнить просто: _/ \_ — это, типа, импульс. А треугольник, как стрелочка, указывает на нужный фронт. ->_/ \_ передний (восходящий фронт) и _/ \_<- задний (нисходящий фронт)

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

116 thoughts on “Сдвиговый регистр”

        1. А, да. Чем хороша 4094 (а также еще 74HC595), так это наличием самостоятельного входа строба (тот же сигнал, который в этом посте обозван RESET). Вся конструкция идеально совместима с SPI портом, в частности, полярность строба и CS# совпадают, так что руками дергать ничего не надо.

  1. ну это если на микрухе совсем ног нет, а так я думаю лучше взять что нибудь вроде ИД3, например SN74154 4-входа, строб и 16 выходов … (вот почитал датащЁт ,подумал , кажется на дешифраторе гирлянду не замутишь пашет на выходе только одна нога,… разве только бегущий огонек …

  2. Да. действительно) очень хорошая схема. вот только маленький вопросик.. получается, что нужно слать один бит на одну ногу, потом нужно сдвинуть, и опять бит на эту ногу? То есть как печатная машинка? Кстати тут задумался над гирляндой… А что если поставить дешифратор, а на ногах D триггер… в итоге мы можем управлять каждой лампочкой в отдельности… если делать гирлянду на светодиодах (что бы скорость загорания была высокой) то даже сразу несколько лампочек можно зажечь почти одновременно))) Вот и гирлянда с диким колличеством лампочек. Причем каждая управляемая, независимо от остальных))

    1. Да, там последовательный вывод. А с дешифратором тоже можно, но сложней — надо ног больше.

      А вот по этой схеме я делаю как. Мне надо зажигать 40 диодов. Так вот, у меня модульная конструкция, на ней 8 диодов и регистр. А еще входы выходы на печатной плате сделаны так, что я могу взять наделать таких модулей, сцепить их цепью и навешивать сколько угодно штук (хоть сто тыщь миллионов) меняя лишь программу.

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

  3. а чисто теоретически этим светодиодам можно шимом еще и яркость менять?

    я чайник, поэтому и спрашиваю :) перед тем как методом тыка проверить/увидеть

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

      1. Да ладно?) Делал на PIC18F4550(кварц 20 МГц) с помощью 595ого регистра и uln2003 управление ордой ргб светодиодов. Получилось 16 ргб светодиодов(это 48 выходов сдвигового регистра). Яркость каждого из 48 светодиодов можно настроить отдельно. 256 градаций яркости каждого при частоте ШИМ 50 Гц.

          1. Точно так же, как и без сдвигового. Используй ШИМ или ВАМ. Только надо это направлять не на ногу, а на каждый порт регистра. Т.е. аппаратные ШИМ не подойдут, надо программный писать.

            Можете почитать тут: http://bsvi.ru/bam-alternativa-shimu/#more-1133
            Будут вопросы — пишите в скайп(vbmart)

  4. Добавлю, что описанный интерфейс — фактически разновидность стандартного SPI, имеющегося в аппаратном виде во многих микроконтроллерах. Если регистры (как описанные здесь «выходные», так и «входные» ;) ) подключить к нужным ногам МК и соответственно запрограммировать модуль SPI, то для вывода байта программе достаточно будет посылать его в некий регистр. Ну, и читать из регистра, в случае «входной» микросхемы. Причем происходить это может фактически с тактовой частотой МК, что намного быстрее «программной» реализации.

    Еще есть такая прекрасная микруха — 74**595 — примерно то же самое, но с умощненными выходами. Например, 74HC595 отдает до 40 мА на ножку!

    1. У 74×595 главная прелесть не мощные выводы, а latch регистр на выходе. Используя только сдвиговый регистр, мы получим шум на выходах, когда заталкивается новое значение. В некоторых случаях это может быть неприемлемым.

    2. Да, 74HC595 действительно хорошая вещь, включает в себя последовательный и параллельный регистры, а также формирователь с тремя состояниями на выходе. Так что управляющий транзистор с ней не нужен, для отключения всех светодиодов достаточно перевести выходы в третье состояние. А наличие параллельного регистра позволяет избавиться от шума во время операции сдвига, обновляя информацию на всех выходах одновременно. В пределе, если добавить несложную схемку управления, достаточно всего двух ног МК для управления всей цепочкой (в семейсве МК ’51 для этого можно использовать UART, в AVR — SPI). Вот только суждение о том, что выходы этой микрухи потянут 40 мА — ошибочно, надо внимательнее читать даташиты. Напряжения на выходах нормируются для токов не более 6 (8) мА, а суммарный ток через выводы земли и питания не должен превышать 70 мА.

      Еще для расширения удобно использовать микросхему 74HC259 — это 8 отдельных триггеров, управляемых через схему адресации. От МК требуется 5 ног, но четыре из них можно использовать и для других целей.

      1. Разбираюсь сейчас с 74НС595 и вот не могу понять, то ли я неправильно даташит читаю, то ли чего-то недопонимаю. Написано, что сначала тактуем SH_CP, заталкивая биты в регистр сдвига подавая на вход то 1, то 0, а потом меняем с нуля на единичку ST_CP, чтобы протолкнуть в регистр хранения и активировать выходы в соответствии с тем чего мы там натолкали. На деле оказалось, что тактуется при наполнении регистра, почему-то ST_CP, а проталкивает и активирует выходы фронт на SH_CP… В общем, если коротко, то SH_CP и ST_CP поменялись местами. Я даже отладочные светодиоды поставил на пины входа и тактов. Мигает именно ST_CP 8 раз, наполняя регистр, а зажигаются выходы только после однократного мигания SH_CP. Тысячу раз сверялся с даташитом и диаграммами, и таблицами истинности, но как-то непонятно получается… Разъясните, пожалуйста, кто-нибудь? Где я ошибся или проглядел?

        1. Тю, мистика какая-то… Наверное я вчера просто устал ночью и сам перепутал. Все нормально, наполняем сдвиговый регистр тактуя SH_CP, а в регистр хранения пропихиваем фронтом на ST_CP.

    3. Насчет мощных. Нашел TPIC6B595. Та же 595, но нагрузка на каждый пин до 150мА, а в сумме до 500мА. Т.е. можно вешать реле на выходе без ULN’ок. Выходы у этих микросхем переключаются ключом на землю и питание. И как на других 595 выходы можно переключать в HiZ

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

    1. а есть где-нибудь посмотреть пример использования кроме даташита? хочу сделать мигание на светодиодной матрице типа такой http://www.chipdip.ru/product0/20572.aspx

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

          1. В таком случае можно подключить несколько светодиодов к 1 триггеру (если суммарный ток светодиодов не будет превышать паспортный ток триггера). Или можно подать питание к светодиодам через отдельные резисторы и стабилитроны (естественно не используя логики и триггеров…), для того чтобы можно было увеличивать входное напряжение (не превышая допустимого напряжения на светодиодах) следовательно зажигать светодиоды по порядку.

  6. Ага, а при частом изменении состояния выходов светодиоды моргать не будут? (транзистор то отключено когда мы того этого триггера забивает). А если мне вместо светодиодов реле управлять надо, аниж отключатся все будут на время при изменении состояния даже одного порта. Как тут быть?

    ЗЫ а со ВХОДами что либо подобное есть?

    1. Моргать не будут. Мы же транзисор вырубаем.

      Чтобы управлять реле нужно применить другой регистр. С LATCH и OutEnable выходами. В комментах много насоветвали.

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

          1. в даташите указано что этот регистр может работать с частотой 50-175 Мгц. Тоесть скормить ему пачку битов с частотой в 16Мгц будет сущим пустяком. А что бы исключить непредвиденные срабатывания релюх, загружать в регистр состояние ВСЕХ ног, тоесть все слово сразу, а уж потом включать общий транзюк. Думаю в таком случае релюшки сбросится не успеют.

  7. Отличная тема! Блин долго я искал в инете как такая хрень называется. А оказывается так просто — сдвиговый регистр. Все иду покупать, у нас 3 лея стоит (6 руб. по вашенски) :)
    Кстати есть микруха 74HC165 которая выполняет обратную операцию ( переводит из параллельного в последовательный код).

  8. как всегда необходимы кратно светодиодам резюки эх..
    а если в данной схеме поставить резюк 1 единственный — на базу транзистора?
    или понизить напряжение до 3-3.5вольт.. или как еще можно убрать резюки?

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

        >диоды будут питаться один от другого
        —-
        несовсем понял, ониже диоды.. или всмысле падения напряжения

  9. а что же делать в случае, если необходимо много допустим 10-20 аналоговых входов, возможно ли применить в этом случае что-то похожее или в этом случае путь к i2c расширителю портов?
    Спасибо.

    1. Тогда используют аналоговые коммутаторы на полевиках. Простейший пример — К561КП1. Коммутатор 16 х 1 со встроенным дешифратором. 4 линиями коммутируешь 16 аналоговых сигналов на 1 аналоговый вход. Есть целые серии аналоговых коммутаторов, например, КР590 (КН1,КН2, КН3…).

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

  11. Подскажите, пожалуйста, какой максимальный ток выдержит одна нога 74HC164 ?
    Если мне нужно подключить 3 или 4 светодиода на один выход, то придется транзистор еще ставить?

  12. Мне надо сдвиговый регистр для ЦАП 16 бит. И выход пойдет в качестве опорного напрядения на схему…. Как можно сэкономить ножки микросхемы, используя сдвиговый регистр? Только надо чтоб напряжение не скакало, а плавно менялось.! А то вот думаю мегу 64 или 128 применить? Может кто-то подскажет что можно сделать?

    1. Очевидно что ставить регистр с защелкой. Т.е. чтобы заполнение его было незаметным для выходов. А на выходы сигнал подавался только после строб импульса. В комментах одним из первых предложили такой регистр.

      З.Ы.
      ЦАП на 16 бит резисторный? Точность его резко паадает уже после 8го разряда — т.к. начинают влиять разбросы параметров резисторов, сопротивление монтажа и прочая гадость.

      1. Сложно тогда получается( А может будет проще использовать готовый микросхемы ЦАП. Нащел их по ссылке http://www.terraelectronica.ru/catalog.php?ID=667&Page=2&Sort=&InHave=&InNew=&Search=1&Text=цап&Gde=2&PageS=1
        Вот только выбрать не могу( Если тебе не трудно, может поможешь в выборе. нужно однополярное питание, SPI, тип выхода — напряжение, и еще чтоб от нуля до максимуму можно было регулировать — я так понял, что ето Rail-to-Rail Output Amplifier.

  13. Доброе время суток. Помогите. Лажа какая-то у меня. При включении 74HC164 (к ней подключени семисегментный индикатор через резисторы) все сегменты горят. На сброс микросхема не реагирует. Ноги входа и клока никуда не подкючены. Думал микросхема битая. Но и со всеми остальными 3-мя такая-же лажа. Иногда при включении бывает не все сегменты загораются, но на сброс всё-равно не реагирует. Помогите, что не так у меня???

    1. Потому что клок никуда не подключен -а него наводится помеха 50Гц, а другая помеха захаывается с Дата и проталкивается по регистру. Вот они у тебя и горят. Подтяги его хотя бы резистором на 10к к +5 вольтам.

  14. Доброго времени суток, подскажите, можно ли сделать так чтобы по фронтальному импульсу (с частотой 9 МГц), 4 последовательно подключенных регистра (mc74hc164) одновременно (при подходе очередного фронтального импульса) выдавали какие ни, будь данные (желательно хоть как-то управляемые), имея в своем распоряжении эту ИМС И ПЛИС.

  15. вычитал комментарий:

    >>DI HALT декабря 28, 2009 at 2:17
    >>Потому что клок никуда не подключен -а него наводится помеха 50Гц, а другая помеха захаывается >>с Дата и проталкивается по регистру. Вот они у тебя и горят. Подтяги его хотя бы резистором на >>10к к +5 вольтам.

    т.е. выходит, что сопротивление входов микросхемы (регистра) не так уж и велико? с другой стороны — почему тогда на схеме между микрокотроллером и входами свдигового регистра RESET, CLC, DATA нет никаких регистров? Т.е. это значит — микроконтроллер при напряжении на его выходах +5В — подбирает нужный ток сам (до 20 мА)? или же лучше ставить там резисторы — чтобы ничего не спалить (т.е. на схеме просто не указаны принципиально)?

    т.к. если я правильно понял, то входы свдигового регистра реагируют именно на напряжение а не на ток?

    да и вообще — если есть какая-нибудь микросхема — то как знать, на какие входы \ выходы надо вешать резисторы, чтобы не превысить максимальный ток при данном напряжении — в даташитах обычно не указывают ведь внутреннее сопротивление ножек… Ладно — выходы обычно идут на нагрузку или другую микросхему и их сопротивление близко к нулю… но вот входы — можно ли их напрямую подрубать к +5В батарейки, ничего не спалив при этом?

    1. Входы обычно всегда реагируют только на напряжение, а их сопротивление очень большое (мегаомы, а то и больше). Поэтому то их так наводками и телепает из стороны в сторону, т.к. навести большое напряжение тут несложно. И микроскопический ток создаваемый наводкой тут же дает значительное напряжение на входе(U=I*R).

      Так что подрубать любой вход к +5 вольтам батарейки можно.

  16. извиняюсь… слово регистр у меня уже засел в мозгу… там в одном месте имелось в виду — резисторов =)…
    «…между микрокотроллером и входами свдигового регистра RESET, CLC, DATA нет никаких РЕЗИСТОРОВ?»

  17. вопрос от новичка- нужно подключить таким способом белые сверхьяркие светодиоды а они требуют около 4вольт и 20 милиампер сможет ли выход регистра обеспечить такие условия?
    если нет то что можно предпринять?вешать море транзисторов в качестве ключей не оч хочется.. вообще стоит задача подключить некий индикатор в виде восьмерки(13 диодов 3х5) к микроконтроллеру авр мега 16 используя наименьшее количество выводов.по идее можно и напрямую повесить но выходы микроконтроллера не расчитаны на такое количество диодов и суммарный ток по идее спалит контроллер(или я что то не так понял?)

  18. Транзистор здесь работает только как ключ, чтобы диоды не дергались, пока регистры не наполнились, или что-то еще с токами делает? А то с транзисторами опыта работы мало, не могу понять, зачем он тут =\

  19. Привет. Я уже читал где-то, но не могу найти этот пост. Так что извините за повторение.
    Из datashet:
    Iin DC Input Current, per Pin ±20 mA
    Iout DC Output Current, per Pin ±25 mA
    Icc DC Supply Current, VCC and GND Pins ±50 mA

    Я хотел сделать 3-х разрядный семисегментник через сдвиговый регистр статично. То есть, если я нагружу под 25 мА более 2-х лап, то она выгорит, надо ставить ULN2003. Правильно я понимаю?

    1. Ммм… Если сказано, что нагрузка на домен питания не более 50мА то так оно и есть. Т.е. да, на пин ты можешь дать 25мА, а на кристалл больше 50низя. Так что придется усилять или динамическую индикацию делать.

  20. Вопрос такой: Что выгоднее — сдвиговый регистр или аналогичный LED драйвер на сдвиговом регистре?
    Независимо нужно питать много светодиодов (96 штук по 20мА каждый)
    Пока курил лед драйвер MBI5026 (12бит) — вдруг глянул на цену — он 50 руб стоит. В то время как 78hc595 всего-то 5-10 руб. Смотрел в платане. Вот сижу и думаю — что лучше…

    1. MBI5026 — 16бит сорри
      И сразу вопрос про 78hc595: в даташите написано, что он выдерживает до 35 мА на ножку в любом направлении, но что-то у меня такое чувство, что суммарный ток ограничен…
      В даташите написано:
      ICC supply current — 70 mA
      IGND ground current 70 — mA
      Стало быть не более 70/8=8.75мА на душу — так? (что означает облом — вешать транзистор на ноги — много места на плате, а я ограничен в размерах )

        1. А если требуется подключить 64 RGB-светодиода?
          Сколько потребляет каждый диод не успел замерить, а вот лента 5 метров в белом цвете потребляет 2 ампера на 12 вольтах.
          Если выкинуть от туда ограничительные резисторы и питать от AVR. Справится мк и 595 регистрор?
          P.S.: в рабочем режиме планируется свечение всех диодов, минимум одним цветом.

          1. МК тащит через домен питания не больше 200мА насколько я понмю. У 595й поболее будет, там думаю на всех выводах разом можно, ну и шину питания потолще на всю эту бодягу.

          2. Не могу ответить на ваш комментарий.
            Не однозначно понял ваш ответ, если мк тянет 200мА, то получается этого будет не достаточно (если будут гореть все диоды). Следовательно выход только через транзисторы? Но это получается 192 транзистора и 24 регистра. Довольно громоздко…
            Существуют-ли какие-то более компактные варианты?

  21. Окей, понятно как в них писать. Но вот вопрос:
    1) есть плата, которая управляет через 74НС164 сегментным светодиодным индикатором на высокой частоте (300 мгц)
    2) есть ардуина работающая на 20 МГц.
    Как прочитать значения переданные в шифт регистр?

  22. то что Вы здесь обсуждаете было мной реализовано на mega48 и 74hc595.
    проект назывался звездное небо. mega48 формировала 8 битный программный шим на 64 канала.
    выплевывала через spi на 8 корпусов 74hc595. ставил 20милиамперные светодиоды через гасящие резисторы. 595 грелись но не сильно….
    основной недостаток 8 битной шим это нелинейность восприятия глазом линейного возрастания яркости свечения светодиода.
    0/256 шим — светодиод 0/256
    1/256 шим — светодиод 10/256
    2/256 шим — светодиод 20/256
    3/256 шим — светодиод 28/256
    4/256 шим — светодиод 35/256
    ………………………………………..
    ………………………………….
    …………………………………..
    70/256 шим — светодиод 150/256
    ………………………………….
    …………………………………..
    150/256 шим — светодиод 200/256
    ………………………………….
    …………………………………..
    200/256 шим — светодиод 220/256
    ………………………………….
    …………………………………..
    220/256 шим — светодиод 240/256…
    слева скважность шим
    справа субьективное восприятие глазом этого шима
    пришлось перед отправкой на spi величину шим заменять через таблицу на обратную нелинейную величину смотрите код, поймете, но до конца от ступеньки я избавиться не смог (точнее смог но за счет понижения общей яркости в определенные моменты)

  23. Здравствуйте. Есть такой вопрос. А можно-ли сделать так чтоб сдвиговый регистр засвечивал только один светодиод по очереди от 0.1.2… . Или это только программно можно реализовать?

  24. Сдвиговые регистры есть максимум на 8 каналов. Если у меня линейка из 10-ти светодиодов, то как минимальными доработками можно сделать для неё такой тип подключения? Подойдут ли сюда SN74LVC1G00 или SN74LVC1G14 (элементы типа 2И-НЕ с триггером Шмидта), поставленные после сдвигового регистра 74HC164D?

    1. Наверное уже поздно, через три-то месяца, но все же отвечу, может кому еще пригодится.

      По даташиту написано, что на ОЕ надо подать высокий уровень, на MR низкий. Только тогда все выходы перейдут в Hi-Z состояние и отключатся, а сдвиговый (не storage, а shift!) регистр очистится.

      Чаще всего в даташитах на железки можно найти все ответы, надо просто повнимательнее покопать :) Один мой препод из вышки говорил, если что-то услышал, но не понял переспрашивать не спеши. Подожди минуту и оно дойдет само. А если уж и через минуту не доходит, тогда можно и спрашивать.

Добавить комментарий