- •Лабораторная работа № 15 Программирование системы прерываний микроконтроллера
- •Цель работы
- •2.Основные теоретические сведения
- •3. Порядок выполнения работы
- •3.1. Исследование внешних прерываний
- •3.2. Исследование прерываний от таймеров/счетчиков
- •3.3. Исследование приоритетов запросов прерывания
- •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). Поэтому подпрограмма обработки прерывания будет выполняться вновь. Выйти из этого положения можно двумя способами
нужно снять запрос прерывания /INT0 до выхода из подпрограммы обработки прерывания, т.е. установить P3.2 = 1
можно выбрать тип запроса прерывания /INT0 не по уровню логического 0, а по перепаду 10, т.е. по срезу сигнала на входе P3.2. Для этого надо установить бит IT0 = 1 в регистре TMOD.
Исследуйте первый способ. С этой целью выполняйте программу в пошаговом режиме до тех пор, пока не начнет выполняться подпрограмма обработки прерывания. Затем установите на входе порта P3.2 = 1 и продолжите выполнение программы. После нескольких шагов убедитесь, что подпрограмма прерывания больше не выполняется, а флаг IE оказался сброшен.
Для применения второго способа нужно в основной программе установить бит IT0. Для этого перейдите в командную область симулятора и выполните команды
Patch Patch code
Занесите в счетчик команд (PC) = 0039H (первая команда NOP). Запишите в память симулятора команду SETB IT0, которая установит бит IT0, что обеспечит реакцию МК только на перепад 10 сигнала на входе P3.2.
Установите на входах порта (P3) = FFH, счетчик команд (PC) = 0000H, и выполните программу в пошаговом режиме. Затем установите P3.2 = 0 (подайте запрос прерывания) и продолжите выполнение программы в пошаговом режиме. Наблюдайте, что при входе в подпрограмму обработки прерывания сбрасывается флаг IE, а сама подпрограмма будет выполняться только один раз.
Задание. Исследуйте запрос прерывания /INT1 (по входу P3.3) самостоятельно по методике, изложенной для прерывания /INT0.