half_cycle(low_time); /*генерация низкого уровня*/
}
}
/*--------------------------------------------------------------------*/
/* Функция timer_init производит инициализацию модуля таймера. */
/* Канал 2 таймера настраивается на режим выходного сравнения. */
/* Частота тактирования счетчика временной базы устанавливается 2 МГц.*/
/*--------------------------------------------------------------------*/
void timer_init(void) {
TMSK1 = 0x00; /*запретить прерывания от каналов таймера*/
TMSK2 = 0x02; /*назначить коэффициент деления 4*/
TIOS = 0х04; /*установить канал 2 в режим выходного сравнения*/
TSCR = 0х80; /*разрешить работу таймера*/
TCTL2 = 0х10; /*назначить режим формирователя уровня */
/*"инвертирование"*/
TFLG1 = 0x04; /*очистить флаг события канала 2*/
TC2 = TCNT; /*записать в регистр данных канала 2 текущее*/
/*состояние счетчика временной базы*/
}
/*------------------------------------------------------------------------*/
/* Функция half_cycle генерирует временной интервал заданной длительности */
/* Число тактов для отсчета должно быть определено вне функции */
/*------------------------------------------------------------------------*/
void half_cycle(unsigned int time) {
ТС2 += time; /*задать код сравнения в регистр данных канала*/
while ((TFLG1 & 0x04) == 0) /*ожидать события выходного сравнения*/
{
;
}
TFLG1 = 0x04; /*очистить флаг события канала 2*/
}
/*------------------------------------------------------------------------*/
Предложенный к рассмотрению программный фрагмент (timer2.c) отличается своей простотой и легкостью отладки. Это объясняется использованным методом программного опроса триггера события канала. Однако такой способ генерации импульсного сигнала становится непригодным, если по условию задачи управления необходимо формировать сразу несколько импульсных сигналов, и в каждом из них должны быть точно реализованы их временные параметры. Поэтому рассмотрим способ генерации импульсного сигнала с использованием подсистемы выходного сравнения таймера и подсистемы прерывания.
Цель рассматриваемого примера (timer3.c) — познакомить читателя с техникой генерации импульсных сигналов с использованием подсистемы выходного сравнения, перезагрузка регистра данных которой реализуется в подпрограмме прерывания по очередному событию в канале выходного сравнения. Ниже перечислены биты и регистры управления, которые используются в данном примере:
• Бит разрешения работы модуля таймера TEN (регистр управления модулем таймера TSCR);
• Бит разрешения прерывания по переполнению счетчика временной базы TOI и биты выбора коэффициента деления программируемого делителя частоты на входе счетчика временной базы PR2:PR1:PR0 (регистр масок таймера TMSK2);
• Бит выбора режима работы канала IOSn (регистр режимов каналов захвата/сравнения TIOS). Если бит IOSn установлен в 1, то канал работает в режиме выходного сравнения;
• Биты выбора режима работы формирователя уровня канала выходного сравнения OMn:OLn (регистры управления таймером TCTL1 и TCTL2);
• Бит события в канала CnF (регистр флагов таймера TFLG1);
• Бит разрешения прерывания по событию в канале выходного сравнения CnI (регистр масок таймера TMSK1);
• Регистр данных канала TCn, код которого автоматически сравнивается с кодом счетчика временной базы. Момент равенства кодов и является событием выходного сравнения.