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

00A3 2849                goto    exit        ; идем на выход

;--------------------------------------------------------------00A4             read_EEPROM ; в adrk адрес интервала коррекции

00A4 0814                movf    adrk,w     ; запись через регистр w

00A5 0089                movwf   _eeadr     ; в регистр адреса EEPROM

00A6 138B                bcf     _intcon,7  ; запрет прерываний

00A7 1683                bsf     _status,rp0 ;переключаем страницу памяти

00A8 1408                bsf     _eecon1,rd ; ставим бит чтения EEPROM

00A9 1283                bcf     _status,rp0 ;переключаем на начальную страницу

00AA 0808                movf    _eedata,w  ; записываем прочитанные данные

00AB 0093                movwf   tmp        ; в w и tmp

00AC 178B                bsf     _intcon,7  ; разрешаем прерывания

00AD 0008                return   ; в tmp и w возвращается значение из EEPROM

;--------------------------------------------------------------00AE             make_adrk

00AE 081B                movf    per,w      ; считываем мр периода

00AF 0093                movwf   tmp        ; записываем в tmp

00B0 081A                movf    perh,w     ; пересылаем ср периода в

00B1 0094                movwf   adrk       ; регистр adrk

00B2 0D93                rlf     tmp,f      ; производим два сдвига влево

00B3 0D94                rlf     adrk,f     ; полученный результат в регистре


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

LOC  OBJECT CODE SOURCE TEXT

VALUE

00B4 0D93                rlf     tmp,f      ; adrk равен периоду деленному на 0x40

00B5 0D94                rlf     adrk,f

00B6 3020                movlw   0x20       ; сравниваем adrk с 0x20

00B7 0214                subwf   adrk,w

00B8 1C03                btfss   _status,c  ; если меньше -> на выход

00B9 0008                return             ; выход: в adrk адрес интервала коррекции

00BA 30F0                movlw   b'11110000'; если больше -> маскируем 4 младших

00BB 0594                andwf   adrk,f     ; разряда и меняем местами ср и мр

00BC 0E94                swapf   adrk,f     ; получаем период деленный на 0x400

00BD 0008                return             ; выход: в adrk адрес интервала коррекции

;--------------------------------------------------------------00BE             create_inj

00BE 1E05                btfss   _porta,idl ; если IDL = 0

00BF 28F2                goto    _make_ex   ; то переход на перезапись результата

00C0 180C                btfsc   flag,0     ; момент перехода установлен?

00C1 28E1                goto    make_double; идем на сравнение текущего периода

00C2 082A                movf    o_inj_h,w  ; ср старого значения длительности

00C3 0224                subwf   tjdh,w     ; вычитаем из текущего

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

00C5 28F2                goto    _make_ex   ; ср текущей длит. > ср предыдущего

00C6 0094                movwf   adrk       ; записываем ср разности

00C7 082B                movf    o_inj,w    ; мр старого значения

00C8 0225                subwf   tjd,w      ; вычитаем из предыдущего

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

00CA 0394                decf    adrk,f     ; уменьшаем ср разности

00CB 0093                movwf   tmp        ; записываем мр разности

00CC 0183                clrf    _status    ; сброс переноса

00CD 0CAA                rrf     o_inj_h,f  ; делим старое значение длительности

00CE 0CAB                rrf     o_inj,f    ; на два; теперь сравниваем разность и

; половину дредыдущей длительности

00CF 0814                movf    adrk,w     ; загружаем ср разности

00D0 022A                subwf   o_inj_h,w  ; вычитаем из ср половина длительности

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

00D2 28DB                goto    ok_inj     ; ср разности > ср половины длительности

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

00D4 28F2                goto    _make_ex   ; ср разности < ср половины длительности