Вводная
Мне понадобился простой программируемый таймер, он же реле времени. Простая штуковина, которая в указанное время замыкает контакты. Одним словом, ничего сложного.
Вот только с началом санкций даже такое простое лабораторное оборудование купить стало невозможно. Вот хороший пример: http://www.optimum-lab.ru/product/tajmer-laboratornyj/. Отличное лабораторное устройство, но как почти прямо пишет продавец - купить его сейчас не так и просто. Другой случай: https://www.chipdip.ru/product/at8n-24-240v-ac-dc. Не такая удобная и привлекательная разработка как предыдущий вариант, зато в наличии. Но стоит почему-то непотребно много, когда для такой задачи достаточно обычного реле и таймера. А этот вариант: https://www.chipdip.ru/product0/8002563209 совмещает нездоровую цену и нездоровые сроки поставки.

Понятно почему это - везти через границу долго и сложно, на каждом этапе цена товара повышается, и всегда остается вероятность что ввезти продукцию не выйдет по неожиданной причине, и все риски закладываются в цене. Однако тренд на импортозамещение набирает обороты. Отечественные производители задумываются о том как масштабировать ватачивание из кремния новых микросхем, появляются новые отечественные производители (пусть и с иероглифами в названии), и я решил прикнуть к этому тренду.
Тратить деньги на устройство, которое нужно нечасто и не сильно мне не хочется, а потому решено сделать самому, из подручных компонентов, не вкладываясь избыточно. Что нужно для реле времени? Собственно, реле и время. И интерфейс для управления временем этого реле. Устройство не должно быть дорогим, должно содержать минимум санкционных компонентов (или не содержать их вовсе) и корректно выполнять свою функцию. Соответственно, для разработки должны быть выбраны материалы и компоненты которы производятся либо имеют отечественные аналоги. У себя я обнаружил MCS-48. Причем аж в нескольких видах: оригинальный 8049 и КР1816ВЕ39. Отличный вариант для моего устройства: уже в наличии, никакой избыточности по мощностям. Конечно, КР1816ВЕ39 выпускался в Киеве, и уже снят с выпуска, но я уверен что технологии остались где-то в академии наук, а значит в любой момент выпуск востребованных процессоров можно будет возобновить уже в России.
Важная особенность - независимо от наличия внутреннего ПЗУ, это семейство при прижатии ногии EA к питанию переходит в режим использования внешнего ПЗУ. Очень удачно что и разного рода ПЗУ у меня тоже есть!
Компоненты
Мозг я нашел, это MCS-48. Осталось определиться с интерфейсом ввода и индикации. Так как я хотел чтобы устройство было эффективно не только в экономическом плане, но и в плане удобства пользователя, то интерфейс ввода я решил ограничить двумя кнопками:
Изменяет выбранный параметр
Вход или выход из режима настройки
У этого микроконтроллера есть три выхода, состочние которых можно проверить одной инструкцией условного перехода! Но кнопки только две, так что и используем только два из них: T0 и T1. Значит, одной кнопкой входим в режим настроек и переключаемся по очереди между всеми изменяемым параметрами, а второй непосредственно их меняем. При этом сразу после запуска активируется режим настроек, чтобы реле не сработало когда не надо. Настраивать нужно не так много - текущее время и время активации реле (время активности можно сделать жестко заданным).
Индикация тоже должна быть максимальна удобна для пользователя, а потому для нее я решил использовать двустрочный дисплей с интерфейсом совместимым с HD44780. Дисплей имеет синхронный параллельный интерфейс, это нам подходит.
Запитать все это было логично от популярного источника пяти вольт - USB. К сожалению, данный микроконтроллер не поддерживает протокол USB, иначе можно было бы значительно расширить функционал устройства.
Обратите внимание, все примененн��е устройства имеют почти прямые почти отечественные аналоги. Увы, не все использованные мною детали были отечественного производства, но это будет легко исправить при масштабировании. А значит эта разработка останется актуальна в условиях тотального импортозамещения, и проект получается очень компактным в плане сложностей закупки и бюджетный в области трат. За минимальные деньги и время можно получить настолько функциональное устройство!
Разработка
Шина памяти, шина данных и GPIO в случае MCS-48 - это все одна шина. А что на ней выставлено - нужно определять по состоянию выходов ALE и PSEN. Точнее, в этом микроконтроллере нет GPIO в привычном понимании, но есть кое-что получше. Это Quasi bi-directional ports. Из особенностей - там нет жесткого нуля и единицы на выходе, а при записи определенного значения оно на короткий промежуток выдает высокий ток, а затем мягко подтягивает. Ровно то, что нужно: почти невозможно сжечь и минимум сложностей в проектировании и настройке.
Итак, общая схема такая:

Ничего сложного нет. Так как внутренняя память мне неподвластна, но можно заставить его работать с внешней памятью если подать высокий сигнал на вход EA.
Способ обращения ко внешней памяти прост: P20-P23 содержит 4 бита адреса A8-A11, D0-D7 содержит сначала 8 бит адоеса A0-A7, а затем принимает 8 бит данных D0-D7. Используются вспомогательные пины: ALE, PSEN. Так же есть пин WR, RD для использования внешней RAM, но я таким заниматься не буду.
Алгоритм чтения данных из внешней памяти:
ALE поднимается в 1
На шину адреса устанавливается адрес
ALE опускаеется в 0
Внешнее устройство считывает адрес
PSEN опускается в 0
Внешнее устройство выдает данные на шину данных
PSEN поднимается в 1
MCU считывает данные с шины данных
Программирование и производство
Программирование этого контроллера настолько же просто, насколько и нелогично. Подробно описывать этот этап я не вижу смысла, но хочу заметить несколько особенностей.
Неожиданный набор команд, а в частности отдельные команды для запуска/остановки таймера, включения отдельных прерываний и условного перехода по состоянию определенных пинов.
Недоступный для пользователя стек. Точнее, данные из него самому модифицировать можно, но только обращаясь в ту же область памяти. Ничего похожего на PUSH/POP тут нету. Впрочим, тут и указатель стека состоит из трех бит.
Отсутствие команд для работы с тригонометрическими функциями. Увы, хороший ПИД-регулятор будет сделать не так уж и просто.
Почти все регистры хранятся в памяти, причем есть команда которая переключает банк регистров (базовый адрес регистровго файла в памяти). Удобно для обработки прерываний.
Power-on-reset тут нету, и при подаче питание микроконтроллер начинает работу из неопределенного состояния. Зато вход Reset имеет встроенный триггер шмидта, и если повесить на него конденсатор потолще - то при включении получится этот самый power-on-reset.
Так как это все таки прототип, то устройство я собирал на макетной плате. За что я люблю макетные платы - это за их эстетичность! Не нужно гадать куда идет дорожка, достаточно взять и потянуть за провод.

С лицевой стороны устройство получилось не менее симпатичным! Возможно, вам покажется что тут слишком много компонентов для такой плевой задачи. И вы будете правы: две микросхемы можно спокойно исключить, они нужны исключительно для отладки. Да, этот контроллер можно отлаживать, и отладчик уже встроен в него: если между испульсами ALE подавать низкий уровень на SS - устройство остан��вит выполнение программы, оставив на шине адрес следующей инструкции. Остается вооружиться мультиметром - и можно знать что происходит внутри!
К сожалению, прошить ПЗУ мне было нечем. Я проверил прошивку на компьютере как мог, благо что компилятор поставляется вместе с очень хорошим симулятором. Покупка прошивальщика параллельных флешек - удовольствие недешевое, а учитывая что мне он нужен всего на один раз - еще и бессмысленное. Так что я решил снова собрать устройство из подручных компонентов, которое решит поставленную задачу. Конечно, было желание и тут применить MCS-48, но возникает проблема курицы и яйца. А тратить аж целый 32-х битный микроконтроллер на такую плювую задачу никак не хотелось. А потому было разработано следующее решение:

Это прибор для ручного управления процессом пришивки. Так как я ценю UX превыше всего - то ограничился не только щелкалками на выходах микросхемы, а еще и удобно расположенными переключателями и индикаторами адреса/данных. Устройство само по себе рассчитано на более популярные флешки серии 010 (AT010, SST010), но через переходник к нему можно подключить любое другое устройство. Например, мою HN462732.
Так как я использую специальную ПЗУ, которая стирается ультрафиолетом, то стереть ее нужно до прошивки. Ла��пы для стирания у меня нет, но есть мощный ультрафиолетовый фонарик, который отлично справляется с работой:

После этой процедуры (порядка двадцати минут, но возможно можно и меньше) ПЗУ стерто - все биты устанавливаются в единицы. Так же данные могут повредиться даже от солнечного света, так что окошко необходимо заклеить специальной наклейкой. Мне повезло, я нашел в продаже такие наклейки, на них даже сразу указаны цифры, чтобы можно было версти версионность записывая разные версии прошивки на разные пзу.

Теперь можно и прошить. Собрав простенький адаптер для моей флешки (перекинуты адреса, выведено наружу +25 вольт и E на тумблер с диодом), я приступил к работе. Это заняло некоторое время.
Итак, вот что у меня получилось:

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