Рис. П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
...
Если РОН используется для передачи данных в основную программу, то его содержимое сохранять не надо.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.