Разработка микропроцессорной системы управления объектом, страница 7

Приложение 2: Листинг программы

Адрес

Метка

Команда

Комментарий

0000h

Di

; Запрет прерываний

0001h

Lxi  SP,03FFh

; Инициализация стека

; Инициализация ППА:

; канал A – режим 0, ввод;

; канал B – режим 0, вывод

0004h

Mvi  A,91h

; канал CH – режим 0,вывод

0006h

Out  F3h

; канал CL – режим 0, ввод

0008h

Mvi  A,12h

; Инициализация таймера 1

000Ah

Out  E3h

; Канал 0 в режим 1

000Ch

Out  E7h

; Таймер 2, канал 0 тот же

000Eh

Mvi  A,52h

; режим

0010h

Out  E3h

; Канал 1 в режим 1

0012h

Mvi  A,92h

; Канал 2 в режим 1

0014h

Out  E3h

0016h

Mvi  A,87h

; Инициализация таймера 2

0018h

Out  E7h

; Канал 1 в режим 3

001Ah

Mvi  A,97h

; Канал 2 в режим 3 для

001Ch

Out  E7h

; синхронизации ПСА

; Инициализация ПСА

001Eh

Xra  A

; Программный сброс

001Fh

Out  F9h

0021h

Out  F9h

0023h

Out  F9h

; Стоп-бит длиной 1.5 бита,

; контроль паритета – на чет-

0025h

Mvi  A,BEh

; ность, длина символа 8 бит,

0027h

Out  F9h

; ассинхронный режим 1:16

; Инициализация ПКП

0029h

Mvi  A,D6h

; Начальный адрес таблицы

002Bh

Out  FCh

; векторов – 01C0h, 4хбайтныйррhррр

002Dh

Mvi  A,01h

; формат команды, ПКП в сис-

002Fh

Out  FDh

; теме один, разрешить только

0031h

Mvi  A,0Fh

; 4 первых прерывания

0033h

Out  FDh

0035h

Ei

; Обработка цифровой инфор-

; мации

0036h

BEGIN:

In  F2h

; Опрос датчиков x1 - x4

0038h

Ani  0Fh 

003Ah

Sta  ADR_X

; Сохранение значений x1-x4

003Dh

Cpi  01h

; Сравнение с комбинацией,

003Fh

Jz  M1

; при которой Y1=0

0042h

Xra  A

; Если не равно, то Y1=0

0043h

Jmp  EXIT

0046h

M1:

Mvi  A,B4h

; Иначе выдать сигнал Y1 дли-

0048h

Out  E0h

; тельностью 90 мкс (180 так-

004Ah

Mvi  A,01h

; тов).

004Ch

EXIT:

Sta  ADR_Y1

; Сохранение Y1

; Обработка аналоговой ин-

; формации

004Fh

Mvi  A,02h

; Выбор V1 и старт АЦП

0051h

Out  F2h

0053h

Xra  A

; Снятие сигнала старта

0054h

Out  F2h

0056h

In  F0h

; Чтение N1

0058h

Sta  ADR_N1

; Сохранение N1

005Bh

Mov  B,A

005Dh

Mvi  A,06h

; Выбор V2 и старт АЦП

005Fh

Out  F2h

0061h

Xra  A

; Снятие сигнала старта

0062h

Out  F2h

0064h

In  F0h

; Чтение N2

0066h

Cmp  B

; Сравнение N1 и N2

0067h

Jnc  M2

006Ah

Mov  A,B

; Если N1>N2, то (A)¬(N1)

006Ch

M2:

Sta  ADR_N

; Сохранение N

006Fh

Mov  B,A

0071h

Lda  ADR_Q

; Загрузка константы Q

0074h

Cmp  B

; и сравнение ее с N

0075h

Jnc  M3

0078h

Mov  A,B

; Если N>Q, то

007Ah

Sta  ADR_NQ

; сохранить результат и

007Dh

Mvi  A,A0h

; выдать сигнал Y3 длитель-

007Fh

Out  E2h

; ностью 80 мкс (160 тактов)

0081h

Jmp  M4

0084h

M3:

Sta  ADR_NQ

; Если Q>N, то сохранить ре-

0087h

Mvi  A,50h

; зультат и выдать сигнал Y2

0089h

Out  E1h

; длительностью 40 мкс.

008Bh

M4:

Mvi  A,0Ah

; Выбор V3 и старт АЦП

008Dh

Out  F2h

008Fh

Xra  A

; Снятие сигнала старта

0090h

Out  F2h

0092h

In  F0h

; Чтение N3

0094h

Mov  B,A

0096h

Lda  ADR_A1

; Чтение А1

0099h

Mov  C,A

009Bh

Call  MULT

; Умножение А1 на N3

009Eh

Lda  ADR_A0

; Чтение А0

00A1h

Add  H

; Сложение А0+А1*N3

00A2h

Sta  ADR_Y4

; Сохранение Y4

00A5h

Out  F1h

; Выдача в ЦАП

00A7h

Mvi  A,99h

; Перенастройка ППА:

00A9h

Out  F3h

; CH на ввод

00ABh

In  F2h

; Чтение сигнала с кнопки

00ADh

Ani  80h

;  “Останов”

00AFh

Cpi  80h

; Если кнопка нажата, то

00B1h

Jz  STOP

;         останов

00B4h

Mvi  A,91h

; Иначе – перенастройка ППА

00B6h

Out  F3h

00B8h

Jmp  BEGIN

; и переход в начало

00BBh

STOP:

Hlt

00C0h

ADR_A0:

; Константа А0

00C1h

ADR_A1:

; Константа А1

00C2h

ADR_Q:

; Константа Q

00C3h

MULT:

; Подпрограмма умножения

00E1h

;Обработка прерываний

;Прерывание от источника питания INT0

0100h

Lda  ADR_ON

; Проверка активности канала

0103h

Rar

;  связи

0104h

Jnc  M5

; При его активности выдать

0107h

Mvi  A,”!”

; код “!”

0109h

Out  F8h

010Bh

M5:

Mvi  A,02h

; Сохранение константы для

010Dh

Sta  ADR_WT

; пустого цикла

0110h

Mvi  A,36h

; Запуск таймера – импульс с

0112h

Out  E6h

; длительностью 30 мкс

0114h

Lda  ADR_WT

0117h

M6:

Dcr  A

; Пустой цикл общей длитель-

0118h

Jnz  M6

;  ностью 43 такта

011Bh

Mvi  A,36h

; Вместе с Mvi и Out – 60 тактов

011Dh

Out  E6h

; Запуск таймера – импульс с

011Fh

Hlt

; длительностью 30 мкс

;Прерывание от аварийного датчика INT1

0120h

Di

0121h

Mvi  A,A0h

; Запуск таймера для генерации

0123h

Out  E5h

; меандра с частотой 500 Гц

0125h

Mvi  A,0Fh

0127h

Out  E5h

0129h

Ei

012Ah

Lda  ADR_X

; Выдача значений x1-x4 в

012Dh

Out  E8h

; регистр индикации RG1

012Fh

Lda  ADR_N1

; Выдача значения N1 в регистр

0132h

Out  Ech

; индикации RG2

0134h

Hlt

;Прерывание от внешней ЭВМ INT2

0135h

Di

0136h

Push  PSW

; Сохранение всех регистров,

0137h

Push  H

; которые использует основ-

0138h

Push  B

; ная программа

0139h

Mvi  A,01

; Установка флага активности

013Bh

Sta  ADR_ON

; канала связи

013Eh

Ei

013Fh

L1:

In  F9h

; Чтение слова состояния SW

0141h

Ani  30h

; Проверка наличия ошибок

0143h

Jz  M7

0146h

Mvi  A,”R”

; Уведомление внешней ЭВМ

0148h

Out  F8h

; об ошибке

014Ah

Mvi  A,15h

; Разрешение приема и передачи

014Ch

Out  F9h

; и сброс флагов

014Eh

Jmp  L1

0151h

M7:

Mvi  A,02h

; Запрос готовности приемника

0153h

Out  F9h

0155h

In  F9h

0157h

Ral

0158h

Jnc  M7

;  Цикл ожидания готовности

015Bh

In  F8h

; Чтение данных с ЭВМ

015Dh

Cpi  “D”

015Fh

Jnz  M8

0162h

Lda  ADR_Y1

; Если принт символ “D”-выдать

0165h

Out  F8h

; значение Y1

0167h

Jmp  M9

016Ah

M8:

Cpi  “A”

016Ch

Jnz  M9

016Fh

Lda  ADR_Y4

; Если принят символ “A”-выдать

0172h

Out  F8h

; значение Y4

0174h

M9:

Mvi  A,15h

; Сброс флагов, разрешение

0176h

Out  F9h

; приема и передачи

0178h

Mvi  A,20h

; Снятие флага отработавшего

017Ah

Out  FCh

; прерывания

017Ch

Xra  A

;  Сброс флага активности

017Dh

Sta  ADR_ON

; канала связи

0180h

Pop  B

; Восстановление содержимого

0181h

Pop  H

; регистров прерванной

0182h

Pop PSW

; программы

0183h

Ret

; Возврат в программу

;Прерывание от оператора INT3

0184h

Lda  ADR_Y4

; Выдача значения Y4 в регистр

0187h

Out  E8h

; РИ1

0189h

Lda  ADR_NQ

; Выдача результата сравнения

018Ch

Out  E8h

; (N,Q) в регистр РИ1

018Eh

Lda  ADR_X

; Загрузка значений датчиков X

0191h

Cpi  0Fh

;Их произведение равно единице

; если все x равны единице

0193h

Jnz  M10

; иначе их произведение

0196h

Mvi  A,01h

; равно нулю

0198h

Jmp  M11

019Bh

M10:

Xra  A

; Выдача произведения

019Ch

M11:

Out  E8h

; в регистр РИ1

019Eh

Lda  ADR_X

; Загрузка значений датчиков X

01A1h

CPI  00h

; Их сумма равна нулю если все

01A3h

Jnz  M12

; x равны нулю, иначе их сумма

01A6h

Xra  A

; равна единице

01A7h

Jmp  M13

01AAh

M12:

Mvi  A,01h

01ACh

M13:

Out  E8h

; Выдача суммы в РИ1

01AEh

Lda  ADR_Q

; Загрузка константы  Q и ее

01B1h

Out  Ech

; выдача в регистр РИ2

01B3h

Mvi  A,20h

; Снятие флага отработавшего

01B5h

Out  FCh

; прерывания

01B7h

Jmp  BEGIN

; Возврат к началу обработки

01BAh

;Таблица векторов прерываний

01C0h

INT0:

Jmp  0100h

01C4h

INT1:

Jmp  0120h

01C8h

INT2:

Call  0135h

01CCh

INT3:

Jmp  0175h

;Переменные, хранящиеся в ОЗУ

0300h

Db  ADR_X

; Значение датчиков x1 – x4

0301h

Db  ADR_Y1

; Значение сигнала Y1

0302h

Db  ADR_N1

; Значение N1

0303h

Db  ADR_N

; Значение N

0304h

Db  ADR_NQ

; Результат сравнения N и  Q

0305h

Db  ADR_Y4

; Значение Y4

0306h

Db  ADR_ON

; Флаг активности канала связи

0307h

Db  ADR_WT

; Константа для организации

; цикла 30 мкс