КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Прерывания в PIC18: источники прерываний, управляю-е биты, программирование прерываний на языке С18.Микроконтроллеры PIC18 имеют несколько источников прерываний и функцию приоритетной системы прерываний, которая позволяет для каждого источника прерываний назначить высокий или низкий приоритет. При возникновении прерывания с высоким приоритетом происходит переход по вектору 000008h, а при возникновении прерывания с низким приоритетом – по вектору 000018h. Каждому источнику прерываний соответствует три управляющих бита: флаг прерываний, указывает на то, что выполнено условие возникновения прерывания; бит разрешения прерывания, разрешает переход по вектору прерывания при установке соответствующего флага; бит приоритета, выбор низкого или высокого приоритета прерывания. Обработка прерывания заключается в следующем: Приостанавливается выполнение текущей программы, сохраняется текущий контекст и передается управление подпрограмме обрабо-и прерывания ISR. После выполнения ISR восстанавливается информация о предыдущем контексте и возобновляется нормальная работа программы. Рассмотрим основные особенности программирования прерываний при использовании компилятора С18. Как и любая функция языка Си, подпрограмма обработки прерывания ISR может иметь локальные и глобальные переменные. Однако ISR не может иметь входных параметров и не может возвращать какого-либо значения, то есть объявляется как: void isr(void) { …….. } ISR может быть вызвана только реакцией на работу аппаратуры, но не из другой Си-функции. В языке С18 не производится автоматическое размещение начала ISR по адресу вектора прерывания. Это объясняется тем, что источников прерывания, а следовательно, и ISR может быть несколько. Векторов прерыва-я, то есть адресов только два: 000008h для высокого приоритета и 000018h для низкого приоритета. Обычно по адресу вектора прерывания размещается ассемблерная команда GOTO для перехода на нужную ISR. Используется in-line ассемблер, при этом блок команд ассемблерного кода должен начинаться с директивы _asm и кончаться директивой _endasm: _asm ………… ………… // команды Ассемблера ………… _endasm Для размещения вектора прерывания в программном коде испол-ся директива #pragma code section_name = address. Здесь section_name – идентификатор языка Си, address – целая константа (integer). Для возврата в исходную секцию кода используется директива #pragma code. В языке С18 для задания приоритета функции обработки прерывания имеются две директивы: #pragma interrupt fname #pragma interruptlow fname Директива #pragma interrupt объявляет функцию обработки прерывания как имеющую высокий приоритет, а директива #pragma interruptlow – как имеющую низкий приоритет. Пример программирования прерываний в языке С18. #include <p18fxxx.h> void high_isr(void); // прототип ISR с высоким приориор-м void low_isr(void); // прототип ISR с низким приоритетом #pragma interrupt high_isr // функция high_isr объявляется с // высоким приоритетом #pragma interruptlow low_isr // функция low_isr объявляется с // низким приоритетом #pragma code high_vector = 0x08 //дальнейший программный код //будет начинаться с адреса 000008h void high_interrupt(void) { _asm goto high_isr // переход на функцию с именем high_isr _endasm } #pragma code low_vector = 0x18 // дальнейший программный код // начинаться с адреса 000018h void low_iterrupt(void) { _asm goto low_isr // переход на функцию с именем low_isr _endasm } #pragma code // возврат в исходную программную секцию кода ……………………………….. void main(void) // главная функция программы { …………………….. } void high_isr(void) // функция обработки прерывания с { // высоким приоритетом ……… } void low_isr(void) // функция обработки прерывания с { // низким приоритетом ……. } Управление приоритетной системой прерываний в МК семейства PIC18 выполняется с помощью бита с именем IPEN, который находится в регистре специальных функций RCON. Если IPEN = 0, то приоритетная система прерываний выключена, и все прерыв-я имеют одинаковые приоритеты. По умолчанию предполагается, все прерывания будут иметь высокий приоритет, т.е. при возникнове-и любого прерывания происходит переход по вектору 000008h. Для общего (глобального) разрешения прерываний надо установить бит GIE = 1, который находится в регистре INTCON.Если IPEN = 1, то приоритетная система прерываний включена. Для общего (глоб-го) разрешения прерываний с высоким приоритетом надо установить бит GIEH = 1. Для общего разрешения прерываний с низким приоритетом надо установить бит GIEL = 1. Эти биты находятся в регистре INTCON.
|