Однокристальные микроконтроллеры семейства MCS-51. Система прерываний микроконтроллера. Механизм прерываний в микроконтроллерах семейства МК51

Страницы работы

Фрагмент текста работы

Остановить работу программы можно повторным нажатием на клавишу  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.

Теперь исследуем возможность управления приоритетами прерываний

Похожие материалы

Информация о работе