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

00D5 0813                movf    tmp,w      ; загружаем мр разности

00D6 022B                subwf   o_inj,w    ; вычитаем из мр половины длительности

00D7 1C03                btfss   _status,c  ; перенос?

00D8 28DB                goto    ok_inj     ; установили момент перехода на двойной счет

00D9 1D03                btfss   _status,z  ; флаг нуля

00DA 28F2                goto    _make_ex   ; нет - двойного счета не было

00DB 140C        ok_inj  bsf     flag,0  ; установили момент перехода на двойной счет

00DC 081B                movf    per,w   ; записываем значение текущего периода

00DD 00AD                movwf   dbl     ; в регистровую пару

00DE 081A                movf    perh,w  ; (dblh,dbl)

00DF 00AC                movwf   dblh

00E0 28ED                goto    pr_d1   ; идем на перезапись


MPASM 01.50 Released              DET.ASM   6-23-1999  21:01:07         PAGE  8

LOC  OBJECT CODE SOURCE TEXT

VALUE

00E1             make_double             ; проверка текущего периода и

00E1 082C                movf    dblh,w  ; сохраненного значения периода перхода на

00E2 021A                subwf   perh,w  ; двойной счет

00E3 1C03                btfss   _status,c; перенос?

00E4 28ED                goto    pr_d1    ; ср периода < ср сохраненного периода

00E5 1D03                btfss   _status,z

00E6 28F2                goto    _make_ex ; ср периода > ср сохраненного периода

00E7 082D                movf    dbl,w   ; загружаем мр

00E8 021B                subwf   per,w   ; вычитаем из текущего

00E9 1903                btfsc   _status,z ; флаг нуля установлен

00EA 28ED                goto    pr_d1     ; да - мр периода = мр сохраненного периода

00EB 1803                btfsc   _status,c ; флаг переноса?

00EC 28F2                goto    _make_ex  ; текущий период < сохраненного

00ED             pr_d1   ; уменьшаем в два раза длительность сигнала "топливо"

00ED 20F2                call    _make_ex ; подготавливаем adrk и tmp

00EE 0183                clrf    _status  ; сбрасываем STATUS

00EF 0C94                rrf     adrk,f   ; делим на 2 длительность сигнала

00F0 0C93                rrf     tmp,f    ; "топливо"

00F1 0008                return           ; выход: в (adrk,tmp) - скорр. длительность

00F2 0824        _make_ex  movf  tjdh,w   ; записываем в adrk и tmp

00F3 0094                movwf   adrk     ; подготовленное для коррекции значение

00F4 00AA                movwf   o_inj_h  ; длительности сигнала "топливо"

00F5 0825                movf    tjd,w    ; в (o_inj_h,o_inj) вместо старого значения

00F6 0093                movwf   tmp      ; длительности записываются скорректированное

00F7 00AB                movwf   o_inj    ; значение сигнала "топливо"

00F8 0008                return           ; выход

00F9 1003        _make25 bcf     _status,c; сброс флага переноса

00FA 0C94                rrf     adrk,f   ; делим пару (adrk,tmp)

00FB 0C93                rrf     tmp,f    ; на 4 путем двух сдвигов вправо

00FC 1003                bcf     _status,c; сброс флага переноса

00FD 0C94                rrf     adrk,f

00FE 0C93                rrf     tmp,f

00FF 0008                return        ;выход: (adrk,tmp)=0.25 длительности "топлива"

0100             cr_inj_com

0100 20BE                call   create_inj ; вычисляем коррекцию

0101 0813                movf   tmp,w      ; переписываем полученные

0102 0099                movwf  suml       ; значения коррекции

0103 0814                movf   adrk,w     ; в пару регистров

0104 00AE                movwf  sumh       ; результата

0105 1E05        cr_i_1  btfss   _porta,idl ; IDL = 0 ?

0106 2922                goto    c_i_n      ; да - переписываем старое значение

0107 20AE                call    make_adrk  ; вычисляем текущий интервал

0108 1694                bsf     adrk,5     ; читаем вторую половину EEPROM

0109 20A4                call    read_EEPROM; читаем коррекцию из EEPROM