Управление семисегментными индикаторами по одному проводу

Часто бывает ситуация, когда надо выполнить простую задачу с которой справится даже грошовый контроллер вроде ATTiny12, но вот незадача — нужна индикация, а под какой нибудь семисегментный индикатор придется убить дофига выводов, а их всего восемь, из которых два питание, а один Reset. Можно, конечно, взять просто МК потолще, но мне больше по душе разные схемотехнические извраты. Вот и тут камрад Kalobyte подкинул ссылку на прикольную схему управления тройным (а в перспективе хоть десятерным) семисегментным индикатором по одному проводу.

Индикатор зажигается посредством сдвигового регистра 74HC164, всего таких регистров можно навесить очень много, просто соединив по цепи несколько регистров. Если отбросить RESET, то для проталкивания данных в регистр нужны две линии — Data и Clock. Путем небольшого изврата можно эти две линии обьединить в одну.

Для начала немного теории
Обычная RC цепочка. Отличается тем, что напряжение на конденсаторе не может измениться мгновенно. Время заряда и разряда зависит от емкости кондера и сопротивления резистора. Оценить его можно по постоянной времени T=R*C , это время за которое заряд изменится примерно втрое (в е=2.7 раз).


Если мы пустим через нее длинный импульс, то конденсатор успеет как полностью зарядиться, так и полностью разрядиться.

Если подадим короткий импульс, по времени намного меньше чем постоянная времени, то напряжение на конденсаторе изменится совершенно незначительно. Так, дрыгнется да и только. То же относительно короткой паузы. Незначительный провал и все возвращается на круги своя. Чуете куда я клоню?

Правильно!
У нас у регистра есть линия данных (Data) и линия строба (Clock). Когда уровень на Clock меняется с нуля на единицу (передний фронт) с линии Data считывается текущий уровень. Их можно разнести по разные стороны RC фильтра. И одни сигналы передавать узкими, другие широкими импульсами.

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

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


Сигналы Reset я даже рисовать не стал — они там намертво на +5 повешаны. Сброс регистров осуществляется загоном в него нулей. Регистов тут два, но как я уже писал, можно навесить их еще очень много, лишь бы хватило скорости их заполнять.

Осталось теперь хитрым образом формировать биты на линии. Чтобы было понятней, я нарисовал поясняющую картинку, на которой показана передача байта 10011010.


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

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

А вот так выглядит осциллограмма реальной передачи

Вот, взяли и применив копеечный регистр, сэкономили на микроконтроллере. Зажопили кучу выводов и получили моральное удоволетворение от извращенского метода :) Попутно вкурив в очередной пример применения конденсатора и интегрирующей цепочки.

Ссылки по теме:

