Прерывание (interrupt) – событие, требующие немедленной реакции со стороны процессора. Реакция состоит в том, что процессор прерывает обработку текущей программы (прерываемой программы) и переходит к выполнению некоторой другой программы (прерывающей программы), специально предназначенной для данного события. По завершении этой программы процессор возвращается к выполнению прерванной программы.
Каждое событие, требующее прерывания, сопровождается сигналом прерывания, оповещающим об этом вычислительную машину, и называемым запросом прерывания.
Состояние программы представляет собой совокупность состояний всех запоминающих элементов в соответствующий момент времени (например, после выполнения последней команды). При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд и загружает в него адрес соответствующего вектора прерывания. Последней командой подпрограммы обработки прерывания должна быть команда, которая осуществляет возврат в основную программу и восстановление предварительно сохраненного счетчика команд. Во время выполнения обработчика прерывания некоторая информация может подвергнуться изменению. Поэтому при переходе к обработчику прерывания необходимо сохранить элементы, подвергающиеся изменению. Набор таких элементов представляет собой вектор состояния программы. При этом другая информация о состоянии ячеек памяти не существенна или может быть восстановлена программным путем.
Обработка прерывания на языке PicBasic
On _ Interrupt
Синтаксис:
On_Interrupt {Goto} Label
или
On _ Hardware _ Interrupt {Goto} Label
Команда On_Interrupt производит аппаратную обработку прерываний и осуществляет переход к
подпрограмме обозначенной меткой Label, когда происходит аппаратное прерывание.
Необходимо отметить, что команда GoTo в этой инструкции является необязательной.
Пример
Листинг программы on_interrupt1.bas
' Светодиод подключенный к PORTB.0 будет мигать c большей частотой, чем светодиод, подключенный к PORTB.1
Device 16F876A ' Произвести программный код для микроконтроллера 16F876A
Xtal 4 ' Установить частоту кварцевого генератора равной 4 МГц
On_Interrupt Goto Flash ' Включить обработку аппаратных прерываний и при их возникновении перейти к метке ‘ Flash:
'-------------------------------- Назначение псевдонимов для обработки прерываний--------------------------------
Symbol LED PORTB.1 ' LED - символ cветодиода подключенного к PORTB.1
Symbol TOIE INTCON.5 ' TOIE - cимвол бита разрешение прерывания по переполнению таймера TMRO
Symbol TOIF INTCON.2 ' TOIF - cимвол флага прерывания по переполнению таймера TMRO
Symbol GIE INTCON.7 ' GIE - cимвол бита глобального разрешения прерываний
Symbol PSO OPTION_REG.0 ' PSO - символ bit-0 коэффициента предделителя
Symbol PS1 OPTION_REG.1 ' PS1 - символ bit-1 коэффициента предделителя
Symbol PS2 OPTION_REG.2 ' PS2 - символ bit-2 коэффициента предделителя
Symbol PSA OPTION_REG.3 ' PSA - Символ бита подключения предварительного делителя
' (PSA = 1 - предделитель включен на входе сторожевого таймера WDT)
' (PSA = 0 - предделитель включен на входе таймера TMR0)
Symbol TOCS OPTION_REG.5 ' TOCS - cимвол бита выбора источника тактового сигнала для TMR0
' (TOCS = 0 - содержимое таймера инкрементируется от импульсов
' кварцевого (внутреннего) тактового генератора с частотой Fкв.ген/4)
' (TOCS = 1 - содержимое таймера инкрементируется от внешних импульсов
' на входе PORTA.4 RA4/TOСKI)
GoTo Over_interrupt ' Перешагнуть через подпрограмму прерывания и перейти к метке
' Over_interrupt:
'---------------------------------------- Подпрограмма обработки прерываний ----------------------------------------
Flash: ' Метка начала подпрограммы обработки прерываний
PORTB = PORTB ^ 1 ' При возникновении прерывания от таймера выполнить операцию
' ИСКЛЮЧАЮЩЕЕ ИЛИ над содержимым регистра порта PORTB и значением 1
' поразрядно над каждым битом регистра порта PORTB, а результат
' записать в регистр порта PORTB. В результате, если до прерывания
' логическая единица была на выходе PORTB.0, то после прерывания она
' будет на выходе PORTB.1 и наоборот.
TOIF = 0 ' Cбросить флаг прерываний TOIF регистра TMRO
Context Restore ' Восстановить регистры и выйти из обработки прерываний
Over_interrupt: ' Метка Over_interrupt
TRISB = %00000000 ' Cконфигурировать выводы PORTB как выходы
PORTB = 0 ' Очистить регистр порта PORTB
'----------------------------------------------- Инициирование прерываний ----------------------------------------------
GIE = 0 ' Запретить все прерывания
PSA = 0 ' Включить предварительный делитель на входе таймера TMR0
PSO = 1: PS1 = 1: PS2 = 1
' Установить коэффициент деления для предделителя на входе таймера
' TMR0 равным 256
TOCS = 0
' Разрешить инкрементирование таймера TMR0 от импульсов с внутренней
' тактовой частотой, равной частоте кварц. генератора, деленной на 4.
TMR0 = 0 ' Очистить таймер TMRO
TOIE = 1 ' Разрешить прерывания по переполнению таймера TMRO
GIE = 1 ' Разрешить все немаскированные прерывания
'-------------------------------------------------- Основная программа --------------------------------------------------
main: ' Метка начала основной программы
Low LED ' Погасить светодиод подлюченный к PORTB.1
DelayMS 500 ' Пауза 0,5 сек
High LED ' Включить светодиод подлюченный к PORTB.1
DelayMS 500 ' Пауза 0,5 сек
GoTo main ' Повторить основную программу
End ' Конец программы
Применение аппаратного прерывания на плате Arduino nano при проектировании системы управления подъемником «Барс»
Пример на С
26.10.2018
Дата: 2019-02-02, просмотров: 240.