Читаем Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С полностью

  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, код которого автоматически сравнивается с кодом счетчика временной базы. Момент равенства кодов и является событием выходного сравнения.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже