Лабораторный практикум по курсу "Микропроцессорные устройства". Часть 1, страница 26

                                      

    Рис. П10.4. Алгоритм функционирования основной программы поддержки измерителя частоты

            В блоке 5 производится инициализация контроллера прерываний на поддержку пре­­­ры­ва­ний по линии IRQ0. Инициализация контроллера производится путем записи слов команд ини­циализации (СКИ) и слов команд обслуживания (СКО).  Для этого не­об­хо­димы по крайней ме­ре два СКИ - СКИ1,  СКИ2 и одно СКО - СКО1.  Ниже приводится при­мер инициализации.

;  Декларативная часть программы

    Ctrl0           EQU   1160Н

    Ctrl1           EQU   Ctrl0+1

    SKI1           EQU   00010110B      ; A7= A6= A5= 0, один контроллер,  формат 4 адреса

    SKI2           EQU   10000000B      ; A15= 1, A14...A8= 0

    SKO1          EQU   11111110B      ; Разрешено только IRQ0

ORG   8000H

; Подпрограмма обслуживания прерывания

             ...

             ret

; Основная программа

    Start:

             ...

             mvi   a, SKI1             ; Указываем на точку входа в под-

                                               ; программу обсл. прерывания 8000Н

             sta    Ctrl0

             mvi   a, SKI2

             sta    Ctrl1

             mvi   a, SKO1           ; Разрешаем IRQ0

             sta    Ctrl1

             ...

    Loop:                                  ; Бесконечный цикл в основной

             ...                               ; программе

             jmp   Loop

             END   Start

            Пример показывает,  что  только значения бита D1 СКИ1 и бита D0 СКО1 бе­зус­лов­но оп­ре­делены аппаратными средствами узла  контроллера прерываний. Все ос­тав­ши­е­ся биты могут оп­ределяться программистом произвольно.    

            В бесконечном цикле основной программы производится преобразование отсчета частоты Nx в двоично-десятичный формат (блок  6, Nx  считывается  из канала 2 таймера в подпрограмме обслуживания прерывания) и вывод значения частоты на индикатор (блок 7).

            В подпрограмме  обслуживания  прерываний (см.  рис.  П10.3) в блоке 1 про­из­во­дит­ся счи­ты­вание отсчета частоты Nx из  канала  2 таймера  и сохранение его в РОН или памяти. Это не­об­ходимо сделать потому, что преобразование и визуализация отсчета про­изводится в основной программе.  В блоке 2 производится задержка для уменьшения мелькания индикатора.  В блоке 3 про­изводится  подготовка канала 2 таймера к оче­ред­но­му измерению,  а в блоке 4 осуществляется запуск измерительного строба.  Это озна­ча­ет, что все необходимые  действия по управлению тай­ме­ром подпрограмма выполнила и из нее можно выходить,  разрешив  прерывания.  Разрешение прерывания  состоит из двух шагов. Сначала необходимо известить контроллер о том, что пре­ры­вание завершено.  Это обеспечивается записью  кода  СКО2  =  20Н (обычный конец пре­ры­ва­ния) по адресу Ctrl0 (блок 5). Если этого не сделать, то не сбросится соответствующий  разряд  регистра обслуженных прерываний в контроллере и все последующие запросы на прерывания с приоритетами равными текущему и ниже будут блокированы схемой принятия решений по приоритетам.  После разрешения прерываний  в  контроллере  небходимо разрешить пре­рывания в микропроцессоре (блок 6) и выйти из подпрограммы (блок 7). И, наконец, последние ре­ко­мен­да­ции по написанию обработчика. В самом начале обработчика прерываний необходимо сох­ра­нить в стеке содержимое РОН,  которые использует сам обработчик. В самом общем случае  этот  фрагмент  программы  может иметь следующий вид:

    push   psw

    push   b

    push   d

    push   h

    ...

            При выходе  из  обработчика  (перед командой ret) необходимо вернуть сох­ра­нен­ные зна­че­ния:

    pop    h

    pop    d

    pop    b

    pop    psw

    ...

            Если РОН используется для передачи данных в  основную  программу, то его содержимое сох­ранять не надо.