N: LD D,0
LD B, (R4) ; загрузка количества десятков.
L: LD A,B
OUT 8,A ; выбор разряда.
LD HL, (R5)
LD E, B
ADD HL, DE
LD E, (HL) ; выбор цифры.
LD HL, (R6)
ADD HL, DE
LD A, (HL) ; выбор кода сегментного индикатора.
LD (R8), A
INC (R9)
M: LD A, (R9) ; ожидание прихода сигнала на вход немаскируемого прерывания.
JR NZ, M;
DJNZ L;
JP N;
Программа обработки прерывания вывода на индикатор:
LD A, (R9)
OUT 16,A ; вывод данных о сегментах.
LD (R9),0
RETI
Программа обработки прерывания с датчика:
EXX ; обмен с альтернативными регистрами.
LD A, (R7) ; проверка состояния счетчика [AK1] [AK2] [AK3]
JR NZ N; на выходе таймера истинное значение счетчика
LD (R7),1 ; на выходе таймера ложное значение счетчика
EXX
RETI
N: LD (R7),0
IN A,0 ; ввод значения Счетчика1 с выхода таймера.
XOR FFH ; инверсия, так как счетчик таймера считает в отрицательном направлении.
LD L,A
IN A,0
XOR FFH
LD H,A
LD (R1), HL
IN A,4 ; ввод состояния переключателя.
CPS 1
JP NZ A; если не нажат, то переход к А.
LD BC, (R1) ; вычисление количества оборотов.
LD (A1), BC
LD (A2),10
CALL DEL ; вызов процедуры деления.
LD BC, (A2)
LD (A2), BC
LD (A1), 50000
CALL DEL
LD (A2),6
CALL YMH ; вызов процедуры умножения.
LD BC, (A1)
LD (R3), BC
LD (R10),0
CALL DECT ; вызов процедуры разбиения на десятки.
EXX
RETI
A: IN A, 1 ; ввод значения Счетчика2 с выхода таймера.
XOR FFH
LD L, A
IN A, 1
XOR FFH
LD H, A
LD (R2), HL ; вычисление угла опережения зажигания.
LD (A1), 36 (10)
LD (A2), HL
CALL YMH
LD HL, (A1)
LD BC, (R1)
LD (A1), BC
LD (A2), 10
CALL DEL
LD BC, (A1)
LD (A2), BC
LD (A1), HL
CALL DEL
LD BC, (A1)
LD (R3), BC
LD BC, (A3)
LD (R10), BC
CALL DECT
EXX
RETI
Подпрограмма DECT:
; процедура разбиения числа на десятки (на цифры).
LD BC, (R3) ; ввод числа, которое нужно разбить осуществляется через ячейку с адрессом R3.
LD (A1), BC
C: LD (A2), 10
CALL DEL
LD B, (A3)
INC (R4) ; количество десятков в ячейке с адресом R4.
LD A, (R4)
ADD A, (R5)
LD (A), B
LD A, (A1)
CPS 10
JP NC C;
LD B, (A1)
INC (R4)
LD A, (R4)
ADD A, R5
LD (A), B ; цифры находятся в памяти друг за другом, в порядке возрастания начиная с адреса R5.
INC A
LD (A), 128 (10) ; вывод точки
INC A
LD B, (R10)
LD (A), B
RET
Подпрограмма DEL:
; процедура деления одного числа (в ячейке памяти по адресу А1) на другое ( в ячейке памяти по адрессу А2).
PUSH BC
PUSH DE
PUSH HL
LD HL, (A2)
LD DE, (A1)
LD BC, 0
M1: LD (A4), HL
SBC HL, DE
INC BC
JR NC, M1;
DEC BC
LD (A1), BC ; результат заносится в ячейку памяти с адресом А1.
LD HL, (A4)
LD (A3), HL ; остаток от деления находится в ячейке памяти с адресом А3.
POP HL
POP DE
POP BC
RET
Подпрограмма YMH:
; процедура для умножения одного числа (в ячейке памяти по адресу А1) на другое ( в ячейке памяти по адрессу А2).
PUSH DE
PUSH HL
LD DE, (A2)
DEC DE
LD HL, (A1)
M2: ADC HL, HL
DINZ M2;
LD (A1), HL ; результат заносится в ячейку памяти с адресом А1.
POP HL
POP DE
RET
Опишем подробней каждую из процедур.
DECT: процедура разбиения числа на десятки. Программа делит число на десять, остатком от деления будет младший разряд, который заносится в ячейку R5. Эта процедура повторяется несколько раз, при этом каждый раз увеличивается число количества десятков ( ячейка R4), пока частное не будет меньше 10, после чего процедура останавливается, а последнее полученное нами частное будет старшим разрядом, которое заносится в ячейку по адресу R5+R4.
DEL и YMH: процедуры умножения и деления двух чисел. Наиболее рациональным методом деления и умножения в цифровых приборах является метод двоичного умножения (деления). Но в нашей схеме по ряду причин мы будем использовать другой метод. Одна из причин - это то, что в ассемблере для Z-80 не существует команды для сдвига влево или вправо пары восьмибитовых регистров, а мы производим вычисления над 16-битовыми числами. И второе - быстродействие достигаемое методом двоичного умножения (деления) нам не нужно так, как микропроцессор только обслуживает одно прерывание с Датчика1 (которое появляется с частотой 10-100 Гц) и второе - с таймера (появляющееся с частотой 200 Гц), а все остальное время находится в режиме ожидания.
Процедура умножения запрашивает два числа А1 и А2, а результат возвращает в А1. Умножение производится обычным сложением А1+А1 А2 раз. Поэтому рекомендуется, чтобы А1 было больше чем А2.
Процедура деления запрашивает два числа А1 и А2, а результат и остаток возвращает соответственно в А1 и А3. Деление производится вычитанием из А1 числа А2 пока не будет установлен флаг переноса.
На индикатор информация выводится следующим образом:
Берется цифра соответствующего разряда (разряды перебираются с конца) и из ячейки с адресом “R6+цифра” выбирается код сегментного индикатора.
С приходом сигнала с таймера на вход немаскируемых прерываний микропроцессор вызывает процедуру обработки прерывания, которая выводит на индикатор данные о сегменте. Все остальное время микропроцессор находится в режиме ожидания. Количество разрядов соответствует количеству десятков.
Разряд индикатора показан на рис.4, а код соответствующий определенной цифре в таблице 1.
Таблица 1.
Цифра | Сегменты | Адрес | |||||||
A | B | C | D | E | F | G | H | ||
0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 4111 |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 4112 |
2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 4113 |
3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 4114 |
4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 4115 |
5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 4116 |
6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 4117 |
7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 4118 |
8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 4119 |
9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 4120 |
Опишем переменные и место расположение их в памяти, используемые программой.
Таблица 2.
Переменная | Назначение | Нач. Адрес | Длина |
R1 | Значение Счетчика1 | 4096 D | 2 байта |
R2 | Значение Счетчика2 | 4098 | 2 |
R3 | Переменная для процедуры DECT | 4100 | 2 |
R4 | Число десятков | 4102 | 1 |
R5 | Начальный адрес массива цифр (8 цифр) | 4103 | 8 байт |
R6 | Начальный адрес массива кодов сегментного индикатора (10) | 4111 | 10 байт |
R7 | Состояние счетчика таймера | 4121 | 1 |
R8,R9,R10 | Вспомогательная | 4122 | 1,1,1 |
A1 | 1-е число для процедур DEL и YMH | 4125 | 2 |
A2 | 2-е число для процедур DEL и YMH | 4127 | 2 |
A3 | остаток от деления | 4129 | 2 |
В данной схеме сигнал прерывания с Датчика1 подается на вход немаскируемого прерывания INT микропроцессора Z-80. В общем случае обычное прерывание приведет к тому, что текущий счетчик команд будет помещен в стек, а управление с помощью программы RST будет передано на нулевую страницу ПЗУ. Поэтому процедура обработки прерываний должна находится по адресу 0000Н (см. рис. 5). Сигнал прерывания с таймера, контролирующий вывод на индикатор, поступает на вход немаскируемого прерывания NMI. Это прерывание имеет более высокий приоритет чем INT. Сигнал автоматически переводит ЦП к выполнению программы с адреса 0066Н. Поэтому данная процедура обработки прерывания вывода на индикатор должна находится по этому адресу. Следом за ней идут вспомогательные процедуры DECT, DEL, YMH, после чего располагается основная программа.
В.И. Зубчик, В.П. Сигорский. Справочник по цифровой схемотехнике. - К: “Техника”, 1990г., 448с.
Г.Я. Мирский. Микропроцессоры в измерительных приборах. - М: “Радио и связь”, 1984г., 160с.
В.И. Корнейчук, В.П. Тарасенко. Вычислительные устройства на микросхемах. - К: “Техника”, 1986г,264с.
У.Тант. Ассемблер Z-80. - М: ВА Принт, 1993г.,124с.
Конспект лекций по дисциплине “Цифровые устройства и микропроцессоры” для студентов радиотехнических специальностей. / Сост. Грабинский Ю.И, Коцержинский Б.А., Михайленко М.В. -К.:КПИ, 1995. - 184 с.
М.А. Раевский, В.П. Обметица, Справочник по обслуживанию и ремонту автомобилей ВАЗ. - К: “Выща школа” 1989г.,176с.
1-
[AK1]