В тексте примера timer3.c мы будем генерировать импульсный сигнал с произвольной частотой и коэффициентом заполнения. Проанализировав текст программа Вы объясните, какую форму и какие временные параметры будет иметь формируемый сигнал.
Прежде, чем знакомиться с текстом программы timer3.c, вспомним, как оформляются подпрограммы прерывания при программировании на Си. Сначала следует убедиться, что Ваш заголовочный файл содержит определения макросов, которые позволят Вам использовать одноименные с командами ассемблера функции для запрета и разрешения прерываний в системе (см. раздел 4.12):
#define CLI asm("cli\n"); //разрешить маскируемые прерывания
#define SEI asm("sei\n"); //запретить маскируемые прерывания
Также следует отметить, что специфика записи подпрограммы прерывания частично определяется типом используемого компилятора. В соответствии с предварительной договоренностью, в текстах примеров этой книги используется компилятор ICC12 компании ImageСraft.
/*----------------------------------------------------------------------*/
/* filename: timer3.c */
/* МAIN PROGRAМ: Эта программа генерирует импульсную последовательность */
/* в форме меандра с использованием таймера и подсистемы прерывания */
/* Сигнал формируется на выходе 2 таймера (IC2) */
/*----------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
/*используемые функции*/
void initialize(void); /*функция инициализации*/
void toggle_isr(void); /*подпрограмма прерывания toggle_isr*/
//объявление функции обслуживания прерывания
#pragma interrupt_handler toggle_isr
//инициализация вектора прерывания
#pragma abs_address: 0xF7EA
void (*Timer_Channel_2_interrupt_vector[]) = {toggle_isr};
#pragma end_abs address
/*глобальные переменные*/
int с;
void main(void) {
с = 100;
initialize; /*инициализация подсистемы таймера*/
TMSK1 = 0х04; /*разрешение прерывания по событию в канале 2*/
TFLG1 = 0xFF; /*сброс всех флагов событий от каналов*/
CLI; /*разрешить прерывания*/
while(1) {
/*ожидание прерывания*/
;
}
}
/*-------------------------------------------------------------*/
/* Функция initialize задает начальные установки модуля таймера*/
/*-------------------------------------------------------------*/
void initialize(void) {
TMSK2 = 0x02; /*назначить коэффициент деления 4*/
TIOS = 0х04; /*установить канал 2 в режим выходного сравнения*/
TSCR = 0х80; /*разрешить работу таймера*/
TCTL2 = 0х10; /*назначить режим формирователя уровня */
/*инвертирование*/
}
/*----------------------------------------------*/
/* Функция toggle_isr – подпрограмма прерывания */
/*----------------------------------------------*/
void toggle_isr(void) {
TFLG1 = 0xFF;
/*сброс всех флагов событий от каналов*/
ТС2 = TC2 + c;
/*задать код сравнения в регистр данных канала*/
c = c + 100;
/*вычислить новое значение c*/
}
/*-----------------------------------------------*/