Микропроцессорная система коррекции режимов работы двигателя внутреннего сгорания (Проектная часть дипломного проекта), страница 7

movf            t2h,w           ; ср момента выдачи сигнала

subwf _tmr0h,w     ; вычитаем из ср таймера

btfss             _status,c       ; проверяем флаг переноса

return                               ; ср таймера > ср момента выдачи

btfss             _status,z       ; проверяем флаг нуля

goto             _ot2             ; ср таймера < ср момента выдачи

movf            t2,w             ; мр момента выдачи сигнала

subwf _tmr0,w       ; вычитаем из мр таймера

btfss             _status,c       ; проверяем флаг переноса

return                               ; мр таймера > мр момента выдачи

_ot2             bsf    _portb,outc   ; выдаем сигнал

movlw         b'10110101' ; сбрасываем флаги

andwf          flag,f            ; в регистре flag

bsf               flag,4           ; ставим флаг выдачи сигнала

clrf               t2                 ; очистка регистров

clrf               t2h               ; хранения коррекции сигнала

Время выполнения блока 26 тактов.

make_ignition                  Подпрограмма коррекции принятого сигнала.

Длительность сигнала “зажигание” находится в регистровой паре (tay2h,tay2). Проверяется сигнал IDL, если он равен 0, то коррекции не производится и управление передается на метку no_make2.

Анализируется линия порта А, отвечающая за выбор алгоритма коррекции (0 - адаптивная коррекция, 1- коррекция из ПЗУ).

Если выбрана адаптивная ситема, то инкриментируется счетчик числа оборотов, и при прохождении счетчика через 256 увеличивается на единицу множитель угла опережения зажигания. Анализируется флаг детонации (бит 5 регистра flag), и если он равен единице, то множитель уменьшается на единицу ( угол опережения зажигания изменяется с шагом 1.40625 ° п.к.в.). Фрагмент программы:

btfss             flag,5           ; проверяем флаг детонации

goto             mign1          ; флаг не стоит - идем дальше

clrf               count           ; иначе сброс счетчика

decfsz          delta,f ; уменьшаем УОЗ

goto             mign2          ; если не ноль - идем на коррекцию УОЗ

goto             no_make2    ; если ноль - идем на перезапись

mign1          movf  delta,f ; проверяем множитель УОЗ

btfsc             _status,z       ; на равенство нулю

goto             no_make2    ; переписываем значение длительности

incfsz           count,f         ; увеличиваем счетчик оборотов

incf              delta,f ; если 256 оборотов - увеличиваем УОЗ

Если выбран алгоритм системы с коррекцией на основе констант из ПЗУ, то вычисляется значение интервала коррекции (подпрограмма make_adrk), считывается значение коррекции из внутренней EEPROM (подпрограмма read_EEPROM). Производится анализ считанного значения:

movlw         b'01111111' ; проверяем

andwf          tmp,w          ; значащие биты коррекции

btfsc             _status,z       ; если нулевая коррекция

goto             no_make2    ; просто переписываем старое значение

Для обоих алгоритмов вычисляем шаг коррекции (1.40625° п.к.в.) путем деления значения периода на 80h:

movf            perh,w         ; загружаем ср периода

movwf         suml             ; запись в рабочий регистр

rlf                per,w           ; сдвигаем влево мр и ср периода

rlf                suml,f          ; в suml  1,40625°п.к.в.

Проверяем знак считанного значения коррекции (старший бит). Если бит равен 1, следовательно коррекция отрицательная - уменьшаем длительность сигнала:

decrease2     bcf     tmp,7           ; сброс бита знака коррекции

_md10         movf  suml,w         ; шаг коррекции

subwf tay2,f                     ; отнимаем от мр длительности

btfss             _status,c                 ; перенос

decf             tay2h,f                   ; уменьшаем ср

decfsz          tmp,f                      ; уменьшаем счетчик

goto             _md10                   ; если не ноль - заново