Ниже приведен исходный текст программы realtime.c для реализации часов реального времени на основе отсчетов модуля RTI с интервалами 8,196 мс. В подпрограмме прерывания программный счетчик накапливает 122 отсчета RTI (рис.4.48), которые составляют временной интервал длительностью 1 с. По прошествии каждой секунды инкрементируется программный счетчик sec_ctr, по прошествии каждой минуты — счетчик mins_ctr и т.д. вплоть до счетчика дней.
При желании функции программы можно расширить, введя подсчет дня недели, месяца и года.
/*-----------------------------------------------------------------------*/
/* filename: realtime.c */
/* МAIN PROGRAМ: Эта программа генерирует две импульсных */
/* последовательности с использованием таймера и двух каналов подсистемы */
/* прерывания.Сигналы формируются на выходах 2 и 3 таймера. */
/*-----------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
/*используемые функции*/
void RTI_isr{void); /*подпрограмма прерывания по RTI*/
/* interrupt pragma */
#pragma interrupt_handler RTI_isr
/*инициализация таблицы векторов прерывания*/
#pragma abs_address: 0xF7F0
void (*RTI_interrupt_vector[]) ={RTI_isr};
#pragma end_abs_address
/*глобальные переменные*/
unsigned int ms_ctr, sec_ctr, mins_ctr, hrs_ctr, days_ctr;
void main{void) {
ms_ctr = 0; /*инициализация переменных*/
sec_ctr = 0;
mins_ctr = 0;
hrs_ctr = 0;
days_ctr = 0;
RTICTL = 0х84; /*разрешить прерывания от модуля RTI, выбрать*/
CLI; /*период RTI 8,196 мс*/
while(1) /*ожидать прерывание*/
{
;
}
}
/*---------------------------------------------------------*/
/* Функция RTI_isr подпрограмма прерывания каждые 8,196 мс */
/*---------------------------------------------------------*/
void RTI_isr(void) {
RTIFLG = 0х80; /*сброс флага события RTI*/
ms_ctr = ms_ctr+1; /*обновить счетчик миллисекунд*/
if (ms_ctr == 122) /*обновить счетчик секунд*/
{
ms_ctr = 0;
sec_ctr = sec_ctr + 1;
}
if (sec_ctr == 60) /*обновить счетчик минут*/
{
sec_ctr = 0;
mins_ctr = mins_ctr + 1;
}
if (mins_ctr == 60) /*обновить счетчик часов*/
{
mins_ctr = 0;
hrs_ctr = hrs_ctr + 1;
}
if (hrs_ctr == 24) /*обновить счетчик дней*/
{
hrs_ctr = 0;
days_ctr = days_ctr + 1;
}
}
/*---------------------------------------------------------*/
4.16. Модуль таймера ECT в составе МК МC68HC12BE32 и HCS12
Все микроконтроллеры семейства HCS12 и всего одна модель MC68HC12BE32 семейства 68HC12 оснащены более совершенным модулем таймера ECT (Enhanced Capture Timer). Модуль таймера EST унаследовал основные технические решения от своего предшественника — модуля таймера TIM. Поэтому, так же как в модуле TIM, основу таймера EST составляют 16-разрядный счетчик временной базы и восемь универсальных каналов захвата/сравнения.