- •Лабораторная работа № 15 Программирование системы прерываний микроконтроллера
- •Цель работы
- •2.Основные теоретические сведения
- •3. Порядок выполнения работы
- •3.1. Исследование внешних прерываний
- •3.2. Исследование прерываний от таймеров/счетчиков
- •3.3. Исследование приоритетов запросов прерывания
- •4. Задания для самостоятельной работы
- •Содержание отчета
- •Контрольные вопросы
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 ; Установить прерывание по перепаду 10 сигнала /INT0
SETB EX1 ; Разрешить прерывание от /INT1
SETB IT1 ; Установить прерывание по перепаду 10 сигнала /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.
Теперь исследуем возможность управления приоритетами прерываний. Допустим, что нужно присвоить запросу прерывания от T/C1 высокий приоритет, остальные запросы будут иметь низкий приоритет. С этой целью занесем в счетчик команд (PC) = 0041. Это будет адрес первой команды NOP. Перейдем в командную область симулятора и выполним две команды
Patch Patch code
Запишем команду SETB PT1, которая устанавливает высокий приоритет для прерывания по переполнению таймера/счетчика T/C1.
Затем установите на входах P3.2 = P3.3 =1, а в счетчик команд занесите нули (PC) = 0000. Выполните программу в пошаговом режиме до момента зацикливания программы. Теперь подайте 4 запроса прерывания, установив TF0 = 1, TF1 = 1 и P3.2 = 0, P3.3 = 0. Продолжайте выполнять программу в пошаговом режиме. Наблюдайте за изменением порядка обслуживания запросов прерывания. Убедитесь, что запрос от T/C1 обслуживается первым, а остальные запросы – согласно рис. 3.