Прерывания. Практика использования прерывания при проектировании робота. Запись данных во внутреннюю память микроконтроллера
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Прерывание (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, просмотров: 245.