Остановить работу программы можно повторным нажатием на клавишу 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.
3.2. Исследование прерываний от таймеров/счетчиков
Создайте в Вашей папке файл с именем int_t.asm и занесите в него программу:
ORG 0000H
JMP MAIN
ORG 000BH ; Вектор прерывания от T/C0
CLR P2.6 ; Сбросить P2.6 ß 0
RETI ; Возврат из прерывания
ORG 001BH ; Вектор прерывания от T/C1
CLR P2.7 ; Сбросить P2.7 ß 0
RETI ; Возврат из прерывания
ORG 0030H
MAIN: MOV SP, # 38H ;Определить стек
SETB ET0 ; Разрешить прерывания от T/C0
SETB ET1 ; Разрешить прерывания от T/C1
SETB EA ; Общее разрешение прерываний
STOP: MOV P2, # 0FFH ; Вывод (P2) ß FFH
JMP STOP
END
Получите файлы int_t.obj и int_t.hex. Запустите симулятор AVSIM51 и загрузите в него файл int_t.hex. Выполните программу в пошаговом режиме. Наблюдайте за установкой битов T1 и T0 в регистре разрешения прерываний En на экране симулятора. С помощью комбинации клавиш Ctrl-T переместите курсор в область таймеров (Timers на экране симулятора). Установите флаг переполнения TF0 = 1 таймера T/C0. Продолжайте выполнять программу в пошаговом режиме. Убедитесь, что при входе в подпрограмму обработки прерывания от T/C0 флаг переполнения TF0 автоматически сбрасывается, а подпрограмма обработки запроса выполняется только один раз.
Задание. Исследуйте работу МК при запросе от T/C1 по методике, аналогичной для T/C0.
3.3. Исследование приоритетов запросов прерывания
Создайте в Вашей папке файл с именем int_ext.asm и занесите в него программу:
ORG 0000H
JMP MAIN
ORG 0003H ; Вектор прерывания от /INT0
CLR P2.0
RETI
ORG 000BH ; Вектор прерывания от T/C0
CLR P2.6
RETI
ORG 00013H ; Вектор прерывания от /INT1
CLR P2.1
RETI
ORG 001BH ; Вектор прерывания от T/C1
CLR P2.7
RETI
ORG 0030H ; Основная программа
MAIN: MOV SP, # 38H
SETB EX0 ; Разрешить прерывание от /INT0
SETB IT0 ; Установить прерывание по перепаду 1à0 сигнала /INT0
SETB EX1 ; Разрешить прерывание от /INT1
SETB IT1 ; Установить прерывание по перепаду 1à0 сигнала /INT1
SETB ET0 ; Разрешить прерывания от T/C0
SETB ET1 ; Разрешить прерывания от T/C1
SETB EA ; Общее разрешение прерываний
NOP
NOP
STOP: MOV P2, # 0FFH
JMP STOP
END
Получите файлы int_ext.obj и int_ext.hex. Запустите симулятор AVSIM51 и загрузите в него файл int_ext.hex.
Выполните программу в пошаговом режиме, наблюдая за изменением битов в регистрах управления прерываниями. Затем переместите курсор с помощью комбинации клавиш Ctrl-T к регистрам таймеров/счетчиков и установите флаги переполнения TF0 = 1 и TF1 = 1. После этого с помощью комбинации клавиш Alt-P переместите курсор в область портов и установите P3.2 = 0 и P3.3 = 0. Таким образом, в МК одновременно поступают 4 запроса прерывания: запросы внешних прерываний /INT0 и /INT1, а также запросы прерываний от T/C0 и T/C1. Продолжите выполнение программы в пошаговом режиме. Наблюдайте за порядком обслуживания запросов прерывания по изменению выходов порта P2. Убедитесь, сто порядок обслуживания запросов прерывания соответствует изображенному на рис. 3.
Теперь исследуем возможность управления приоритетами прерываний
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.