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

Распечатать

Иногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело 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 в ноль на пару микросекунд.
Все просто :)

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

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

Запись опубликована в рубрике Начинающим с метками , . Добавьте в закладки постоянную ссылку.

97 комментариев: Сдвиговый регистр

  1. mc14094 получше
    я управлял 3мя индикаторами по 2м проводам

  2. toMishka говорит:

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

  3. _riko_ говорит:

    Спасибо ДИ :) Как раз вовремя!

  4. Sniper говорит:

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

    • DI HALT говорит:

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

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

      • Sniper говорит:

        Ясненько… Скоро поеду обзаводиться триггерами.. Хочу все таки их в деле увидеть))))

      • valvv говорит:

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

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

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

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

  6. GrayCat говорит:

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

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

    • Ivan A-R говорит:

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

    • DI HALT говорит:

      О! Точняк, туде же можно SPI привязать. А про 74HC595 не знал, возьму на заметку.

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

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

  7. toMishka говорит:

    Как посчитать транзистор VT1 на сотню светодиодов? что поставить?

  8. ZoomerSD говорит:

    Отлично!! Ограменное мерси! я как раз сегодня голову ломал, над этим вопросом…

  9. atmega48 говорит:

    Теперь понятно, как к одному порту МК можно подключить куеву тучу светодиодов :-).
    Спасибо за статейку! Продолжай в том же духе! :-)

  10. GrayCat говорит:

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

    • nwanomaly говорит:

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

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

      • alexanderpavlovirk говорит:

        http://lib.qrz.ru/files/images/usefulschemes/book1/chapter3/3-11.jpg
        На приведенной мной схеме:
        Триггеров может быть сколько угодно.
        На логических элементах собран генератор (его можно заменить любым генератором на неск. Герц).

        • nwanomaly говорит:

          в моей линейке полторы сотни точек-огоньков, сложно столько триггеров уместить (

          • alexanderpavlovirk говорит:

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

          • nwanomaly говорит:

            спасиб )
            но я уже вкурил применение регистра с защёлкой 74hc595. есть какие-то с большим током 74ac595 на выходах, но у меня не нашлось.

  11. dqosN говорит:

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

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

    • DI HALT говорит:

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

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

      • sTARcRAB говорит:

        а что вместо светодиодов нельзя повесить транзисторный ключ и через него управлять релюхой?

        • DI HALT говорит:

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

          • sTARcRAB говорит:

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

  12. cyberr говорит:

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

  13. тема с регистрами достойна отдельного поста
    3 индикатора по одному проводу (см схему и осциллограмму)
    http://www.mikrocontroller.net/topic/87149#new

  14. Ridik911 говорит:

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

    • DI HALT говорит:

      Убирать нельзя, тогда диоды будут питаться один от другого. Чем тебе резюки помешали?

      • Ridik911 говорит:

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

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

  15. chupit говорит:

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

  16. Gizmo говорит:

    Подскажите, для чего нужны в дешифраторе К155ИД3 стробирующие входы(18,19).

  17. xamlo говорит:

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

  18. Shushunder говорит:

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

  19. rol20 говорит:

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

    • DI HALT говорит:

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

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

  20. SAShA_II говорит:

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

    • DI HALT говорит:

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

  21. skadi.exe говорит:

    хинт — от вывода READY можно избавиться ценой 1 бита, если завести базу на 7 выход последнего регистра. и выводить туда всегда 1

  22. addy92 говорит:

    А нахрена вообще транзистор? Ну моргнут диоды абы-как во время переключения, ну дак это же миллисекунда? Или тут есть что-то принципиальное?

  23. alexanderpavlovirk говорит:

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

  24. Rumata говорит:

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

  25. Jurist говорит:

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

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

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

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

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

    • DI HALT говорит:

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

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

  26. Jurist говорит:

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

  27. xsudo говорит:

    Спасибо за тему.
    А как быть если у меня CD4015BC ?
    Что то получалось, но криво…

    http://img.flashtux.org/img132b8561e998x23fe65bd.png

  28. Vitalll говорит:

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

  29. Fck_r_sns говорит:

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

  30. sTARcRAB говорит:

    а есть ли аналогичные по действию регистры но бОльшей разрядности? 12, 16, 32. пытался гуглить, но ничего не нашел.

  31. Gnd говорит:

    Привет. Я уже читал где-то, но не могу найти этот пост. Так что извините за повторение.
    Из 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. Правильно я понимаю?

    • DI HALT говорит:

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

  32. Gnd говорит:

    Спасибо, очень сильно помогают твои статьи… Надо будет пивка поставить :)

  33. NiSkNAme говорит:

    Я тут нашел схемку и не могу вкурить как работает.Микроконтроллер с регистра читает нажатие кнопки (что очень сомнительно по моему ) или выводит цифру на индикатор и сразу читает кнопку?
    http://cxema.at.ua/fm_cifr/01-.jpg

  34. whoim говорит:

    А есть такие регистры, вроде 74hc595, но на 16 или даже больше выходов?
    в общем, суммарно надо около тысячи выходов организовать.. модульно-расширяемо..

  35. Strauss говорит:

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

    • Strauss говорит:

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

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