Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект мпсу.doc
Скачиваний:
90
Добавлен:
22.09.2019
Размер:
6.71 Mб
Скачать

Урок №42

2.13.2 Алгоритм обработки прерываний

Рисунок 1 - Алгоритм обработки прерываний

1,2 – сигнал требования прерывания вызовет установку флага прерывания в специальном регистре флагов. Установленный флаг прерывания сообщает о том, что прерывание не обслужено. Флаг будет сброшен после выполнения подпрограммы обработки прерывания

3 - завершается выполнение текущей программы и сохраняется в стеке адрес возврата

4 – проверяется наличие глобального разрешения прерывания в регистре состояния процессора sreg

5 – проверяется наличие индивидуального разрешения прерывания в регистре масок прерываний

6 - если прерываний несколько, определяется приоритет прерывания и обслуживается прерывание с наивысшим приоритетом

7 – в счетчик команд записывается адрес вектора прерывания устройства и происходит переход на подпрограмму обслуживания прерывания. При этом флаг глобального разрешения прерывания в регистре состояния процессора sreg сбрасывается, и все прерывания запрещаются. Чтобы обеспечить процесс вложения подпрограмм в подпрограммы обслуживания прерываний необходимо включать команду глобального разрешения прерывания sei.

8 – флаг прерывания сбрасывается, из стека извлекается адрес возврата и происходит возврат к основной программе. Вернувшись к основной программе, микроконтроллер восстанавливает флаг глобального разрешения прерывания.

Контрольные вопросы:

1 О чем сообщает флаг прерывания?

2 Что вызывает установку флага прерывания?

3 Когда флаг прерывания сбрасывается?

4 Что представляет собой флаг глобального разрешения прерывания, как он устанавливается?

5 Почему флаг глобального разрешения прерывания сбрасывается при выполнении подпрограммы и восстанавливается по ее завершению?

6 Что необходимо сделать, чтобы разрешить во время прерывания выполнение подпрограммы обслуживания прерывания с более высоким приоритетом (вложение прерываний?)

7 Как установить флаг глобального разрешения прерывания?

8 Представлены два фрагмента программ.

8.1 Определите, какие прерывания использованы во фрагментах и их приоритеты.

8.2 Найдите ПОП каждого прерывания, сравните их.

8.3 Объясните, есть ли разница в действии прерываний в первом и втором фрагменте и в чем она заключается?

Фрагмент 1

.org $002

rjmp opros

.org $012

rjmp ind

;==========

opros:

in r0,portc

reti

ind:

out portc,ro

reti

Фрагмент 2

.org $002

rjmp opros

.org $012

rjmp ind

;==========

opros:

sei

in r0,portc

reti

ind:

out portc,ro

reti

Урок №43

      1. Внешние прерывания INT0, INT1

Внешние прерывания вызываются сигналами на внешних выводах МК:

INT0

PD.2

INT1

PD.3

INT2

PB.2

Уровень сигнала прерывания от внешних источников INT0, INT1 задается битами в регистре управления микроконтроллера MCUCR.

ISC01

ISC00

Вход INT0

0

0

Низкий уровень (лог.0)

0

1

1

0

Спадающий фронт

1

1

Нарастающий фронт

ISC11

ISC10

Вход INT1

0

0

Низкий уровень (лог.0)

0

1

1

0

Спадающий фронт

1

1

Нарастающий фронт

а) б)

Рисунок 2 – Уровни сигнал прерывания: а) спадающий фронт; б) нарастающий фронт

Прерывания по низкому уровню сигнала на входе действуют до тех пор, пока на входе действует низкий уровень (рисунок 3). Они не устанавливают флаг прерывания.

Рисунок 3

Разрешение прерываний от внешних источников устанавливается в регистре масок внешних прерываний GICR (GIMSK).

Контрольные вопросы:

1 Назовите входы внешних прерываний у МК ATmega8535

2 Какие уровни сигнала внешнего прерывания способны вызвать прерывание?

3 Как задать уровень сигнала прерывания INT0?

4 Чем отличается процедура обработки прерывания от сигналов разного уровня?

5 Ниже приведены 3 фрагмента программ обработки прерываний от INT0.

5.1 Какие уровни сигналов прерывания используются во фрагментах

