Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
HCS12 с применением языка С - royallib.ru.doc
Скачиваний:
120
Добавлен:
11.03.2016
Размер:
2.28 Mб
Скачать

4.15. Модуль меток реального времени

Многие применения требуют организации выполнения одного и того же фрагмента программы через равные интервалы времени. Для удобства разработчиков МК семейства 68HC12/HCS12 оснащены специальным модулем меток реального времени RTI (Real Time Interrupt), который генерирует равноотстоящие во времени запросы на прерывание (рис. 4.47). Тогда фрагмент программы, которые должен исполняться через равные интервалы времени, может быть оформлен как подпрограмма прерывания по запросу RTI. И желаемый алгоритм функционирования устройства будет реализован.

Рис. 4.47.  Временная диаграмма, поясняющая принцип действия модуля меток реального времени, и регистры управления модулем

Модуль меток реального времени RTI использует два регистра специальных функций: регистр управления RTICTL (Real Time Interrupt Control Register) и регистр флагов RTIFLG (Real Time Interrupt Flag Register).

Бит RTIE в регистре управления RTICTL (рис. 4.47) разрешает работу подсистемы меток реального времени. При RTIE = 1 подсистема находится в активном состоянии, при RTIE = 0 работа системы запрещена. Биты RTR2:RTR1:RTR0 определяют период следования меток реального времени. Таблица рис. 4.47 устанавливает соответствие между кодовой комбинацией битов RTR2:RTR1:RTR0 и временным интервалом между двумя соседними метками модуля RTI. Последний именуют периодом RTI.

Выбор периода генерации меток реального времени

Рис. 4.47. Временная диаграмма, поясняющая принцип действия модуля меток реального времени, и регистры управления модулем

Рис. 4.48. Блок-схема алгоритма часов реального времени

Регистр флагов RTIFLG (рис. 4.47) содержит всего один флаг RTIF. Этот флаг устанавливается, когда модуль закончил отсчет очередного периода RTI.

Счетчик подсистемы меток реального времени тактируется импульсной последовательностью с частотой fBUS . В модуле меток реального времени эта частота делится. Коэффициент деления, устанавливаемый разрядами RTR2:RTR1:RTR0, можно выбрать по таблице рис. 4.47. Проанализировав данные таблицы, можно установить, что для МК с частотой внутренней шины 8 МГц максимальный период меток реального времени составляет примерно 65 мс.

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

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

 }

}

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]