Устройство для измерения угла опережения зажигания четырехтактных карбюраторных двигателей




















































5. Программное обеспечение

 

На рис. 3. изображена блок-схема -программы, которая находится в ПЗУ.

Все “свободное” время микропроцессор выводит на индикатор результат. При приходе на вход маскируемых прерываний сигнала от Датчика1, процессор прерывает вывод на индикатор и вызывает процедуру обслуживания прерываний. Эта процедура считывает с


Рис. 3.

выхода таймера значение Счетчика1. Затем проверяет наличие сигнала с переключателя рода роботы, и если такой имеется, то программа вычисляет количество оборотов в минуту коленчатого вала, и передает результат основной программе, которая выводит его на индикатор. Количество оборотов можно вычислить по следующей формуле, зная частоту счетных импульсов и значение Счетчика1:

В случае если переключатель не нажат, то микропроцессор считывает с выхода таймера значение Счетчика2. Затем, пользуясь значениями счетчиков 1 и 2, вычисляет угол опережения зажигания, и после этого так же как и в предыдущем случае процессор передает результат основной программе, которая выводит его на индикатор. Следует отметить, что перед тем как результат будет выведен на индикатор он разбивается на десятки, для того, чтобы затем можно было перевести каждую цифру в отдельности из двоичной системы в код сегментного индикатора.


Ниже приводится программа на ассемблере для микропроцессора Z-80.


Основной блок:

; начальный блок, программирующий таймер.

LD    A, 00111010 ; запись управляющего слова в счетчик 0: Режим работы 5; загрузка сначала младшего, затем старшего байта; код - двоичный.

OUT  3,A

LD    A, FFH

OUT  3,A

LD    A, FFH

OUT  3,A

LD    A,01111010 ; запись управляющего слова в счетчик 1.

OUT  3,A

LD    A, FFH

OUT  3,A

LD    A, FFH

OUT  3,A

LD    A, 10111010 ; запись управляющего слова в счетчик 3.

OUT  3,A

LD    A, C4

OUT  3,A    ;запись числа 2500.

LD    A,9

OUT  3,A

; основной блок - вывод информации на индикатор.

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) ; проверка состояния счетчика[1][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

Страницы: 1, 2, 3



Реклама
В соцсетях
рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать