Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
TCTL1 = 0х00; /*в качестве источника сигналов для счетчика*/
OC7M = 0x00 /*внешних событий – 3 команды*/
TSCR = 0х80; /*разрешить работу всего модуля таймера*/
PACTL = 0х70; /*разрешить работу в режиме счетчика внешних*/
/*событий по положительному фронту сигнала*/
}
/*-------------------------------------------------------------------------------*/
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.
Выбор периода генерации меток реального времени
RTR[2:0] Коэффициент деления 2х При частоте внутренней системной шины 4 МГц 8 МГц 000 зарезервирован нет нет 001 13 2,048 мс 1,024 мс 010 14 4,096 мс 2,048 мс 011 15 8,192 мс 4,096 мс 100 16 16,384 мс 8,192 мс 101 17 32,768 мс 16,384 мс 110 18 65,536 мс 32,768 мс 111 19 131,072 мс 65,536 мсРис. 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;
}
}
/*---------------------------------------------------------*/
4.16. Модуль таймера ECT в составе МК МC68HC12BE32 и HCS12
Все микроконтроллеры семейства HCS12 и всего одна модель MC68HC12BE32 семейства 68HC12 оснащены более совершенным модулем таймера ECT (Enhanced Capture Timer). Модуль таймера EST унаследовал основные технические решения от своего предшественника — модуля таймера TIM. Поэтому, так же как в модуле TIM, основу таймера EST составляют 16-разрядный счетчик временной базы и восемь универсальных каналов захвата/сравнения.
Однако в модуле EST четыре канала из восьми в режиме входного захвата обладают дополнительным регистром. Такое решение позволяет в режиме входного захвата зафиксировать два момента изменения сигнала на входе канала прежде, чем будет установлен триггер события в канале CnF. Рассматриваемые каналы называют буферированными, они могут работать как в режиме временного хранения, так и в режиме очереди. Четыре оставшихся канала называют небуферированными. Правила функционирования этих каналов в режиме входного захвата полностью соответствуют аналогичным для модуля TIM. Полный набор функций каналов захвата/сравнения модуля таймера EST приведен на рис. 4.49.
Рис. 4.49. Усовершенствованный модуль таймера ECT
Второе отличие модуля EST от модуля TIM состоит в том, что модуль EST имеет в своем составе четыре 8-разрядных счетчика события (PACN3…PACN0). Эти счетчики могут быть объединены парами для получения двух 16-разрядных счетчиков событий: (PACN3:PACN2) и (PACN1:PACN0).
Обратимся далее к более подробному рассмотрению дополнительных режимов работы модуля EST.
4.16.1. Небуферированные каналы входного захвата
Алгоритм функционирования небуферированных каналов входного захвата полностью аналогичен функционированию в аналогичном режиме каналов модуля TIM. Однако небуферированные каналы модуля EST снабжены дополнительной функцией управления режимом. Регистр управления порядком перезаписи ICOVW (Input Control Overwrite Register) содержит восемь битов NOVWn (рис. 4.49). Если бит NOVWn установлен в 1, то регистр данных небуферированного канала с номером n не может быть перезаписан под действием аппаратных средств, пока этот регистр не будет считан программой. Если бит NOVWn = 0, то функция блокировки записи для небуферированного канала снимается.