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

3. Порядок выполнения работы

3.1. Исследование внешних прерываний

Создайте в Вашей папке файл с именем int_ex.asm и занесите в него программу

ORG 0000H

JMP MAIN ; Переход на метку MAIN

ORG 0003H ; Вектор внешнего прерывания /INT0

CLR P2.0 ; Сбросить P2.0  0

RETI ; Возврат из прерывания

ORG 0013H ; Вектор внешнего прерывания /INT1

CLR P2.1 ; Сбросить P2.1  0

RETI ; Возврат из прерывания

MAIN: MOV SP,#38H ; Определить стек

SETB EX0 ; Разрешить прерывания от /INT0

SETB EX1 ; Разрешить прерывания от /INT1

SETB EA ; Общее разрешение прерываний

NOP

NOP

NOP

NOP

STOP: MOV P2,#0FFH ; Вывод (P2)  FFH

JMP STOP ; Зацикливание программы

END

Здесь 4 команды NOP нужны для резервирования ячеек памяти программ для записи новых команд с помощью симулятора AVSIM51.

Получите файлы int_ex.obj и int_.ex.hex. Запустите симулятор AVSIM51 и загрузите в него файл int_ex.hex. Отключите отображение меток с помощью клавиш Alt-F5. Выполните программу в пошаговом режиме, наблюдая за изменением битов в регистре разрешения прерываний (регистр с именем En в правой части дисплея).

Затем подайте запрос прерывания /INT0. С этой целью с помощью клавиш Alt-P перейдите в область портов и установите P3.2 = 0. Продолжайте выполнять программу в пошаговом режиме. Сначала установится флаг IE = 1 и начнет выполняться подпрограмма обработки прерывания от /INT0 с адреса 0003H. После сброса бита P2.0 и возврата в основную программу флаг IE остается равным 1, поэтому после нескольких шагов произойдет вновь переход на подпрограмму обработки прерывания. Это можно увидеть и при прогоне программы в автоматическом режиме. Для этого установите с помощью клавиши F5 низкую скорость (LOW) и с помощью клавиши F1 включите автоматический режим. Остановить работу программы можно повторным нажатием на клавишу F1.

Зацикливание выполнения подпрограммы обработки прерывания объясняется тем, что после возврата из прерывания на входе /INT0 остался низкий уровень (P3.2 = 0), а это воспринимается микроконтроллером как запрос прерывания (флаг IE остался равным 1). Поэтому подпрограмма обработки прерывания будет выполняться вновь. Выйти из этого положения можно двумя способами

  1. нужно снять запрос прерывания /INT0 до выхода из подпрограммы обработки прерывания, т.е. установить P3.2 = 1

  2. можно выбрать тип запроса прерывания /INT0 не по уровню логического 0, а по перепаду 10, т.е. по срезу сигнала на входе P3.2. Для этого надо установить бит IT0 = 1 в регистре TMOD.

Исследуйте первый способ. С этой целью выполняйте программу в пошаговом режиме до тех пор, пока не начнет выполняться подпрограмма обработки прерывания. Затем установите на входе порта P3.2 = 1 и продолжите выполнение программы. После нескольких шагов убедитесь, что подпрограмма прерывания больше не выполняется, а флаг IE оказался сброшен.

Для применения второго способа нужно в основной программе установить бит IT0. Для этого перейдите в командную область симулятора и выполните команды

Patch  Patch code

Занесите в счетчик команд (PC) = 0039H (первая команда NOP). Запишите в память симулятора команду SETB IT0, которая установит бит IT0, что обеспечит реакцию МК только на перепад 10 сигнала на входе P3.2.

Установите на входах порта (P3) = FFH, счетчик команд (PC) = 0000H, и выполните программу в пошаговом режиме. Затем установите P3.2 = 0 (подайте запрос прерывания) и продолжите выполнение программы в пошаговом режиме. Наблюдайте, что при входе в подпрограмму обработки прерывания сбрасывается флаг IE, а сама подпрограмма будет выполняться только один раз.

Задание. Исследуйте запрос прерывания /INT1 (по входу P3.3) самостоятельно по методике, изложенной для прерывания /INT0.

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