Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prn_ 51_pr1.doc
Скачиваний:
17
Добавлен:
19.02.2016
Размер:
370.18 Кб
Скачать

Лабораторная работа №6 изучение системы прерываний Практическая часть.

1. Сохранение состояния центрального процессора во время прерываний

При распознавании запроса прерывания управление программой переходит к соответствующей сервисной подпрограмме путем выполнения центральным процессором команды длинного вызова (LCALL). Адрес программы охраняется в стеке. После завершения сервисной подпрограммы инструкция RETI возвращает процессор в основную программу в точку прерывания. Программа обработки прерывания не должна изменять значения переменных, используемых в основной программе, для возможности продолжения правильной работы последней. Инструкции PUSH и POP обеспечивают сохранение регистров в стеке.

LOC EQU $ ; Запоминание счетчика адреса

ORG 0C003H ; Начальный адрес подпрограммы прерывания

LJMP SERV

;Выполнение подпрограммы

ORG LOC ; Восстановление счетчика адреса SERV:

PUSH PSW ; Запоминание регистра PSW

PUSH AСС

PUSH В

PUSH DPI

PUSH DPH

MOV PSW,#1000B ; Выбор регистрового банка 1

;..................;Тело подпрограммы

POP DPH ; Восстановление регистров

POP DPL ; в обратном порядке

POP В

POP AСС

POP PSW

RETI ; Возврат к основной программе

2. Все биты, которые вызывают прерывания (IE0, IE1, TF0, TF1, RI, TI), могут быть программно установлены или сброшены с тем же результатом, что и в случае их аппаратной установки или сброса. Т. е. прерывания могут программно вызываться или ожидающие обслуживания прерывания могут программно ликвидироваться. Кроме того, прерывания по ~INT0, ~INT1 могут вызываться программной установкой Р3.2=0 и РЗ.З=0, как показано в приведенном ниже примере:

EA EQU IE.7

MAIN: MOV IE, #00000101b

MOV IP, #04H

SETB EA

MOV P3,#11110011B

В предложенном примере запросы прерывания ~INT0 и ~INT1, имеющие различный приоритет, поступают одновременно. При этом обслуживается прерывание с высшим приоритетом.

Пример простейшей организации обслуживания прерываний представлен в приведенной ниже демо-программе.

В этой программе с помощью директивы Ассемблера А51 ORG задаются векторы процедур обслуживания прерывания INT0, которое возникает по срезу сигнала на входе РЗ.2, и прерывания по переполнению таймера Т0. В основной программе производится разрешение и настройка этих прерываний. При пошаговом запуске программы в отладчике DS51 можно контролировать состояния системы прерываний и таймера, вызывая соответствующие команды мз меню Peripheral. Чтобы вызвать прерывание необходимо установить соответствующие флаги в регистре TCON: TF0 - TCON.5 или IE0 - TCON.1. Сделать это можно с помощью команды >ТСОN.1 = 1 в окне выполнения Ехе (смотри Приложение).

NAME InterruptTest

PUBLIC START

PROG SEGMENT CODE

RSEG PROG

jmp START ; переход к основной программе

ORG 03H

jmp sInt0 ; вектор прерывания INT0

ORG OBH

jmp sIntT0 ; вектор прерывания по

; переполнению таймера T0

ORG 30H ; основная программа

START: mov IE,#10000011b ; разблокирование всех

; прерываний (бит IE.7),

; разрешение прерываний T0

; (бит IE.1) и INT0 (бит IE.0)

setb TCON.0 ; установка типа прерывания INT0

; по срезу сигнала на входе P3.2

setb TCON.4 ; пуск таймера T0

LOOP: inc A ; инкремент аккумулятора

jnz LOOP ; переход, если не нуль

ORG 60H ; процедуры обслуживания

; прерываний

sInt0: push PSW ; сохранение в стеке регистров

push ACC

push B

push DPL

push DPH

inc R5

; ….

pop DPH ; восстановление регистров

pop DPL

pop B

pop ACC

pop PSW

reti ; возврат из обработки INT0

IntT0: push PSW ; сохранение в стеке регистров

push ACC

push B

push DPL

push DPH

mov 20H,R5

; ….

pop DPH

pop DPL

pop B

pop ACC

pop PSW ; восстановление регистров

reti ; возврат из обработки T0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]