119 thoughts on “Управление семисегментными индикаторами по одному проводу”

  1. Да, с конденсатором класно придумано! Только вот соединять больше трех сдвиговых регистров последовательно и напрямую подключать к ним индикаторы — это же ужасные тормоза! Тут лучше уж ставить после регистров какой нибудь дешифратор. К примеру, если регистров будет два, то мы получим 2^14=16384 комбинаций, то есть сможем уверено управлять четырьмя индикаторами, а если три, то мы сможем отобразить значение от 0 до 2 000 000 с копейками.

    1. Да ладно те, какие там тормоза. 5-6 байт протолкнуть милое дело. Кондер помельче поставить и вперед. А чтобы прога не тупила — по прерываниям это сделать.

      1. Здравствуйте! Пишу Вам из Узбекистана, нужна Ваша помощь. Дело в том что, имеется газо заправочная станция оборудование установлено китайское и на каждой газовой колонке имеются индикаторы которые показывают кол-во заправленного газа, сумму за этот газ.
        Проблема в том что из 10 газовых колонок нужно эти данные чтобы показывали у оператора. Китайские товарищи установили не полностью оборудование. Как можно сделать чтобы индикаторы которые показывают на газовых калонках одновременно отображались у оператора. Надеюсь на Вашу помощь. Напишите пожалуйста ответ на мой е-mail: asianet_namangan@mail.ru Заранее благодарен. Надеюсь на Ваше понимание!

    2. Я думаю что такое решение — передача данных по 1 проводу — можно применить для «индикаторной головки» — устройства отображения информации без микроконтроллера ( если там есть МК то конечно есть формат UART и 1-wire ). Этот иникатор может подключаться к устройству когда нужно что-то проконтролировать — удобство в том что нужно простое внешнее гнездо — земля, питание и сигнал — например стерео аудио разъем 3.5 или 2.5 мм.

      Этот индикатор может быть один на несколько совершенно разных устройств. Причем устройства могу слать отладочную информацию всегда — т.е. им не нужно сообщать о подключении индикатора.

          1. Нет один порт. С него через конденсатор и резистор на землю.

            Порт настраиваем на выход и кладем на землю, потом настраиваем на вход и на подтяг, чтобы вверх его тянуло через встроенный подтягивающий резистор. Скорость заряда (равно и скорость появления лог1) будет зависить от (Rподтяга+Rвхода)*С Емкость неизменна, сопротивление подтяга тоже константа, а вот сопротивление входа может менятся произвольно (наш датчик). В результате наступление единицы будет разным по времени. Чем больше сопротивление, тем дольше. Таким образом можно косвенно определить сопротивление. Не слишком точно, но все же. На безрыбье и рак рыба, как говорится.

    1. Думаю можно применить тот же способ — нажатиями кнопки меняется постоянная времени RC, от этого заряд ведет себя по разному. Таким же образом можно и сенсорную кнопку сделать — там нажатие будет менять емкость.

  2. Я все же при числе разрядов больше одного — двух предпочитаю динамическую индикацию. Ну западло мне лепить по 8 резисторов на каждый индикатор! Да еще и по микросхеме. Замаешься резисторы одного номинала сотнями покупать. Да и потребление тока в динамической намного ниже. И индикаторы у меня в основном блочные, по 2, 3, 4 разряда с уже обьединенными выводами, что сильно упрощает разводку. Одиночные уже давно не использую.
    А сама идея недурна, правда, обычно что 1, что 2 провода — разница невелика, зато из за экономии единственного вывода намного усложняется программа: вместо простой выдачи битов по очереди, нужно еще и стробы формировать, да еще и на том же выводе… Проще уж второй проводок кинуть. Думаю, даже для 8 — ногого корпуса разница невелика — 1 или 2 из 5(6) использовать.
    Похожие идеи используются в приемниках пропорционального радиоуправления с 60х годов. Там значение для каждого канала передается длительностью канального импульса, которые передаются серией, один за другим. По фронту импульсов происходит сдвиг выходного регистра, по межсерийной паузе — общий сброс. Сброс также формировался RC цепочкой. В результате на выходах регистра имеем импульсы соответствующей длины для каждого канала. Когда еще не было регистров в интегральном исполнении, использовали многостабильный одновибратор на динисторах или их аналогах на транзисторах.

    1. В таких случаях я ставлю резисторную сборку. В одном резисторе 8 штук. Размером как две 1206. Планарная. Раз и припаял в одно касание. Стоит столько же сколько и обычный резистор.

      А программа усложняется в десяток строчек. Процедура вывода 1 и вывода 0, ну и конвеер через флаг С который выбирает нужную процедуру. Всяко проще чем динамическая индикация.

    2. я вообще использую только динамичную развёртку. так учили с детства старшие товарисчи.
      включаю нужные ножки и вешаю на таймер мигать цифру по 100 Гц — и индикатор дольше гораздо живёт, и енергия не так жрётся.

      плюс юзаю многосегментные с общими анодами-катодами )

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

      1. Микроконтроллеры сейчас достаточно дешевы, (по крайней мере, разница в цене между корпусами 8 и 14, 16, 18, 20, а то и 28 ног — не очень велика). Мне проще поставить корпус побольше, чем разводить и распаивать несколько лишних микросхем, десятки резисторов, да еще с устаревшими одиночными индикаторами с кучей выводов… Ведь время — тоже деньги, а также — безвозвратно потерянный кусок собственной жизни.
        Динамическая индикация на 4 разряда занимает всего полтора порта (8 + 4 ноги), и, по крайней мере на PIC, при 3 мА на сегмент, требует кроме 4х разрядного индикатора — всего 8 резисторов. Некоторые еще извращаются и сканируют не разряды, а сегменты — тогда всего резистор на разряд, и токи до 25 мА на сегмент независимо от количества разрядов. При больших токах можно поставить внешние разрядные ключи (Дешифратор или регистр с достаточно мощными выходами, например, 555ИД7), или транзисторы. Но современные индикаторы, хоть красные, хоть желтые, и при 2-3 мА на сегмент в динамике светят довольно ярко. (Часто прикрываю зеленой довольно плотной пленкой).

        1. Для дома для семьи это справедливо. На потоке нет. Т.к. ставить другой МК это выбиваться из номенклатуры, закупать новую линейку и так далее. Когда я работал на предприятии, то у нас делали стенды. Серия была небольшой — сотни блоков в год. И то, там поставить что либо отличающееся от того что есть на складе нереально — отдел снабжения такую схему завернет. Вот и приходилось либо втыкать дорогую мегу128 туда где тини2313 справиться, либо городить кучу логики во главе с Тини12. Я поначалу думал маразм, но потом убедился что так везде. Подруга работает проектировщиком, не могла поставить в схему MC34068 так как ее не было в номенклатуре предприятия, пришлось ставить 7805 и радиатор в пол устройства.
          Сам с этим столкнулся. У меня дома очень много Тини2313, т.к. на них завязан мой поток. Поэтому все девайсы я стараюсь делать на них, т.к. покупаю их оптом, сотнями штук. Ну а различные технологические ограничения 2313й обхожу разными извратскими способами.

          1. Ну, мы же сейчас, слава богу, не на заводе… А я уже с давних пор привык запасать из огромного количества комплектухи по нескольку ключевых позиций каждой из используемых серий, чтобы они перекрывали процентов 90 моих потребностей. Леплю разное, но понемногу. Например, из PIС имею в запасе:
            PIC12C508, 509, PIC12F628, 636, 672, 675,
            PIC16F84, 628, 74, 873, 876, 877,
            из ATMEL: ATMEL24C32, ATMEL24C512, AT89C2051-24PI, AT89C51-24PC,
            AT90S1200, AAT90S2313, AT90S2343, AT90S4433,
            ATTiny12, ATTiny13, ATTiny15, ATTiny26, ATTiny2313,
            ATMEGA 8515, ATMEGA 8535, ATMEGA 8, 16, 32, 64, 128.
            Некоторые уже устарели, но иногда попадают схемки и под них, да и немного их осталось. Потребуются другие — тоже прикуплю. Но заменить один корпус другим, с большим количеством ног — не проблема… Да и цены у нас от размера корпуса почти не зависят в диапазонах 8-20 или 28-40 ног.

            1. Большинство на этом сайте начинающие или начавшие. Запаять одного таракана и взять готовый кусок кода для динамической индикации дело не хитрое. А эта статья показывает как можно сделать по другому и приминительно к некоторым ситуациям это может окажется лучшим решением. Даже если такой ситуации никогда и не возникнет, все равно прочитав эту статью начинаешь думать не по шаблону. И это самое главное в обучении…
              Спасибо большое. Побольше бы таких статей.

          2. Вот вот. Например есть тини2313 с его кучей ног и копеечной ценой. Но у него нет АЦП. Почему бы не прилепить какойнить тини25, заставить его тупоглупо мерить и рассказывать результаты последовательным протоколом? Или наоборот, разбить софт на части, и типа кластерной обработки. Я у кого-то видел арифметический сопроцессор, сделаный таким образом. Пока в одном камне софт своими делами занят, в другом камне числа перемалываются.

            1. Лишний микроконтроллер. Это во первых дополнительная деталь в номенклатуре, дополнительный код, дополнительная операция прошивки.

              Ну и стоит он дороже. На тот момент когда я делал на Тини2313 он стоил заметно дороже.

              1. Зато выше производительность. И опять же, возвращаясь к примеру с дисплеем — он же будет перемаргиваться при обновлении, и чем больше разрядов — тем длиннее период, когда на всех индикаторах нарисована чушь. Плюс, представляем ситуёвину, когда в момент формирования этой битовой последовательности происходит прерывание. Запретить? А если низзя?
                Так что казус интересен, но находит ограниченное применение.

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

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

          хотя палку тоже не стоит перегибать

          1. Вообще — то время человеку дается для жизни, и чем меньше его остается, тем больше его начинаешь ценить. Молодым этого не понять… А что касается баек о «наших» в «других странах» — часто это весьма далеко от истины.

            1. Ой, сэр SWG, вы затронули философский вопрос! О том, что такое есть жисть, и с чем ея кушают. И куда девать то самое время, которое для жизни дано. Лежать пьяным в канаве(Ой, пардон, что это я, конечно же пузом кверху на пляжах Лазурного берега) и говорить «я отдыхаю»? Или уткнуться в дерьмоскоп и капать слюной на мексиканский сериал (как вариант, на футбол). Очень жизненное, знаете ли зрелище, как 11 идиотов по лужайке пузырь гоняют. Или доставать близких типа любовью и спонтом заботой?
              Ой, непростой вопрос, непростой….

  3. Ребят, как бороться с ошибочкой «relative branch out of reach»? (avr studio, asm)
    Я уже разобрался, что это из-за того, что метка стоит далеко от места, где она вызывается…не могу понять , как можно обойти. (как раз по теме пишу программку для 4х семисегментных индикаторов, правде не по одному проводу, а по двум, но не суть)…намекните кто нить на че нить)) ближе расположить метку никак не получается. в макросе я тупо выставляю «1» или «0» на ногу мк и кидаю её на «дату» сдвг.рег-ра, потом перещёлкиваю, и т.д. оч в завистимости от того, какая цифра пришла в сакрос в виде входного параметра, внутри макроса вызывается метка прорисовки соотв.цифры на соотв. индикаторе. как быть?имеет ли смысл попытаться как то «сократить» исходник посредством подпрограмм и макросов?

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

    2. Прыгни на другой JMP. Бранч дает переход всего на 127 инструкций вверх или вниз. Не более того.

      Делаешь островок типо:
      BRxx M2

      RJMP M1
      M2: JMP куда реально надо
      M1: код дальше

  4. хм, а такими темпами скоро будет уже индикация без проводов, а потом еще и в минус — лишние пины внезапно появяццо :D
    А если немножко пооффтопить — я что-то не могу залогинится нормально. Вроде справа нажал на «Вход», все оке, вижу свой профиль, а на сайте все равно как-будто не залогинен. Только через кучу рефрешей я становлюсь залогиненым. wtf? O_o?

  5. Развивая идею, можно сделать и динамическую индикацию для 3-х и более разрядных:
    Объединить и повесить на один сдвиговый регистр управляющие сигналами ноги, а на стоящий за ним повесить ноги отвечающие за выбор разряда. И подавать периодически туда сигнал вида ( код знакосимвола + флаг указывающий на регистр индикатора, например, 00000100 ).
    Правда часто перезаписывать сдвиговые регистры придется, но зато нужны будут всего 2 сдвиговых регистра на 3-4 регистровый семисегментник.

    1. norvog,
      Уж проще полтора порта для динамической индикации выделить. Чем городить аппаратуру, разводку, да еще и с программой мудрить. Поставить вместо 8-ногого 20 ноговый, с учетом экономии микросхем и резисторов даже дешевле будет. Да и программа проще. И плата меньше.

  6. Отмазка: в настоящее время я полный чайник в электронике

    Не могу понять — в течение какого времени 74HC164 распознаёт бит данных на входе data, после появления фронта строба таймера?

    Кстати, как этот параметр называется в даташите?

    Т.е. у меня в голове два варианта отклика 74HC164 на фронт:
    1. Сразу после спада строба до 0 прекращается приём бита данных (очевидно это не так);
    2. Приём бита идёт от начала текущего строба до начала следующего.
    не подскажешь как на самом деле обстоит дело?

    1. Считай, что в момент фронта строба и происходит захват. Строб тут восходящий фронт, т.е. переход с 0 до 1. В этот и только в этот момент происходит считывание, дальше на вход ничего не влияет.

        1. Какого таймера? О_о Тут нет никакого таймера.

          При появлении краткого импульса захватывается напряжение которое в этот момент на конденсаторе. А оно меняется медленно.

  7. Идея несомненно заслуживает внимания, но не в конструкциях с МК. Их ведь делали как законченное устройство, а не для того чтобы обвешивать ИМС. МК лучше взясь с большим числом выводов и не париться с обвесом, т.к. новые АВРы делают с мощным выходом портов, светодиодные индикаторы можно включать как на землю так и на питание. Зачем городить ещё что то, если все есть в одном кристале.
    Подскажите пожалста, кто нить делал на АВРе цифровой мегоометр 4-х (3-х) разрядный, так где-то до 20МОм измерения? Питание до 12В, выше нельзя! Можно не измерять, а мониторить с интервалом 5МОм. Еще, чтоб писало на ПК, лучше через ЮСБи все изменения. Помогите, кто может, есть АТМега16 и 8. Прогу напишу может и сам, а вот с обвесом напряг.

    1. Ну почему же никаких предложений? Или задача, выяснилось, невыполнима? Я вот что думаю, на вход какой нить операционник поставить, для усиления по току с автоматически регулируемой ООС от МК, а потом использовать в качестве измерителя функцию АЦП в АВРке. Что можете посоветовать? Срочно нужен контроль изоляции на 30 кабелях, комутатор разработал на 561КП2 (их аналогах) в виде решетки 8х4, в пересечениях включаю свободную пару кабеля. Всё это работает на один выход в виде пары. Нужно контролировать занижение изоляции от 20(30)МОм в сторону уменьшения, хотя бы по 5 МОм. Заранее благодарен за любую помощь.

      1. Да почему нерешима. Сопротивление можно замерить через ток. Ток измерить как падение напряжения на добавочном шунте. Мерить инструментальным усилителем с диким коэффициентом. AD627 какой нибудь. Потом это все на АЦП и вычисляй себе на здоровье. Схема там по даташитам собирается.

      1. Супер прога ! Создание видео происходящего на экране вашего ПК и последующее редактирование, наложение меток пояснений и прочие чудеса мультимедиа. Запись звука наложение улучшение голоса для создания профи материалов и всяко разно.

        http://www.techsmith.com/camtasia.asp ( там видео ознакомительное есть )

        скачать — TechSmith Camtasia Studio 6.0.2 Build 885 Rus
        http://torrents.ru/forum/viewtopic.php?t=1712264

        Но можно и демо юзать бесконечно в virtualPC virtualbox

        1. А я уже нашел тулзу по нраву: CamStudio20
          Халявная, фич почти нет, но мне их и не надо — видео да запись звука с микрофона. Вот все что надо. Интерфейс в стиле «Одна кнопка»

        1. Во теперь вижу. Мда. Вам чо делать нечего?
          Изза такой фигни устроили демагогию, потратив дофига коллективного времени которе можно было пустить на создание чего нибудь нового.

  8. Дак кто устроил то ? Германский «борец за идею» — модеатор форума Телесистем.
    Накинулся на меня — «а ну исправь на всех ворумах ФНЧ на интегратор» …
    Я еле отбился.

    1. Да не к тебе лично, ко всем пристутствующим имелось ввиду :) В конце концов какая действительно разница?

      Хоть так его назови хоть эдак, суть не изменится. Какая разница между бегемотом и гиппопотамом?

  9. Понравилась статейка, впечатлила :-) накатал простые часики, mega8+74HC164+7SEG4CC, включил часовой кварц в асинхронном режиме, управления нет — при подаче питания включаются на 22 часа.
    Делал в WINAVR + PROTEUS на железе не проверял.
    http://slil.ru/28109474

  10. Заинтересовался. Паять нечего, поэтому собрал в Протеусе. Написал собственноручно асмовую библиотеку, сделал прогу с двунаправленным счетчиком. Извращаться — так по полной, прога под ATTiny12 =).

  11. Кстати, а почему нужно цеплять по резистору на каждый вход 7-сегментника? Почему бы не повесить всего один на выход (общий который)? Или я чего-то не понимаю.

  12. Доброго времени суток! А почему бы не соединить в шину туеву хучу семисегментников на один регистр, а анодами (катодами) управлять когда каким надо? Забили байт в регистр и подали управляющий сигнал на какой надо анод(катод) нужного (скажем второго справа;)) индикатора. Сразу отвечу — каким образом анодами это другая история. Смысл сократить количество корпусов умных микрух(74нс164) и заменить их ТУПО транзисторами. Конечно ТЫЩУМИЛЬЕНАМ индикаторов управлять будет гемор, но на штук 10-16 хватит ИМХО.

  13. Или я чего-то не понимаю или схема не правильная. Просто как я понял, схема представленная на немецком сайте работает по такому принципу: при подаче длинного лог. «1» взводится клок и в это же время конденсатор успев зарядиться пропускает на линию данных лог. «1» — в регистр продвигается бит «1»; при подаче короткого лог. «1», взводится клок, а вот на линию данных поступает лог. «0» и в регистр продвигается бит «0». Ведь так? И еще, разве на этом сд. регистре clk не инверстный? Если нет, то в схему нужно включать инвертор.

      1. т.е он при таком раскладе не успеет «протолкнуть» лог. единицу? т.е clk по переднему фронту срабатывает и запихивает то что на линии данных, а там во время прохождения переднего фронта весит лог. «о»(пока заряжается конденсатор), и он будет постоянно проталкивать нули?

  14. Скажите, а что такого хитрого в формировании импульсов?
    Представляется все относительно просто — даем бит данных, ждем какое-то время, затем даем последовательно 0 и 1 для строба, повторять до конца передачи.
    Например, передаем 0100110:
    00000000 01 11111111 01 00000000 01 00000000 01 11111111 01 11111111 01 00000000 01
    Т.к. состояние ожидания 1, а строб получается только при смене 0 на 1, то непредвиденных стробов быть не может (кроме как в самый первый раз при старте программы, когда на пине сразу 0) и на переданный бит вообще смотреть незачем.
    Спрашиваю потому что собрал и не пашет как надо. :( В основном из-за кривого даташита к индикатору (в ножках запутался :), но может и тут есть что-то что я не учел? осциллографа к сожалению нет, приходится вслепую отлаживать…

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

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