Во всех предыдущих рассмотренных программах проводился непрерывный опрос входной информации, обработка полученных данных и вывод результата. Такой принцип построения программы во многих случаях не является рациональным.
Во-первых, микроконтроллер может управлять несколькими устройствами и тогда приходится опрашивать устройства по очереди. Это в целом замедляет работу и может привести к потере и искажению информации. Во-вторых можно прозевать появление сигнала на входе особенно если он там находился короткое время, а программа работала в это время с другим входом. В-третьих, если микроконтроллер наряду с другими функциями осуществляет еще и функции защиты, то запоздалая реакция на один из входных сигналов может привести к неприятным последствиям.
Перечисленные недостатки можно решить, если использовать прерывания.
Прерыванием называется принудительное немедленное прекращение выполнения текущей программы для выполнения другой более важной в данное время программы. Эта программа называется подпрограммой прерывания. После выполнения подпрограммы прерывания, продолжается выполнение текущей программы с того места, где было прервано ее выполнение.
Прерывания могут быть программными и аппаратными. В микроконтроллерах используются аппаратные прерывания, которые могут быть вызваны внешними и внутренними устройствами. При появлении сигнала от устройства, требующего прерывания, в микроконтроллере устанавливается триггер (флаг), отвечающий за данное прерывание. Сбрасывается он аппаратно после начала обработки прерывания. Перед началом выполнения каждой команды основной программы опрашиваются флаги прерываний и если какой-нибудь флаг установлен, начинается обработка этого прерывания. Если были установлены несколько флагов, начинается обработка того прерывания, приоритет которого выше. При одинаковом приоритете обрабатывается то прерывание, которое появилось первым. Триггеры остальных прерываний будут находиться в состоянии «установлен» до тех пор, пока не будет начата обработка их прерывания.
Все прерывания микроконтроллера AT90S8535 маскируемые, т. е. их можно запретить программно. Наличие флага глобального прерывания позволяет разрешать или запрещать все прерывания одновременно.
Если условия прерываний возникли, когда прерывания запрещены, поступающие прерывания устанавливают свои флаги. Эти флаги будут сохранены в таком состоянии, пока не появится разрешение глобального прерывания. После этого прерывания обрабатываются в порядке приоритетов.
В процессе обработки прерывания используется стек. Стек – это память, организованная по принципу «первым зашел, последним вышел», как в детской пирамиде. Т.е. информация, записанная первой, считывается последней. Микроконтроллер AT90S8535 не имеет аппаратного стека, и стек организуется в ОЗУ в процессе написания программы. Для стека рекомендуется использовать область старших адресов ОЗУ. Адрес вершины стека (адрес последнего помещенного туда байта) находится в специальном регистре – указателе стека SP. Этот регистр SP является шестнадцатиразрядным и находится в области регистров I/O. При записи данных в стек значение указателя стека автоматически уменьшается на 1, т. е. стек растет в сторону младших адресов (вверх). При извлечении данных из стек значение указателя стека автоматически увеличивается на 1.
Следует учесть, что в микроконтроллере AT90S8535 при извлечении данных из стека они не уничтожаются, а продолжают храниться в той же ячейки памяти ОЗУ, куда были записаны, пока на их место не будет помещена новая информация.
При появлении прерывания текущая команда выполняется до конца и начинается процедура обработки данного прерывания. Содержимое счетчика команд помещается в стек, а взамен него в счетчик команд помещается адрес ячейки вектора обслуживаемого прерывания. (В этой ячейке памяти размещается команда безусловного перехода, указывающая адрес подпрограммы прерывания). Аппаратно сбрасывается триггер обрабатываемого прерывания, и запрещаются все остальные прерывания (сбрасывается бит (флаг) разрешения глобального прерывания в регистре статуса SREG). Начинается выполнение подпрограммы прерывания. По окончанию выполнения подпрограммы прерывания из стека в счетчик команд возвращается его предыдущее содержимое, указывающее на адрес следующей команды основной программы. Все прерывания разрешаются, если для выхода из подпрограммы использовалась команда RETI.
При выходе микроконтроллеров AVR из прерывания, происходит возврат в основную программу и выполняется еще одна команда, прежде чем начнется обслуживание какого-либо отложенного прерывания.
Следует отметить, что автоматически в стеке сохраняется только счетчик команд. Если в подпрограмме обработки прерывания используются те же регистры, что и в основной (фоновой) программе, то их значение требуется сохранить в стеке. В особенности это касается регистра статуса SREG, (который используется, как в основной программе, так и в подпрограмме обработки прерывания), т.к. практически все команды, кроме команд пересылки данных и переходов, воздействуют на флаги. Поэтому значение регистра статуса SREG после возврата в основную программу может быть не таким, как перед началом обработки прерывания.
Сохранение в стеке делается программным путем в самом начале подпрограммы обработки прерывания, а в конце подпрограммы их значение должно быть из стека восстановлено.
Система прерываний микроконтроллеров AVR допускает вложенные прерывания. Для этого в программе обработке прерывания необходимо программно разрешить все прерывания.
Микроконтроллер AT90S8535 (ATmega8535) использует 17 источников прерывания. Каждое прерывание располагает вектором прерывания (фиксированным адресом начала программы обработки прерывания) в пространстве памяти программ. Такое построение системы прерывания удобно тем, что для изменения подпрограммы обработки прерывания достаточно поменять адрес безусловного перехода в данном векторе прерывания.
Полный перечень векторов прерывания представлен в таблице 7.1.
Таблица 7.1. Векторы прерывания
Номер вектора |
Адрес |
Источник прерывания |
Вид прерывания |
1 |
$000 |
RESET |
Сброс по выводу RESET, включению питания и сторожевому таймеру |
2 |
$001 |
INTO |
Запрос внешнего прерывания 0 |
3 |
$002 |
INT1 |
Запрос внешнего прерывания 1 |
4 |
$003 |
TIMER2 COMP |
Совпадение при сравнении таймера/счетчика Т2 |
5 |
$004 |
TIMER2 OVF |
Переполнение таймера/счетчика Т2 |
6 |
$005 |
TIMER1 CAPT |
Захват таймера/счетчика Т1 |
7 |
$006 |
TIMER1 COMPA |
Совпадение А при сравнении таймера/счетчика Т1 |
8 |
$007 |
TIMER1 COMPB |
Совпадение В при сравнении таймера/счетчика Т1 |
9 |
$008 |
TIMER1 OVF |
Переполнение таймера/счетчика Т1 |
10 |
$009 |
TIMER0 OVF |
Переполнение таймера/счетчика Т0 |
11 |
$00A |
SPI, STC |
Завершение пересылки SPI |
12 |
$00B |
UART, RX |
Завершение приема UART |
13 |
$00C |
UART, UDRE |
Регистр данных UART пуст |
14 |
$00D |
UART, TX |
Завершение передачи UART |
15 |
$00E |
ADC |
Завершение ADC преобразования |
16 |
$00F |
EE_RDY |
Готовность EEPROM |
17 |
$010 |
ANA_COMP |
Срабатывание аналогового компаратора |
Источники прерываний в таблице размещены в порядке приоритета. Прерывания с младшими адресами имеют больший уровень приоритета. RESET имеет наивысший уровень приоритета, следующим являются запрос внешнего прерывания INT0 и т. д.
Для управления прерываниями в микроконтроллере AT90S8535 используются специальные регистры, а также отдельные биты в регистрах управления различными устройствами микроконтроллера, в том числе бит (флаг) разрешения глобального прерывания в регистре статуса SREG. Каждому прерыванию присвоен свой бит разрешения, который должен быть установлен совместно с битом I регистра статуса SREG.
Некоторые флаги (триггеры) прерываний можно очистить, записав в соответствующий бит очищаемого флага логическую единицу.
Прерывания, которые можно разрешать и запрещать программно называются маскируемыми, а регистры, управляемые этими процедурами – регистрами масок.
У микроконтроллера AT90S8535 предусмотрено в порте D два фиксированных входа для внешних прерываний: D2 (INT0) и D3 (INT1).
В данной лабораторной работе используются только внешние прерывания, поэтому рассматриваются регистры, отвечающие только за внешние прерывания. Жирным шрифтом выделены биты, непосредственно имеющие отношение к внешним прерываниям. Регистры, отвечающие за прерывания от других устройств, будут рассмотрены в соответствующих лабораторных работах и в курсе лекций.
Регистр состояния SREG ($3F ($5F))
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
I |
T |
H |
S |
V |
N |
Z |
C |
Бит 7 – I, разрешение всех прерываний. Для разрешения всех прерываний этот бит должен быть установлен в 1. Аппаратно очищается после возникновения прерывания и устанавливается автоматически командой RETI.
Исходное состояние бита 7 после включения питания – 0.
Регистр масок внешних прерываний GIMSK ($3B ($5B))
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
INT1 |
INT0 |
0 |
0 |
0 |
0 |
0 |
0 |
Бит 7 – разрешение внешних прерываний INT1
Бит 6 – разрешение внешних прерываний INT0
При установленных битах INT1 и (или) INT0 и установленном бите I регистра статуса (SREG) разрешаются прерывания по соответствующим выводам внешних прерываний. Активизация выводов INT1 и INT0 вызывает запрос прерывания, если даже эти выводы будут запрограммированы, как выходы.
Исходное состояние битов 6,7 после включения питания – 0.
Регистр контроля (управления) – MCUCR ($35 ($55))
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
SE |
SM1 |
SM0 |
ISC11 |
ISC10 |
ISC01 |
ISC00 |
Биты 3, 2 – ISC11, ISC10 биты, определяющие параметр входного сигнала, вызывающий прерывание INT1
Биты 1, 0 – ISC01, ISC00 биты, определяющие параметр входного сигнала, вызывающий прерывание INT0
Запрос прерывания может осуществляться по перепаду входного сигнала с низкого уровня на высокий (с 0 на 1), или по перепаду входного сигнала с высокого уровня на низкий (с 1 на 0), или по низкому уровню входного сигнала.
Параметр входного сигнала, вызывающий прерывание INT0 задается комбинацией битов, указанной в таблице 7.2.
Таблица 7.2
ISC01 |
ISC00 |
Параметр входного сигнала, вызывающий прерывание INT0 |
0 |
0 |
Низкий уровень (нулевой) на INT0 |
0 |
1 |
Зарезервирован |
1 |
0 |
Перепад с высокого уровня на низкий (с 1 на 0) на INT0 |
1 |
1 |
Перепад с низкого уровня на высокий (с 0 на 1) на INT0 |
Параметр входного сигнала, вызывающий прерывание INT1 задается комбинацией битов, указанной в таблице 7.3.
Таблица 7.3
ISC11 |
ISC10 |
Параметр входного сигнала, вызывающий прерывание INT1 |
0 |
0 |
Низкий уровень (нулевой) на INT1 |
0 |
1 |
Зарезервирован |
1 |
0 |
Перепад с высокого уровня на низкий (с 1 на 0) на INT1 |
1 |
1 |
Перепад с низкого уровня на высокий (с 0 на 1) на INT1 |
При изменении битов 3…0 регистра MCUCR прерывание INT0 и INT1 должно быть запрещено путем очистки битов разрешения прерывания в регистре GIMSK. В ином случае может произойти несанкционированное прерывание.
Длительность входного импульса для вызова прерывания по перепаду должна больше, чем один период рабочей тактовой частоты микроконтроллера. При прерывании низким уровнем низкий уровень на входе должен быть удержан до завершения выполнения текущей команды.
Исходное состояние битов 3…0 после включения питания – 0.
Регистр флагов внешних прерываний – GIFR ($3А ($5А))
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
INTF1 |
INTF0 |
0 |
0 |
0 |
0 |
0 |
0 |
Биты 7, 6 - INTF1, INTF0 флаги (триггеры) внешних прерываний INTF1 и INTF0.
В случае поступления запроса на внешнее прерывание соответствующий флаг устанавливается в 1. Если бит Iрегистра SREG и соответствующий бит разрешения регистра GIMSK установлены, то выполняется переход по вектору прерывания. При возврате из процедуры прерывания флаг автоматически очищается. Кроме того, при необходимости, флаг можно очистить, записав в него логическую 1.
Прерывания по низкому уровню входного сигнала флага не имеют и условия прерывания имеют место, пока входной сигнал находится в состоянии низкого уровня.
Исходное состояние битов 7, 6 после включения питания – 0.
Для первой программы с использованием внешнего прерывания предлагается упрощенная структура (шаблон) построения программы, в которой представлены обязательный минимальный набор команд и директив. Полный шаблон приведен в приложении.
;*******************************************
; название программы,
; краткое описание, необходимые пояснения
;*******************************************
.include “8535def.inc” ; файл описания AT90S8535.
;******сегмент кодов
.cseg
;****** вектор прерываний
.org $00 ; адрес начала программы в памяти программ.
rjmp nacalo ; прерывание по сбросу и включению питания.
.org $01 ; вектор прерывания INT0.
rjmp preryv0 ; адрес подпрограммы прерывания INT0
… ; место для размещения других возможных прерываний
… ;
.org $30 ; адрес начала основной программы в памяти программ.
;*******начало основной программы
nacalo:
… ; программирование портов I/O и других устройств
… ; микроконтроллера, организация стека
programma:
… ; текст основной (фоновой) программы
…
rjmp programma ; переход на начало текста основной (фоновой программы).
;********************** подпрограмма обработки прерывания INT0
preryv0:
…
…
reti ; конец программы обработки прерывания
;********************** подпрограммы обработки других прерываний
…
…
; конец программы (никак не обозначается).
Может получиться и так, что все действия, необходимые для выполнения устройства окажутся в подпрограмме. В этом случае основная программа не должна выполнять никаких внешних действий, т.е. содержать команды, изменяющие содержание регистров I/U и регистров общего назначения, используемых в подпрограмме обработки прерывания. Самый простой и экономичный способ построения такой программы:
programma:
rjmp programma
Построение программы, использующей внешние прерывания, рассмотрено на примере программной реализации классического шифратора. За основу может быть взята любая из рассмотренных программ, кроме последней. Пусть это будет программа с использованием цикла.
Блок-схема алгоритма программы работы шифратора для этого случая показана на рисунке 7.1. Для многих случаев она является типовой.
В блоке программирование портов I/O кроме ранее рассмотренных действий добавляются команды организации стека. В блоке программирования режима прерывания задается параметр, вызывающий прерывание, и разрешается прерывание. Фоновая программа никакой функции в данном случае не выполняет.
Блок-схема алгоритма подпрограммы обработки прерывания ничем не отличается от показанного на рисунке 6.8. Собственно это и есть программа, имитирующая работу шифратора.
Рисунок 7.1 Блок-схема алгоритма программы работы шифратора при использовании прерываний
В программе используется внешнее прерывание INT0. Параметр сигнала, вызывающий прерывание – перепад с низкого уровня на высокий.
Поскольку физическое адресное пространство ОЗУ микроконтроллера AT90S8535 составляет 608 байт, а стек принято размещать в области самых старших адресов, поэтому регистр указатель стека SP шестнадцатиразрядный.
В каком месте разрешать глобальное и локальные прерывания, вопрос не однозначный и решается в каждом конкретном случае. В данной программе это можно сделать в блоке программирования регистров I/O, но после программирования параметра сигнала, вызывающего прерывание.
Текст программы на основании блок-схемы алгоритма, представленного на рисунке 7.1:
;*******************************************
; классический шифратор 4 в 2. Использование внешнего прерывания
; INT0. Вход В5, В3, А1, А0, выход С1, С0.
;*******************************************
.include “8535def.inc” ; файл описания AT90S8535.
.cseg
.org $00 ; адрес начала программы в памяти программ.
rjmp nacalo ; прерывание по сбросу и включению питания.
.org $01 ; вектор прерывания INT0.
rjmp preryv0 ; адрес подпрограммы прерывания INT0
.org $30 ; адрес начала основной программы в памяти программ.
nacalo: ;начало основной программы
;******************** программирование портов I/O
LDI R16,$00
OUT PORTC,R16 ; установка начальной выходной комбинации
OUT DDRA,R16 ; программирование порта А на вход
OUT DDRB,R16 ; программирование порта В на вход
OUT DDRD,R16 ; программирование порта D на вход
LDI R17,$FF
OUT DDRC, R17 ; программирование порта С на выход
;******************* задание стека
LDI R16,$00
OUT SPL, R16 ; запись адреса в младший байт указателя стека
LDI R17,$02 ; запись адреса в старший байт указателя стека
OUT SPH, R17 ; итоговый физический адрес $0200 (512)
;******************* программирование режима прерывания
LDI R17,$03 ; задание параметра сигнала, вызывающего прерывание
OUT MCUCR, R17 ;
LDI R17,$40
OUT GIMSK, R17 ; разрешение внешнего прерывания INT0
SEI ; разрешение глобального прерывания
;******************** основная (фоновая) программа
PROGRAMMA:
RJMP PROGRAMMA ; переход наметку PROGRAMMA
;******************* подпрограмма обработки прерывания
PRERYV0:
;******************* опрос портов I/O
IN R16,PINA ; поместить входные данные из порта А в R16
IN R17,PINB ; поместить входные данные из порта В в R17
;******************* компоновка входной информации в один байт
BST R17,3 ; перемещение бита В3 в бит 2 регистра R16
BLD R16,2 ; через флаг Т регистра статуса
BST R17,5 ; перемещение бита В5 в бит 3 регистра R16
BLD R16,3 ; через флаг Т регистра статуса
;******************* задание начальной комбинации счетчика циклов
LDI R19,0 ; первая выходная комбинация
LDI R18, 4 ; установка счетчика циклов
;****************** цикл
CIKL:
SBRC R16,0 ; тестирование бита 0 регистра R16 и пропуск следующей команды, если он равен 0
OUT PORTC,R19 ;
LSR R16 ; сдвиг вправо для подготовки теста следующего бита
INC R19
DEC R18 ; уменьшение счетчика циклов на 1.
CPI R18,0 ; проверка числа выполненных циклов.
BRNE CIKL ; переход на начало цикла, если заданное число циклов не выполнено
RETI ; выход из подпрограммы с разрешением последующих прерываний
Программу для управления устройством автоматического поддержания уровня воды в резервуаре в заданных пределах можно тоже реализовать с помощью прерываний. Предлагается для фиксации изменения состояния датчика нижнего уровня использовать прерывание INT0 (порт D2), а для фиксации изменения состояния датчика верхнего уровня использовать прерывание INT1 (порт D3). Прерывание будет вызываться уровнем входного сигнала. Низкий уровень сигнала от датчика нижнего уровня соответствует его положению вне воды, а низкий уровень сигнала от датчика верхнего уровня соответствует его положению в воде. Так удобнее при использовании прерываний по уровню.
Блок-схема алгоритма такой программы ничем не отличается от показанной на рисунке 7.1 и содержание блоков такое же. Блок-схемы алгоритмов обработки прерываний показаны на рисунке 7.2.
Рисунок 7.2 Блок-схемы алгоритмов обработки прерываний.
;*******************************************
; Автомат поддержание уровня воды в резервуаре в заданном диапазоне
; входы D3, D2, выход А2.
;*******************************************
.include “8535def.inc” ; файл описания AT90S8535.
.cseg
.org $00 ; адрес начала программы в памяти программ.
rjmp nacalo ; прерывание по сбросу и включению питания.
.org $01 ; вектор прерывания INT0.
rjmp opros_L ; адрес подпрограммы прерывания INT0
.org $02 ; вектор прерывания INT1.
rjmp opros_H ; адрес подпрограммы прерывания INT1
.org $30 ; адрес начала основной программы в памяти программ.
nacalo: ;начало основной программы
;******************** программирование портов I/O
LDI R16,$00
OUT PORTA,R16 ; установка начальной выходной комбинации
OUT DDRD, R16
LDI R18,$04 ; программирование линий порта А
OUT DDRA, R18 ; на вход А1 и А0, А2 на выход
;******************* задание стека
LDI R16,$00
OUT SPL, R16 ; запись адреса в младший байт указателя стека
LDI R17,$02 ; запись адреса в старший байт указателя стека
OUT SPH, R17 ; итоговый физический адрес $0200 (512)
;******************* программирование режима прерывания
; задание параметра сигнала, вызывающего прерывание
OUT MCUCR, R16 ;
LDI R17,$C0
OUT GIMSK, R17 ; разрешение внешнего прерывания INT0
SEI ; разрешение глобального прерывания
;******************** основная (фоновая) программа
PROGRAMMA:
RJMP PROGRAMMA ; переход наметку PROGRAMMA
;******************* подпрограмма OPROS_L
OPROS_L:
SBI PORTA,2 ; включение насоса
RETI
;******************* подпрограмма OPROS_H
OPROS_H:
CBI PORTA,2 ; выключение насоса
RETI
Если программно реализуются динамические или статические последовательностные устройства (триггеры, счетчики, регистры, реле времени, одновибраторы), то в качестве синхронизирующего входа следует использовать вход внешнего прерывания. Для динамических устройств параметром входного сигнала, вызывающим прерывание является перепад, а для статических – уровень.
При программной реализации асинхронного RS-триггера, генератора и комбинационных устройств, вход внешнего прерывания является дополнительным входом. Параметром входного сигнала, вызывающим прерывание в этом случае является заданный перепад.
Похожие материалы
... по соответствующему полю). В окне Конструктора таблиц созданные связи отображаются визуально, их легко изменить, установить новые, удалить (клавиша Del). 1 Многозвенные информационные системы. Модель распределённого приложения БД называется многозвенной и её наиболее простой вариант – трёхзвенное распределённое приложение. Тремя частями такого приложения являются: ...
... - процессор не имеет возможности управлять прерываниями, т. е. разрешать или запрещать их для отдельных ВУ. В результате организация обмена данными в режиме прерывания с несколькими ВУ существенно усложняется. Целью данной работы является определение организации прерывания в ЭВМ, а задачами: а) изучение обработки прерывания, б) изучение проектирования механизма прерывания, в) определение ...
... датчика, наличием нерассматриваемых источников тепла, особенностями конфигурации компонентов относительно потока воздуха от вентиляторов и др.). Это еще раз доказывает актуальность проведения экспериментальных исследований в изучении тепловых режимов устройств ЭВМ и, следовательно, создание для этих целей специализированного устройства (модуля). 7 РАЗРАБОТКА ТЕХНОЛОГИИ СБОРКИ МОДУЛЯ АЦП 7.1 ...
... : следить за загрязненностью и загазованностью производственных помещений, поддержание температурно-влажностного режима. Заключение В данном дипломном проекте, который называется “охранная система с дистанционным управлением” разработано устройство, предназначенное для охраны материальных ценностей от пожара и проникновения злоумышленников. Устройство подключается к персональному компьютеру ...
... информации о количестве полученной потребителем или выработанной производителем тепловой энергии, температуре, давлении, объеме (массе) теплоносителя и о времени работы в открытых и закрытых водяных системах теплоснабжения при давлениях до 1,6 МПА (16 кгсм2) и температурах до +150 °С. Область применения - теплоэнергетика, системы коммерческого учета расхода горячей воды и тепловой энергии, ...
0 комментариев