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

0037 02A4                subwf   tjdh,f   ; вычитаем из ср текущего времени

0038 0823                movf    tn,w     ; мр начала отсчета

0039 02A5                subwf   tjd,f    ; получаем длительность импульса "топливо"

003A 1C03                btfss   _status,c; перенос?

003B 03A4                decf    tjdh,f   ; уменьшаем ср

003C 1D0C                btfss   flag,2   ; предыдущий IDL был 1?

003D 204F                call    save_old ; нет - запись старого значения длительности

003E 1985                btfsc   _porta,S_A

003F 2845                goto    ex_rb5

0040 1A05                btfsc   _porta,idl

0041 2845                goto    ex_rb5

0042 1106                bcf   _portb,inj1; заканчиваем выдачу импульса

0043 150D                bsf    flagh,2   ; ставим флаг окончания

0044 100D                bcf    flagh,0

0045 1A05        ex_rb5  btfsc   _porta,idl ;IDL равен 1

0046 150C                bsf     flag,2     ;  да - ставим флаг

0047 1E05                btfss   _porta,idl ;IDL равен 0

0048 110C                bcf     flag,2     ;  да - сбрасываем флаг

0049 0812        exit    movf    tmp_st,w   ; восстанавливаем STATUS

004A 0083                movwf   _status    ;

004B 0811                movf    tmp_w,w    ; и W

004C 158B                bsf     _intcon,3  ; разрешаем прерывания от RB4-7

004D 160B                bsf     _intcon,4  ; и от ножки int

004E 0009                retfie             ; возврат с разрешением прерываний

004F 0824        save_old movf   tjdh,w    ;        сохранение длительности

0050 00AA                movwf   o_inj_h   ; ср

0051 0825                movf    tjd,w     ;        предыдущего импульса "топливо"

0052 00AB                movwf   o_inj     ; мр

0053 0008                return

;--------------------------------------------------------------0054 009D        _rtcc_int movwf tmr_w     ; сохраняем w и _status

0055 0803                movf    _status,w ; в собственные регистры

0056 009C                movwf   tmr_st    ; для прерывания таймера

0057 0F8E                incfsz  _tmr0h,f  ; увеличиваем счетчик 9-16 разрядов

0058 285B                goto    _r_i      ; перехода через ноль нет - выход

0059 3087                movlw   b'10000111'; сброс флагов переполнения для сигналов

005A 058D                andwf   flagh,f    ; "зажигание", "топливо1,2","перебор"


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

LOC  OBJECT CODE SOURCE TEXT

VALUE

005B 110B        _r_i    bcf     _intcon,2 ; сброс флага прерывания от таймера

005C 081C                movf    tmr_st,w  ; восстановление регистров

005D 0083                movwf   _status   ; STATUS

005E 081D                movf    tmr_w,w   ; и W

005F 0009                retfie            ; выход из прерывания

;--------------------------------------------------------------0060 108B        int0    bcf     _intcon,1   ; сброс флага прерывания int

0061 1C06        RB      btfss   _portb,inpb ; проверяем фронт сигнала

0062 2888                goto    RB_z        ; задний фронт сигнала "зажигание"

; _|

0063 1086                bcf     _portb,outc ; начинаем выдавать сигнал "зажигание"

0064 158C                bsf     flag,3      ; ставим флаг начала выдачи сигнала

0065 3003                movlw   b'00000011' ; 1:16 период 6,4mks по |_

0066 0062                option              ; загружаем в регистр OPTION

0067 080F                movf    owh,w       ; текущее значение времени

0068 021E                subwf   temph,w     ; минус сохраненное значение

0069 009A                movwf   perh        ; начала отсчета дает

006A 0810                movf    ow,w        ; значение периода

006B 021F                subwf   templ,w     ; (perh,per) содержит значение периода

006C 009B                movwf   per

006D 1C03                btfss   _status,c

006E 039A                decf    perh,f

006F 081F                movf    templ,w