Читайте также:
|
|
Микроконтроллеры 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 – целая константа.
Для возврата в исходную секцию кода используется директива
#pragma code
В языке С18 для задания приоритета функции обработки прерывания имеются две директивы:
#pragma interrupt fname
#pragma interruptlow fname
Директива #pragma interrupt объявляет функцию обработки прерывания как имеющую высокий приоритет, а директива #pragma interruptlow – как имеющую низкий приоритет.
Пример программирования прерываний в языке С18.
#include <p18fxxx.h>
void low_isr(void); // прототип ISR с низким приоритетом
#pragma interruptlow low_isr // функция low_isr объявляется с низким приоритетом
#pragma code low_vector = 0x18 // дальнейший программный код будет начинаться с адреса 000018h
void low_iterrupt(void)
{
_asm
goto low_isr // переход на функцию с именем low_isr
_endasm
}
#pragma code // возврат в исходную программную секцию кода
………………………………..
void main(void) // главная функция программы
{
……………………..
}
void low_isr(void) // функция обработки прерывания с низким приоритетом
{
…….
}
Управление приоритетной системой прерываний в микроконтроллерах семейства PIC18 выполняется с помощью бита с именем IPEN, который находится в регистре специальных функций RCON.
Если IPEN = 0, то приоритетная система прерываний выключена, и все прерывания имеют одинаковые приоритеты. По умолчанию предполагается, все прерывания будут иметь высокий приоритет, т.е. при возникновении любого прерывания происходит переход по вектору 000008h. Для общего (глобального) разрешения прерываний надо установить бит GIE = 1, который находится в регистре INTCON.
Если IPEN = 1, то приоритетная система прерываний включена. Для общего (глобального) разрешения прерываний с высоким приоритетом надо установить бит GIEH = 1. Для общего разрешения прерываний с низким приоритетом надо установить бит GIEL = 1. Эти биты находятся в регистре INTCON.
Дата добавления: 2015-12-07; просмотров: 91 | Нарушение авторских прав