logo
HCS12 с применением языка С - royallib

Пример использования модуля меток реального времени

Ниже приведен исходный текст программы 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;

 }

}

/*---------------------------------------------------------*/