Проанализируйте функцию toggle_isr. Генерацию какого импульсного сигнала она обеспечивает?
В следующем примере timer4.c показаны потенциальные возможности подсистемы выходного сравнения, обслуживаемой по прерываниям. В примере генерируются сразу две импульсные последовательности с разными частотами и коэффициентами заполнения. Нетрудно видеть, что число одновременного генерируемых импульсных сигналов может быть увеличено.
/*------------------------------------------------------------------------*/
/*filename: timer4.c */
/*МAIN PROGRAМ: Эта программа генерирует две импульсных последовательности*/
/* с использованием таймера и двух каналов подсистемы прерывания */
/* Сигналы формируются на выходах 2 и 3 таймера. */
/*------------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
/*используемые функции*/
void initialize(void); /*функция инициализации*/
void toggle1_isr(void); /*подпрограмма прерывания toggle1_isr*/
void toggle2_isr(void); /*подпрограмма прерывания toggle2_isr*/
//объявление функции обслуживания прерывания
#pragma interrupt_handler toggle1_isr
#pragma interrupt_handler toggle2_isr
//инициализация векторов прерывания
#pragma abs_address: 0xF7E8
void (*Timer_Channel_3_interrupt_vector[]) = {toggle2_isr};
void (*Timer_Channel_2_interrupt_vector[]) = {toggle1_isr};
#pragma end_abs address
void main(void) {
initialize; /*инициализация подсистемы таймера*/
TMSK1 = 0х0C; /*разрешение прерывания по событию в каналах 2 и 3*/
TFLG1 = 0xFF; /*сброс всех флагов событий от каналов*/
CLI; /*разрешить прерывания*/
while(l) {
/*ожидание прерывания*/
;
}
}
/*-------------------------------------------------------------*/
/* Функция initialize задает начальные установки модуля таймера*/
/*-------------------------------------------------------------*/
void initialize(void) {
TMSK2 = 0x02; /*назначить коэффициент деления 4*/
TIOS = 0х0C; /*установить каналы 2 и 3 в режим выходного*/
/*сравнения*/
TSCR = 0х80; /*разрешить работу таймера*/
TCTL2 = 0х50; /*назначить режим формирователя уровня */
/*инвертирование для обоих каналов*/
}
/*------------------------------------------------------------------*/
/* Функция toggle1_isr подпрограмма прерывания по событию в канале 2*/
/*------------------------------------------------------------------*/
void toggle1_isr(void) {
TFLG1 = 0x04; /*сброс флага события канала 2*/
ТС2 += 9091; /*задать код сравнения в регистр данных канала*/
}
/*------------------------------------------------------------------*/
/*-------------------------------------------------------------------*/