Лабораторный таймер: импортозамещение из подручных материалов

Вводная

Мне понадобился простой программируемый таймер, он же реле времени. Простая штуковина, которая в указанное время замыкает контакты. Одним словом, ничего сложного.

Вот только с началом санкций даже такое простое лабораторное оборудование купить стало невозможно. Вот хороший пример: 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. Осталось определиться с интерфейсом ввода и индикации. Так как я хотел чтобы устройство было эффективно не только в экономическом плане, но и в плане удобства пользователя, то интерфейс ввода я решил ограничить двумя кнопками:

  1. Изменяет выбранный параметр

  2. Вход или выход из режима настройки

У этого микроконтроллера есть три выхода, состочние которых можно проверить одной инструкцией условного перехода! Но кнопки только две, так что и используем только два из них: 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, но я таким заниматься не буду.

Алгоритм чтения данных из внешней памяти:

  1. ALE поднимается в 1

  2. На шину адреса устанавливается адрес

  3. ALE опускаеется в 0

  4. Внешнее устройство считывает адрес

  5. PSEN опускается в 0

  6. Внешнее устройство выдает данные на шину данных

  7. PSEN поднимается в 1

  8. MCU считывает данные с шины данных

Программирование и производство

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

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

  • Недоступный для пользователя стек. Точнее, данные из него самому модифицировать можно, но только обращаясь в ту же область памяти. Ничего похожего на PUSH/POP тут нету. Впрочим, тут и указатель стека состоит из трех бит.

  • Отсутствие команд для работы с тригонометрическими функциями. Увы, хороший ПИД-регулятор будет сделать не так уж и просто.

  • Почти все регистры хранятся в памяти, причем есть команда которая переключает банк регистров (базовый адрес регистровго файла в памяти). Удобно для обработки прерываний.

  • Power-on-reset тут нету, и при подаче питание микроконтроллер начинает работу из неопределенного состояния. Зато вход Reset имеет встроенный триггер шмидта, и если повесить на него конденсатор потолще — то при включении получится этот самый power-on-reset.

Так как это все таки прототип, то устройство я собирал на макетной плате. За что я люблю макетные платы — это за их эстетичность! Не нужно гадать куда идет дорожка, достаточно взять и потянуть за провод.

Спрут проводов на макетной плате

Спрут проводов на макетной плате

С лицевой стороны устройство получилось не менее симпатичным! Возможно, вам покажется что тут слишком много компонентов для такой плевой задачи. И вы будете правы: две микросхемы можно спокойно исключить, они нужны исключительно для отладки. Да, этот контроллер можно отлаживать, и отладчик уже встроен в него: если между испульсами ALE подавать низкий уровень на SS — устройство остановит выполнение программы, оставив на шине адрес следующей инструкции. Остается вооружиться мультиметром — и можно знать что происходит внутри!

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

Универсавльный программатор для памяти с паралльным интерфейсом

Универсавльный программатор для памяти с паралльным интерфейсом

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

Так как я использую специальную ПЗУ, которая стирается ультрафиолетом, то стереть ее нужно до прошивки. Лампы для стирания у меня нет, но есть мощный ультрафиолетовый фонарик, который отлично справляется с работой:

Стирание микросхемы

Стирание микросхемы

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

e085ead55382eb47c68848d1027385f8.png

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

Итак, вот что у меня получилось:

c8f26aaff7b34c32acc4c3d2a5cc3b10.png

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

Как видите, устройство отработало точно, как и должно. Да, нужно развести плату для серийного произвоства, найти где закупить детали, немного оптимизировать прошивку, но это уже мелочи. Основная работа сделана, устройство работает, и даже когда оно не нужно в качестве лабораторного таймера — оно может работать в качестве часов.

Думаю, этот стартап обречен на успех, планирую отправиться с ним в бизнес-инкубатор Селигера. Если есть желающие стать партнерами и доработать устройство или помочь рассчитать экономическую часть стартапа — отправляйте пулл-реквесты в репозиторий со схемой и провкой: https://github.com/aleaksah/absolutely-normal-time-relay

© Habrahabr.ru