Изучение системы прерываний

22899
знаков
7
таблиц
2
изображения

Во всех предыдущих рассмотренных программах проводился непрерывный опрос входной информации, обработка полученных данных и вывод результата. Такой принцип построения программы во многих случаях не является рациональным.

Во-первых, микроконтроллер может управлять несколькими устройствами и тогда приходится опрашивать устройства по очереди. Это в целом замедляет работу и может привести к потере и искажению информации. Во-вторых можно прозевать появление сигнала на входе особенно если он там находился короткое время, а программа работала в это время с другим входом. В-третьих, если микроконтроллер наряду с другими функциями осуществляет еще и функции защиты, то запоздалая реакция на один из входных сигналов может привести к неприятным последствиям.

Перечисленные недостатки можно решить, если использовать прерывания.

Прерыванием называется принудительное немедленное прекращение выполнения текущей программы для выполнения другой более важной в данное время программы. Эта программа называется подпрограммой прерывания. После выполнения подпрограммы прерывания, продолжается выполнение текущей программы с того места, где было прервано ее выполнение.

Прерывания могут быть программными и аппаратными. В микроконтроллерах используются аппаратные прерывания, которые могут быть вызваны внешними и внутренними устройствами. При появлении сигнала от устройства, требующего прерывания, в микроконтроллере устанавливается триггер (флаг), отвечающий за данное прерывание. Сбрасывается он аппаратно после начала обработки прерывания. Перед началом выполнения каждой команды основной программы опрашиваются флаги прерываний и если какой-нибудь флаг установлен, начинается обработка этого прерывания. Если были установлены несколько флагов, начинается обработка того прерывания, приоритет которого выше. При одинаковом приоритете обрабатывается то прерывание, которое появилось первым. Триггеры остальных прерываний будут находиться в состоянии «установлен» до тех пор, пока не будет начата обработка их прерывания.

Все прерывания микроконтроллера 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. Собственно это и есть программа, имитирующая работу шифратора.

1.jpg

Рисунок 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.

2.jpg

Рисунок 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-триггера, генератора и комбинационных устройств, вход внешнего прерывания является дополнительным входом. Параметром входного сигнала, вызывающим прерывание в этом случае является заданный перепад.


Информация о реферате «Изучение системы прерываний»
Раздел: Информатика, программирование
Количество знаков с пробелами: 22899
Количество таблиц: 7
Количество изображений: 2

Похожие материалы

Скачать
332503
41
0

... по соответствующему полю). В окне Конструктора таблиц созданные связи отображаются визуально, их легко изменить, установить новые, удалить (клавиша Del). 1 Многозвенные информационные системы. Модель распределённого приложения БД называется многозвенной и её наиболее простой вариант – трёхзвенное распределённое приложение. Тремя частями такого приложения являются: ...

Скачать
29420
0
5

... - процессор не имеет возможности управлять прерываниями, т. е. разрешать или запрещать их для отдельных ВУ. В результате организация обмена данными в режиме прерывания с несколькими ВУ существенно усложняется. Целью данной работы является определение организации прерывания в ЭВМ, а задачами: а) изучение обработки прерывания, б) изучение проектирования механизма прерывания, в) определение ...

Скачать
156154
27
11

... датчика, наличием нерассматриваемых источников тепла, особенностями конфигурации компонентов относительно потока воздуха от вентиляторов и др.). Это еще раз доказывает актуальность проведения экспериментальных исследований в изучении тепловых режимов устройств ЭВМ и, следовательно, создание для этих целей специализированного устройства (модуля). 7 РАЗРАБОТКА ТЕХНОЛОГИИ СБОРКИ МОДУЛЯ АЦП 7.1 ...

Скачать
114489
21
10

... : следить за загрязненностью и загазованностью производственных помещений, поддержание температурно-влажностного режима. Заключение В данном дипломном проекте, который называется “охранная система с дистанционным управлением” разработано устройство, предназначенное для охраны материальных ценностей от пожара и проникновения злоумышленников. Устройство подключается к персональному компьютеру ...

Скачать
98975
2
0

... информации о количестве полученной потребителем или выработанной производителем тепловой энергии, температуре, давлении, объеме (массе) теплоносителя и о времени работы в открытых и закрытых водяных системах теплоснабжения при давлениях до 1,6 МПА (16 кгсм2) и температурах до +150 °С. Область применения - теплоэнергетика, системы коммерческого учета расхода горячей воды и тепловой энергии, ...

0 комментариев


Наверх