Часы на ГРИ - перезагрузка

Создано 27.02.2020 9: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 и компилятора для Си. Выбор оказался не слишком большим (на Хабре была неплохая обзорная статья на эту тему):

  • MPLAB,
  • MicroC Pro for PIC by MicroElectronica
  • и связка Eclipse+MPLAB XC16.

C MPLAB не захотелось связываться, Eclipse имеет довольно высокий порог вхождения (до первой компиляции надо протереть до дыр клавиатуру, чтобы настроить, а мне всего-то на один раз надо). Т.к. с MicroC раньше приходилось работать (хотя и знаю, что компилятор там совсем "не айс"), я был уверен, что справлюсь.

Проект "накидал" за пару дней, но вот потом долго отлаживал, т.к. компилятор в реальности оказался более паскудным, чем я его помнил (больше всего бесило: неэкономность компилятора, "непонимание" основ оптимизации компилятором, глюки - оптимизация 4 и 5 НИКАК не влияет на размер кода, нет поддержки нужных #PRAGMA, про inline пришлось забыть вовсе - заменил где смог многострочными макросами). НО! Я всё-таки получил, что мне требовалось. Бета-прошивку и проект в Proteus можно скачать здесь (не бойтесь, она ничего не просит, однако её нужно ещё потестировать немного в работе).

Что умеет новая прошивка:

  • антиотравление катодов каждую минуту;
  • правильное энергосбережение (прошивка автора тупо съедает литиевую батарейку за пару недель);
  • коррекция хода;
  • синхронизация секунд (отображение и сброс секунд);
  • отображение температуры с десятыми;
  • отображение дня недели;
  • обработка клавиш на отпускание (а не на нажатие);
  • будильник для будних дней (пн-пт), для субботы, для воскресенья;
  • запоминание некоторых настроек;
  • на микроконтроллере PIC16F648 возможна работа с датами (число, месяц, год, учёт високосных и т.п.).

Краткое описание меню (квадратные скобки - кнопка):

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 // Основной режим

Прошивка по мере проверки будет обновляться.