27.02.2020 09:53, автор DiEitch
Всем доброго дня!
Так как "оригинальная" прошивка часов мне не совсем понравилась, я решил написать свою, что осторожно анонсировал в прошлой статье.
Первым делом, чтобы не портить контроллер (у старых пиков не такая уж и добротная в плане количества перезаписей FLASH и, особенно, EEPROM, да и постоянно "таскать" чип из панельки в программатор не хотелось), я сделал проект часов в Proteus версии 7.7. Так как всех нужных моделей там не обнаружилось, а искать сторонние не очень хотелось, я заменил К155ИД1 с лампами на аналог типа К514ИД1 со светодиодным 7-сегментным индикатором (не совсем К514ИД1, а нечто похожее, собранное на памяти с нужной таблицей состояний - ниже поясню почему именно так). Изначально в проект была загружена оригинальная прошивка, и она ... не заработала. "Странно!", подумал я и стал искать причину. Вернее, проект-то работал: ШИМ завёлся, на кнопки была адекватная реакция, точка мигала, цифры вроде переключались, но в странном порядке, вместо последовательности 0,1,2,3,4,5,6,7,8,9 при настройке времени, к примеру, получилось 9,0,8,3,6,5,1,4,7,2, и так было с цифрами везде!
Я предположил, что виновата модель протеуса PIC16F628A (т.к. в "реале" сами часы работали с этой прошивкой абсолютно нормально) и модифицировал самодельный "К514ИД1" так, чтобы было: 9->0, 0->1, 8->2 ... и так далее, в остальном же работа соответствует работе обычного семисегментного дешифратора, кроме состояний 10...15 - там ничего не выводится на индикатор (для совместимости с К155ИД1).
Проект для изучения часов можно скачать здесь. Там же есть файл прошивки памяти для "нормального дешифратора" и рабочий, для сравнения. Подозреваю, что у модели PIC16F628A в Proteus проблема с портом RA в режиме вывода, и если есть желание поэкспериментировать, вы можете более точно локализовать эту проблему (я же не стал тратить время на изучение, просто обошёл её).
Как только оригинальный проект заработал в симуляторе (кроме датчика температуры!, хотя на реальном железе он работает, так что, кто очень хочет, попробуйте "поколупать времянки" в модели DS18B20), перешёл к написанию своего. Так как с ассемблером PIC16 не хотелось возиться (хотя он и сулил бОльшие возможности часам - больше кода бы влезло), я озаботился выбором IDE и компилятора для Си. Выбор оказался не слишком большим (на Хабре была неплохая обзорная статья на эту тему):
C MPLAB не захотелось связываться, Eclipse имеет довольно высокий порог вхождения (до первой компиляции надо протереть до дыр клавиатуру, чтобы настроить, а мне всего-то на один раз надо). Т.к. с MicroC раньше приходилось работать (хотя и знаю, что компилятор там совсем "не айс"), я был уверен, что справлюсь.
Проект "накидал" за пару дней, но вот потом долго отлаживал, т.к. компилятор в реальности оказался более паскудным, чем я его помнил (больше всего бесило: неэкономность компилятора, "непонимание" основ оптимизации компилятором, глюки - оптимизация 4 и 5 НИКАК не влияет на размер кода, нет поддержки нужных #PRAGMA, про inline пришлось забыть вовсе - заменил где смог многострочными макросами). НО! Я всё-таки получил, что мне требовалось. Бета-прошивку и проект в Proteus можно скачать здесь (не бойтесь, она ничего не просит, однако её нужно ещё потестировать немного в работе).
Что умеет новая прошивка:
Краткое описание меню (квадратные скобки - кнопка):
HHMM --[OK]--> // Основной режим
HH__ ([INC]+/[DEC]-) --[OK]--> __MM ([INC]+/[DEC]-) --[OK]--> // 00...23 (09), 00...59 (11) Время
BH__ ([INC]+/[DEC]-) --[OK]--> __BM ([INC]+/[DEC]-) --[OK]--> // 00...23 (00), 00...59 (00) Время будильника
_D__ ([INC]+/[DEC]-) --[OK]--> // 0=выкл 1=вкл (0) будильник для будней
__S_ ([INC]+/[DEC]-) --[OK]--> // 0=выкл 1=вкл (0) будильник для субботы
___S ([INC]+/[DEC]-) --[OK]--> // 0=выкл 1=вкл (0) будильник для воскресенья
___W ([INC]+/[DEC]-) --[OK]--> // 1...7 (1) дни недели (Пн=1, Вт=2...)
__BB ([INC]+/[DEC]-) --[OK]--> // 34...50 (34) яркость ламп (яркость не регулируется линейно, как и у оригинальной прошивки)
__CC ([INC]+/[DEC]-) --[OK]--> // 01...50 (25) коррекция хода (32768 - 25) + CC
HHMM // Основной режим
Если не нажимать клавиши, то через некоторое время часы переходят в основной режим самостоятельно, с сохранением произведенных изменений.
HHMM --[INC]--> // Основной режим
__SS --[OK]--> // Сброс секунд, SS=0
__SS --[DEC]-->
HHMM // Основной режим
Режим секунд удобен для точной настройки часов, а также для проведения коррекции.
В основном режиме автоматически происходит следующее (круглые скобки - время):
HHMM --(25с)--> // Основной режим
TT.T_ --(3с)--> // Температура
HHMM --(2с)--> // Основной режим
___W --(3с)--> // День недели
HHMM --(25с)--> // Основной режим
**** --(2с)--> // Антиотравление катодов
HHMM // Основной режим
Прошивка по мере проверки будет обновляться.