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

Пак Дэниэл Дж.

Шрифт:

• Бит события в канала CnF (регистр флагов таймера TFLG1);

• Бит разрешения прерывания по событию в канале выходного сравнения CnI (регистр масок таймера TMSK1);

• Регистр данных канала TCn, код которого автоматически сравнивается с кодом счетчика временной базы. Момент равенства кодов и является событием выходного сравнения.

В тексте примера 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;

 /*сброс всех флагов событий от каналов*/

  • Читать дальше
  • 1
  • ...
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: