На рис. 4.9 показана структурная схема программы прерывания, а на рис. 4.10 – общей программы.
Рис. 4.9. Структурная схема подпрограммы прерывания
Рис. 4.10. Структурная схема основной программы
Метка
| Мнемоники
| Комментарии
|
| Name EXMPLADC
| ; название модуля программы для сборки;
|
TIME
| EQU NOT(10000-1)
| ;задание константы для 10 с опроса
|
| DSEG AT 50H
| ;сегмент данных во внутренней памяти данных
|
dirAdr:
| DS 1;
|
|
| BSEG AT 20H
| ; сегмент битовых данных во внутренней памяти данных
|
Flag:
| DBit 1
| ; бит флага окончания 10 с интервала
|
| CSEG AT0H
| ; абсолютный кодовый сегмент, начинающийся с адреса 0000Н
|
| ORG 0H
| ;псевдокоманда задания адреса памяти
|
| LJMP Start
| ;переход на начало основной программы
|
| ORG 000BH
| ;псевдокоманда задания адреса подпрограммы прерывания от таймера
|
| LJMP INTER0
| ;переход на начало подпрограммы обработки прерывания от таймера
|
INTER0:
| clr ET0
| ;запрет прерывания от таймера 0
|
| clr TR0
| ;останов таймера 0
|
| mov th0,#High(TIME)
| ;загрузка в таймер числа для 50 мс интервала таймера
|
| mov tl0,#low(TIME);
|
|
| inc r2
| ;увеличение на 1 счетчика 50 мс интервалов для получения 10 с времени опроса
|
| cjne r2,#159,int11
| ;если это число не равно 159, то снова запуск таймера на 50 мс
|
| mov r2,#0
| ;иначе, обнуление счетчика
|
| setb Flag
| ;установка флага конца 10 с интервала
|
| ljmp int12;
|
|
int11:
| setb TR0
| ;запуск таймера
|
| setb ET0
| ;разрешение прерывания от таймера
|
int12:
| reti
| ;возврат из программы прерывания
|
Start:
|
| ;начало основной программы
|
| mov SP, #60H
| ;установка указателя стека на конец внутренней памяти данных
|
| mov r2,#0
| ;подготовка счетчика числа 50 мс интервалов
|
| setb EA
| ;разрешение всех прерываний
|
| mov th0,#High(TIME)
| ;загрузка в таймер числа для 50 мс интервала таймера
|
| mov tl0,#low(TIME)
| ;
|
| mov dptr,#2000h
| ;загрузка в DPTR адреса АЦП в памяти
|
| mov r3,#0
| ;подготовка пары регистров для хранения текущего адреса ячейки ОЗУ
|
| mov r4,#0
| ;
|
| mov p1,#0
| ;установка 0 аналогового канала
|
| mov r5,#8
| ;установка счетчика каналов
|
| setb ET0
| ;разрешение прерывания от таймера 0
|
| setb TR0
| ;запуск таймера 0
|
m1:
| movx @dptr,a
| ;команда начала преобразования АЦП
|
| lcall delay
| ;задержка на 25 мкс
|
| movx a,@dptr
| ;считывание кода с АЦП
|
| mov dph,r3
| ;загрузка в DPTR адреса текущей ячейки ОЗУ
|
| mov dpl,r4
| ;
|
| movx @dptr,a
| ;запись считанного с АЦП кода во внешнюю память
|
| inc dptr
| ;увеличение адреса текущей ячейки внешнего ОЗУ на 1
|
| mov r3,dph
| ;сохранение в регистрах адреса текущей ячейки внешнего ОЗУ
|
| mov r4,dpl ;
|
|
| mov dptr,#2000h
| ;загрузка в DPTR адреса АЦП в памяти
|
| inc p1
| ;увеличение на 1 номера канала
|
| djnz r5,m1
| ;цикл опроса следующего канала
|
| mov p1,#0
| ;обнуление номера канала
|
| mov r5,#8
| ;установка 0 аналогового канала
|
| mov c,Flag
| ;проверка флага окончания опроса
|
| jz m1
| ;цикл по следующей выборке из 8 каналов
|
| lcall mathem
| ;окончание опроса, вызов программы обработки
|
| ljmp start
| ;на начало программы для повторения полного цикла
|
delay:
| mov r6,#8
| ;подпрограмма задержки на 25 мкс для готовности АЦП, в R6 рассчитанное на 25 мкс число
|
m5:
| nop
| ;пустая операция, длится 1 мкс
|
| djnz r6,m5
| ;вычитание из R6 единицы и проверка на нуль в R6, если нуль, то окончание подпрограммы
|
| ret
|
|
Mathem::
| ret
| ;"заглушка" программы обработки информации из каналов, в данном примере не рассматривается
|
END
|
| ;конец модуля
|
Два рассмотренных примера показывают с одной стороны сложность функций, которые берет на себя МПС, а с другой стороны достаточно простые алгоритмы функционирования системы. Эти примеры призваны показать процесс совместного проектирования аппаратных средств и программного обеспечения МПС. Другие многочисленные примеры применения МПС и микро-ЭВМ приводятся в специальной литературе и в журнале ГКНТ "Микропроцессорные средства и системы" [12].