Проектирование микропроцессорной системы управления (МКС)

курсовая работа

3.3 Функция interrupt( )

Функция interrupt( ) является обработчиком прерывания при поступлении запроса прерывания INT(сигнал Х0 от аварийного датчика) или переполнения таймер TMR0. Функция также производит отсчет времени опроса Топр.

Блок-схема алгоритма обработчика прерывания interrupt( )приведена на рисунке 3.3. Так как прерывание по INT должно иметь более высокий приоритет, то программа вначале проверяет флаг запроса внешнего прерывания INTF. Если флаг INTFустановлен (поступил сигнал Х0 от аварийного датчика), то программа переходит на выполнение блоков 2, 3 и 4 аварийной сигнализации. После вывода мигающего светового сигнала с частотой 1 Гц программа в блоке 4 зацикливается. При этом прекращается выполнение каких-либо других действий. Для выхода из аварийного режима нужно отключить питание МК или нажать кнопку «Сброс» на пульте управления.

Рисунок 3.3 - БСА функции interrupt()

Если флаг запроса внешнего прерывания INTFсброшен, то это означает, что запрос прерывания пришел от таймера TMR0 (установлен флаг T0IF). Программа переходит к обслуживанию прерываний от таймера. При каждом прерывании вследствие переполнения таймера инкрементируется переменная-счетчик counter. Если содержимое counterстает равным280, то это означает, что истекло время опроса Топр = 4.2 с (блок 6). После окончания отсчета времени 4.2 с функция interrupt( )устанавливает в 1 переменную-флаг flag_T, что является сигналом для главной программы main( ) начать новый цикл опроса датчиков и выполнения других функций управления. Если же время опроса не закончилось, то в блоке 8 в счетчик таймера TMR0 загружается число 22 для нового отсчета 15мс. Перед выходом из обработчика в блоке 9 выполняется сброс флага запроса прерывания от таймера TMR0, после чего МК будет вновь реагировать на переполнение таймера TMR0.

Рассмотрим пример реализации обработчика прерывания interrupt( ).

/* Определения глобальных переменных, используемых в функции */

charcounter = 0; //счетчик переполнений таймера TMR0

charflag_T = 0; //флаг окончания счета времени опроса

voidinterrupt() //функция-обработчик прерываний от TMR0 и INT

{

if(INTF == 1) //если запрос прерывания по INT

{

Lcd_Cmd(_LCD_CLEAR); //очиститьЖКД

Lcd_Out(1,5,"ERROR"); //вывод на дисплей

Sound_Play(500,10000); //частоты 500Гц, 10секунд

while (1) //вывод мигающего светового сигнала и зацикливание программы

{

PORTB.B1 = 1; //включитьсветодиод

Delay_ms(500); //задержка на 500мс

PORTB.B1 = 0; //выключить светодиод

Delay_ms(500); //задержка на 500мс

}

}

//запрос прерывания от таймера TMR0

counter++;

if(counter == 280) //если прошло время опроса 4.2 с

{

flag_T = 1; //установить флаг окончания отсчета

//времени Топр= 4.2с

counter = 0;

}

TMR0 = 22; //перезагрузить таймер

T0IF_bit = 0; //сбросить флаг запроса прерывания T0IF

}

Делись добром ;)