Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Прерывания в 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.

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 181; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты