Рис. 17.2.
Задача формирования временных отсчетов
Все процессы привязаны ко времени. Временная привязка реализована аппаратно, генерацией прерывания с периодичностью 50 раз в секунду. Изменение значений секунд и минут происходит после накопления определенного количества тиков. Эти значения в дальнейшем используются для выполнения требуемых процессов.
При обнаружении нажатия на кнопку ПАУЗА декрементирование этих счетчиков приостанавливается, за счет чего обратный отсчет времени можно «заморозить» на сколь угодно длительный временной интервал.
Задача отображения времени
Состояние счетчика, а также вспомогательную информацию необходимо выводить на двухразрядный дисплей. Поскольку в процессе вывода осуществляется преобразование параллельного кода в последовательный, а также его передача по последовательному каналу, эту задачу лучше выделить в отдельный модуль.
Фоновый (основной) процесс
Фоновый процесс осуществляет в цикле вывод на индикатор значение счетчика минут до тех пор, пока он не станет равным нулю. При замыкании кнопки СТОП происходит преждевременный выход из цикла.
Процесс установки интервала
Если в момент сброса микроконтроллера кнопка УСТ. находится в замкнутом состоянии, то вызывается подпрограмма SETT. Эта подпрограмма постепенно уменьшает выводимое на дисплей число до тех пор, пока кнопка не будет отпущена. Последнее показанное число сохраняется в EEPROM и используется всеми запускаемыми впоследствии фоновыми процессами в качестве начального значения для отсчета интервала.
Процесс самодиагностики
Если при сбросе кнопка ДИАГ. находится в замкнутом состоянии, то управление передается в подпрограмму диагностики. Основной задачей этой подпрограммы является проверка всех периферийных устройств, чтобы облегчить нахождение неисправного узла.
Все процессы зависят от задачи формирования временных отсчетов, которая предоставляет базовую информацию о реальном времени. Как показано в Программе 17.1, эта задача реализована в виде обработчика прерывания от Таймера 0. Предделитель таймера сконфигурирован таким образом, чтобы при системной тактовой частоте 3.2763 МГц переполнение таймера происходило бы каждые 1/50 с. Поскольку прерывание от Таймера 0 разрешено (см. Программу 17.3), микроконтроллер будет переходить к обработчику прерывания при каждом переполнении таймера — каждые 256 импульсов с выхода предделителя. Учитывая, что частота внутреннего тактового сигнала составляет 1/4 от частоты резонатора, коэффициент деления предцелителя, равный 64, позволит нам формировать отсчеты времени 50 раз в секунду, т. е. 3.2763x106/4x64x256 = 50
Итак, обработчик прерывания будет выполнять следующие задачи:
1. ЕСЛИ кнопка ПАУЗА отпущена, ТО
а) Декрементировать счетчики на один тик.
б) Если прошла секунда, то установить соответствующий флаг.
2. ИНАЧЕ
а) Переключить флаг состояния ПАУЗА.
б) ЕСЛИ он установлен, ТО показать, что работа таймера приостановлена.
в) ИНАЧЕ отобразить время (нормальная работа).
г) Ждать, пока не будет отпущена кнопка УСТ.
3. Выйти из прерывания.