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

Проанализируйте функцию 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; /*задать код сравнения в регистр данных канала*/

}

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


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

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