5.2 Предположим ко входу прерывания INT0 подключена кнопка, которая при нажатии подает на вход сигнал лог.1. Проанализируйте действие каждого фрагмента и оцените содержимое регистра r0 после однократного нажатия – отпускания кнопки.

Фрагмент 1

.org $001

rjmp prer

;==========

ldi r16,0b00000010

out mcucr,r16

;==========

loop:

rjmp loop

;===========

prer:

inc r0reti

reti

Фрагмент 2

.org $001

rjmp prer

;==========

ldi r16,0b00000011

out mcucr,r16

;=======

loop:

rjmp loop

;===========

prer:

inc r0reti

reti

Фрагмент 3

.org $001

rjmp prer

;==========

ldi r16,0b00000000

out mcucr,r16

;==========

loop:

rjmp loop

;===========

prer:

inc r0reti

reti

Урок №44

      1. Примеры программ обслуживания прерывания от внешних устройств

Пример 1

Проанализируйте программу int_1.asm, демонстрирующую действие прерывания от внешнего устройства INT0.

Постановка задачи: В момент включения или сброса МК на индикаторе HG1 должен загореться символ «0». При замыкании контакта SB1(рисунок 4), подключенному ко входу INT0 (нарастающий фронт) должен загореться символ «5».

Рисунок 4

;============int_1.asm==========

.include "m8535def.inc" ;включение в программу файла описания имен

;==========таблица векторов=====

.org 0 ;вектор сброса

rjmp start

.org 0001 ;вектор int0

rjmp prer

;============основная программа====

.org $0020 ;начало основной программы

start:

;организуем стек

ldi r16,$00

out sph,r16

ldi r16,$61

out spl,r16

; настраиваем уровень сигнала прерывания по нарастающему фронту

ldi r16,0b00000011

out mcucr,r16

; разрешаем прерывание от int0 (частное разрешение)

ldi r16,0b01000000

out gicr,r16

;глобальное разрешение прерывания

Sei

ldi r16,$ff

out ddra,r16 ;настроить порт A на вывод

sbi ddrb,0 ;настроить на вывод линию PB.0

ldi r16,$с0 ;код символа «0»

out porta,r16 ;вывести код на выходы порта A

sbi portb,0 ;подключить общий анод индикатора ;к питанию

;фоновая команда, бесконечный цикл, мы ожидаем прерывания

loop:

rjmp loop

;=====подпрограмма обработки прерывания=====

prer:

ldi r16,$6d ;код символа «5»

out porta,r16 ;вывести код на выходы порта A

reti

Пример 2

Проанализируйте программу int_2.asm. Определите:

  • источники прерывания и их векторы;

  • найдите фрагмент программы, в котором делается частное разрешение прерывания;

  • найдите фрагмент программы, в котором делается глобальное разрешение прерывания;

  • определите уровень сигнала прерывания;

Укажите, как

  • запретить прерывание;

  • заглушить прерывание;

  • изменить уровень сигнала прерывания

;==========int_2.asm======

.include "m8535def.inc"

.org 0

rjmp start

.org $001

rjmp prer

;==========

start:

ldi r16,$61

out spl,r16

ldi r16,$00

out sph,r16

ldi r16,0b00000010

out mcucr,r16

ldi r16,0b01000000

out gicr,r16

sei

loop:

rjmp loop

;===========

prer:

inc r0

reti

Пример 3

Проанализируйте программу, написанную для схемы, изображенной на рисунке 4. Сделайте комментарий к командам. Объясните:

  • что происходит со светодиодом по сигналу «Сброс» и в момент включения питания МК?;

  • что является источником прерывания?;

  • как инициировать прерывание программы?;

  • что происходит со светодиодом в подпрограмме обслуживания прерывания?

  • как изменится действие программы, если команду, выделенную подчеркиванием заменить на команду ldi r16,0b00000000

.include "m8535def.inc"

.org 0

rjmp start

.org $001

rjmp prer

;==========

start:

sbi ddrc,0

sbi portc,0

ldi r16,$61

out spl,r16

ldi r16,$00

out sph,r16

ldi r16,0b00000011

out mcucr,r16

ldi r16,0b01000000

out gicr,r16

sei

loop:

rjmp loop

;===========

prer:

sbis portc,0

rjmp ind

cbi portc,0

reti

ind:

sbi portc,0

reti