Технологии управления несколькими светодиодами с помощью одного вывода микроконтроллера давно и хорошо известны. Как правило, эта задача решается путем формирования импульсных последовательностей с разными длительностями и периодами повторения и разделением каналов с помощью нескольких RC-цепочек. Описанная здесь конструкция намного проще.
Вывод микропроцессора подключен к тактовому входу последовательного счетчика, имеющего выходы промежуточных каскадов (Рисунок 1). В своей простейшей форме этот конечный автомат состоит из двух D-триггеров, соединенных каскадно, чтобы образовать двухразрядный счетчик со сквозным переносом. Старший значащий бит счетчика (MSB) также подключен к тактовому входу через резистор R1.
Рассмотрим случай, когда счетчик меняет состояние по переднему фонту входного импульса. Если вывод микропроцессора сконфигурирован как выход, он может использоваться для тактирования, чтобы установить все возможные состояния счетчика. Но непонятно, как процессор вообще узнает, в каком состоянии находится счетчик. Однако если процессор сможет распознать одно состояние счетчика, он будет знать, сколько тактовых импульсов нужно подать на него, чтобы достичь любого другого желаемого состояния.
Процессор может начать определение начального состояния счетчика с выполнения цепочки действий, которую назовем HighClockRead. HighClockRead состоит из последовательной установки на выводе состояний «лог. 1», «лог. 0», «лог. 1» с последующим переключением вывода на ввод и ожиданием порядка микросекунды стабилизации заряда емкости вывода через резистор R1. Затем считывается состояние MSB.
Если считанное состояние соответствует «лог. 1», запускается еще один цикл HighClockRead. Если считан низкий уровень, начинается выполнение последовательности LowClockRead. Для этого на выводе устанавливается «лог. 0», затем «лог. 1», после чего процессор переходит к ожиданию чтения MSB, как в случае с HighClockRead. (Выполнение в зависимости от ситуации последовательности LowClockRead или HighClockRead гарантирует, что в каждой цепочке ClockRead происходит только одна смена уровня тактового сигнала (от низкого уровня к высокому) и что счетчик продвигается только на одно состояние). Процессор продолжает выполнение последовательностей HighClockRead или LowClockRead. Он останавливается, когда обнаруживает в MSB счетчика состояние «лог. 1», которому предшествовало состояние «лог. 0».
Поскольку схема счетчика такова, что при прохождении всех возможных его состояний уровень MSB меняется с низкого на высокий только один, процессор теперь знает точное состояние счетчика. Это означает, что для перевода счетчика в желаемое состояние всегда можно сформировать нужное количество переходов от низкого уровня к высокому (без промежуточных считываний).
Эта схема работает, потому что микропроцессор может считывать состояние счетчика и изменять его настолько быстро, что глаз не в состоянии увидеть какие-либо промежуточные состояния светодиодов. Единственные временные требования состоят в том, чтобы задержка в счетчике и время установления RC учитывались процессором. Это требование легко выполняется.
Если состояние счетчика известно и его необходимо изменить, нет необходимости считывать его после каждого тактового импульса. Вместо этого, чтобы обеспечить синхронизацию счетчика может быть предпочтительнее считывать только два состояния, в которых ожидается, что за низким уровнем последует высокий.
Чтобы свести к минимуму рассеивание мощности на резисторе когда счетчик не тактируется, чтобы определить конкретное состояние светодиода, вывод процессора нужно сконфигурировать как выход или установить на нем тот же логический уровень, в котором находится MSB.