![](https://habrastorage.org/webt/vj/5a/s1/vj5as1ftqbkimvxjwrzxpqx0-ea.jpeg)
Привет, Хабр! Программируемый таймер без микроконтроллера, который мы сегодня соберём, может отсчитывать секунды до Нового года или просто служить пособием по цифровой схемотехнике и тренажёром для пайки.
Проект основан на двух микросхемах реверсивного двоично-десятичного счётчика CD40192 (функциональный аналог К1554ИЕ6, 74АС192 ) и предоставляет нам возможность их подробного изучения.
Авторы конструкции не забыли внести в плату традиционную пару ошибок, и экспериментатору придётся подумать и потрудиться для того, чтобы устройство заработало как полагается.
В предыдущей статье мы собирали электронный секундомер с двумя семисегментными светодиодными индикаторами. Он «умеет» считать вперёд до 30 или 60 секунд, в зависимости от положения джампера, после чего останавливается и ждёт нажатия кнопки для перезапуска.
![](https://habrastorage.org/webt/7p/c2/jg/7pc2jgol2eli8yzm89hrkwngx1m.jpeg)
Наша сегодняшняя конструкция является гораздо более продвинутой по сравнению с предыдущей. Здесь тоже два десятичных разряда, но этот таймер считает назад, причём начиная с того числа, которое мы запрограммировали посредством двух счетверённых микропереключателей.
Отсчитав положенное число секунд, автомат подаёт звуковой сигнал при помощи зуммера, а затем ждёт перезапуска. Предусмотрены три кнопки — пуск, стоп со сбросом и пауза.
![](https://habrastorage.org/webt/3l/xg/-u/3lxg-ugiw-dhxo3oeplsd2azg-s.gif)
Чтобы считать секунды, а также минуты и часы от нуля и только вперёд, нам было достаточно одной 16-выводной микросхемы CD4518 на два десятичных разряда. Она применяется не только в таймере на полминуты и минуту, но и в полноценных олдскульных кварцевых электронных часах с цифровой индикацией.
![](https://habrastorage.org/webt/rw/to/fq/rwtofqvmucb_dg7pv0_4f_suz-i.jpeg)
▍ Декадный счётчик CD40192
Но чтобы иметь возможность ввода непосредственных значений и счёта как вперёд, так и назад, иными словами, инкрементного и декрементного, на каждый из двух десятичных разрядов потребуется отдельная шестнадцативыводная микросхема CD40192, способная работать в диапазоне напряжений питания от 3 до 18 вольт.
Микросхема имеет четыре входа J1-J4 для загрузки непосредственного значения в счётный регистр, четыре выхода Q1-Q4, инкрементный счётный вход CLOCK UP, декрементный счётный вход CLOCK DOWN, вход сброса RESET, инвертирующий вход разрешения предустановки ¬PRESET ENABLE (иными словами, вход запрета предустановки), а также инвертирующие выходы переноса ¬CARRY и заимствования ¬BORROW.
![](https://habrastorage.org/webt/yf/pk/0d/yfpk0dxar5ubog8m4ezs6snojsg.png)
▍ Что нам стоит триггер построить?
Давайте посмотрим на внутреннюю логику работы микросхемы. Данные четырёх двоичных разрядов запоминаются посредством четырёх T-триггеров со счётными входами на базе синхронных D-триггеров, снабжённых асинхронными входами установки и сброса.
![](https://habrastorage.org/webt/u7/rw/la/u7rwlafvtwzxyuwdlxf4kiev-ym.gif)
Как мы помним, триггер является электронной ячейкой памяти. Каждый из триггеров микросхемы CD40192 состоит из четырёх элементов 2И-НЕ, одного логического инвертора и четырёх элементов логики на комплементарных проходных транзисторах (CPTL, complementary pass transistor logic). Эти элементы представляют собой мультиплексорные ключи и нарисованы на схеме в виде загадочных квадратиков c буквами P и n сверху и снизу.
![](https://habrastorage.org/webt/hp/ol/vm/hpolvmrs3bbw86mbbp7jpzh9cwu.png)
Эта схема из даташита SCHS106 от Harris Semiconductor содержит ошибки (напишите в комментариях, какие), потому предлагаю рассмотреть вместо неё часть схемы сдвоенного триггера КР561ТВ1 (CD4027B).
![](https://habrastorage.org/webt/th/rw/zp/thrwzpksez7jl8rxocjvt2ojiqi.png)
Два триггера КР561ТВ1 JK типа, за что отвечает участок схемы, обведённый красным. Входы J и K сегодня нам не нужны, потому данный участок мы рассматривать не будем.
Если убрать эти лишние входы, останется синхронный D-триггер. Чтобы получить из него счётный Т-триггер, необходимо соединить вход данных с инвертирующим выходом. Это изображено в виде зелёного проводника.
Получился точно такой же триггер, как в CD40192, только без ошибок. Давайте пронумеруем логические элементы, чтобы можно было описать состояния триггера уравнениями булевой алгебры.
![](https://habrastorage.org/webt/ba/8_/nv/ba8_nvrioiuulay7gkwhovj5gxm.png)
При логическом нуле на входе тактирования мультиплексорные ключи A и D замкнуты, а B и C — разомкнуты. Поэтому булевы уравнения для выходов четырёх элементов 2И-НЕ будут выглядеть так.
Q4 = ¬(Q3 & ¬R).
Q1 = ¬(¬R & Q4) = ¬(¬R & ¬(Q3 & ¬R)) = R | (Q3 & ¬R).
Если на входе R логическая единица, получаем:
Q1 = 1 | (Q3 & 0) = 1.
В противном случае:
Q1 = 0 | (Q3 & 1) = Q3.
Q2 нас не интересует, так как сигнал с его выхода никуда не подаётся.
И наконец, получаем уравнение для неинвертирующего выхода триггера:
Qx = Q3 = ¬(¬S & Q4) = ¬(¬S & ¬(Q3 & ¬R)) = S | (Q3 & ¬R).
Если на входе S логическая единица, то:
Qx = Q3 = 1 | (Q3 & ¬R) = 1.
А при низком логическом уровне на входе установки получается:
Qx = Q3 = 0 | (Q3 & ¬R) = Q3 & ¬R.
Иными словами, при логическом нуле на входе сброса состояние неинвертирующего выхода триггера не изменится, а при логической единице — сбросится в ноль.
Итак, у нас получился прекрасный RS-триггер. Но теперь давайте рассмотрим, что происходит при появлении высокого логического уровня на тактирующем входе.
Теперь мультиплексорные ключи A и D разомкнуты, зато замкнуты B и C. Получаем следующие уравнения.
Qx = Q3 = ¬(¬S & Q1) = S | ¬Q1.
Подставляем старое состояние выхода Q1, равное старому состоянию выхода Q3, если не было сигнала асинхронного сброса.
Qx = S | ¬Qx.
Итак, положительный фронт тактирующего импульса изменяет состояние неинвертирующего выхода триггера на противоположное по сравнению с предыдущим, если неактивны сигналы асинхронных сброса или установки.
При высоком уровне на асинхронном входе установки неинвертирующий выход триггера установится в единицу вне зависимости от состояния остальных входов.
¬Qx = Q4 = ¬(Qx & ¬R). = ¬Qx | R.
Логическая единица на асинхронном входе сброса переведёт неинвертирующий выход триггера в единицу вне зависимости от состояния остальных входов и неинвертирующего выхода.
А при логическом нуле на входе R состояние инвертирующего выхода будет противоположным состоянию инвертирующего. Получается такая таблица состояний нашего счётного триггера.
![](https://habrastorage.org/webt/-f/dh/ox/-fdhoxl91kmf_xqvgmdw4ld9ahi.png)
Заметим, что в случае триггера, построенного по такой схеме, может случиться коллизия, когда на его входы одновременно поданы сигналы асинхронных установки и сброса. Тогда и на инвертирующем, и на неинвертирующем выходе триггера будут логические единицы, что лишено смысла.
Однако после снятия ошибочного сигнала триггер придёт в адекватное состояние. И как мы увидим далее, разработчики реверсивного счётчика CD40192 предусмотрели защиту от одновременной подачи на триггер сигналов установки и сброса.
Теперь мы знаем, как работают триггеры этой микросхемы, и готовы к изучению подсистемы асинхронной загрузки непосредственного значения в счётный регистр.
![](https://habrastorage.org/webt/yf/pk/0d/yfpk0dxar5ubog8m4ezs6snojsg.png)
Эта подсистема состоит из четырёх одинаковых узлов управляющей логики, каждый из которых содержит по одному логическому элементу НЕ, И, 3И-НЕ и 2ИЛИ-НЕ.
Запишем уравнение состояния для сигналов установки и сброса триггеров счётного регистра:
Sx = ¬(¬PE & Jx & Rx) = ¬(¬PE & Jx & Rx).
¬Sx = ¬PE & Jx & Rx.
Это означает, что для установки триггера необходимо состояние логической единицы одновременно на входе данных соответствующего разряда и входе сброса данного триггера, а также логический ноль на инвертирующем входе разрешения предустановки.
![](https://habrastorage.org/webt/th/rw/zp/thrwzpksez7jl8rxocjvt2ojiqi.png)
В отличие от CD4027B, входы установки и сброса внутренних триггеров CD40192 являются инвертирующими. У CD4027B просто добавлены два логических элемента «НЕ», чтобы получить неинвертирующие входы.
![](https://habrastorage.org/webt/yf/pk/0d/yfpk0dxar5ubog8m4ezs6snojsg.png)
А так выглядит булево уравнение для сигнала асинхронного сброса триггера.
¬Rx = (¬Jx & ¬PE) | RESET.
Здесь всё просто. Триггер будет сброшен при логической единице на входе общего сброса, либо если разрешена запись непосредственного значения, и на соответствующем входе данных присутствует низкий логический уровень.
Осталось рассмотреть, как происходит сам процесс подсчёта импульсов. На схеме мы видим, что состояние каждого из четырёх триггеров выводится на соответствующую ножку микросхемы через инвертор и инвертирующий буфер.
![](https://habrastorage.org/webt/u7/rw/la/u7rwlafvtwzxyuwdlxf4kiev-ym.gif)
Также предусмотрены инвертирующие выходы переноса ¬CARRY и заимствования ¬BORROW, переходящие в логический ноль, соответственно, при переполнении и опустошении четырёхразрядного счётчика.
Формула состояния счётного входа триггера первого разряда выглядит так:
¬CL = ¬(CLOCK UP & CLOCK DOWN).
Получается, что для перебрасывания триггера необходим не только переход инкрементного или декрементного входа из нуля в единицу, но и высокий логический уровень на другом из этих двух входов.
![](https://habrastorage.org/webt/n3/bg/ma/n3bgmaibtj23pomnpbbaujkmbsa.gif)
Логические элементы, изображённые на схеме сверху и снизу от счётных триггеров, задают условия тактирования последних при счёте вверх и вниз.
![](https://habrastorage.org/webt/u7/rw/la/u7rwlafvtwzxyuwdlxf4kiev-ym.gif)
В отличие от считающего до 1111b = 15 двоичного счётчика CD40193, CD40192 является двоично-десятичным счётчиком. Потому сброс регистра в 0000b = 0 и формирование сигнала переноса происходит после инкрементного счёта до 1001b = 9.
Чтобы осуществить многоразрядный двоично-десятичный счёт, необходимо соединить выходы переноса и заимствования младшего разряда соответственно с инкрементным и декрементным счётными входами старшего.
![](https://habrastorage.org/webt/zn/td/su/zntdsu8kj4sea92eui537wekxbm.gif)
Наш сегодняшний электронный секундомер считает только вниз, поэтому выход заимствования микросхемы IC4 соединён с декрементным входом IC3. Выход переноса IC4 никуда не подключён, а инкрементные входы обеих микросхем соединены с плюсом питания, чтобы на них всегда была логическая единица.
![](https://habrastorage.org/webt/3l/xg/-u/3lxg-ugiw-dhxo3oeplsd2azg-s.gif)
Выходы данных IC3 и IC4 соединены с соответствующими входами уже хорошо знакомых нам двоично-десятичных дешифраторов CD4511 — IC1 и IC2, управляющих, соответственно, семисегментными индикаторами DS1 и DS2.
Для непосредственного ввода двоично-десятичных цифр применяются счетверённые микропереключатели, соединяющие входы данных IC3 и IC4 с плюсом питания. Для подтяжки этих входов к земле устройства использованы две резисторные сборки RP1 и RP2, каждая из которых содержит четыре резистора сопротивлением 10 килоом.
На двух логических элементах 2И-НЕ микросхемы IC5 собран симметричный RS-триггер. Он устанавливается в логическую единицу кнопкой К1 и сбрасывается сигналом низкого уровня с выхода заимствования счётчика старшей декады IC3.
Логическая единица на выходе триггера запускает счёт секунд, запрещая загрузку непосредственных значений в регистры счётчиков. То есть, К1 — это кнопка запуска отсчёта.
Соответственно, логический нуль переводит счётчики в режим асинхронной загрузки, когда обратный отсчёт заблокирован, и данные считываются с микропереключателей SW1 и SW2.
Вне зависимости от состояния триггера, можно остановить отсчёт и загрузить числа с микропереключателей, нажав кнопку К2. Это кнопка сброса.
А кнопка К3 закорачивает времязадающий конденсатор C3 генератора секундных импульсов на микросхеме IC7 NE555 (КР1006ВИ1). Это точно такой же генератор, как и у двух прошлогодних секундомеров.
Таким образом, К3 — это кнопка паузы. Она не влияет на содержимое счётчиков. Отсчёт секунд приостанавливается на время, пока эта кнопка нажата.
Итак, таймер обратного отсчёта работает следующим образом. Когда триггер IC5A IC5B установлен в единицу, счётчики считают секунды в обратном порядке до тех пор, пока не досчитают до нуля.
Далее триггер сбрасывается в ноль, и счётчики переходят в режим загрузки непосредственного значения с микропереключателей. Одновременно с этим загорается светодиод D1 и открывается транзистор Q1, в коллекторную цепь которого включён зуммер В1.
▍ Ошибки на плате
Зуммер пищит, сигнализируя о том, что пришёл Новый год. Или о том, что завершена термическая обработка ингредиента для праздничного блюда. Или просто о том, что схема собрана без ошибок.
Таких ошибок на плате было две. И как всегда, это были отсутствующие фрагменты дорожек.
![](https://habrastorage.org/webt/vj/5a/s1/vj5as1ftqbkimvxjwrzxpqx0-ea.jpeg)
На этот раз первая из них находилась между ближайшим до микропереключателя выводом резистора R3 и четвёртым выводом счётчика IC4, из-за чего сигнал генератора секундных импульсов никуда не попадал и числа на индикаторах не уменьшались.
![](https://habrastorage.org/webt/x6/ko/6v/x6ko6vkvy06f_qld1jd47tr_zl4.jpeg)
Вторая дорожка, которую «забыли» проложить на плате, соединяет 13-й вывод IC4 с 4-м выводом IC3, то есть, передаёт сигнал заимствования с младшей декады на декрементный вход старшей. Без этого проводника не будут убывать десятки секунд и не произойдёт сброса триггера с индикацией о завершении отсчёта.
После приведения платы в соответствии с приложенной схемой самоделка заработала как полагается.
Скидки, итоги розыгрышей и новости о спутнике RUVDS — в нашем Telegram-канале ?
![](https://habrastorage.org/webt/4g/dr/oa/4gdroaajo7o0zzvwwx5__rlzhwi.png)