?? mv2.asm
字號(hào):
;ADC 6 channels without reference
MOVLW B'10000001'
MOVWF ADCON0
BANKSEL ADCON1
MOVLW B'00001001'
MOVWF ADCON1
;timer2 internal, PR2=125, prescaler=4
BANKSEL T2CON
MOVLW B'00000101'
MOVWF T2CON
;other stuff...
banksel o2
movlw d'20'
movwf o2corr
MAIN
ADC ;measure analog values at ~every 1ms
banksel tps
movlw tps ;base address
andwf channel, 0 ;+ channel number
movwf FSR ; is the address of result
banksel ADRESH ;bank 0
bcf STATUS, IRP ;indirect adress page 0
movf ADRESH, 0
movwf INDF ;store result
banksel channel ;bank 1
decf channel, 0 ;channel -1
btfsc STATUS, Z ;if 0:
movlw 0x05 ;channel = 5
movwf channel
movwf ch
rlf ch, 1
rlf ch, 1
rlf ch, 1
movlw b'10000001'
andwf ch, 0
banksel ADCON0
movwf ADCON0
bcf PIR1, ADIF
bsf ADCON0, 2
GET_X
clrf seq
TIMETABLE ;looks for the first value in table that's smaller than
;time value.
movf seq, 0
sublw d'20'
movlw 0x02 ;wrong timetable
btfsc STATUS, Z
goto Err_
movlw 0x03
movwf PCLATH
movf seq, 0
call T_H
movwf temp
movf TIME_H, 0
subwf temp, 0
btfss STATUS, C
goto R3
btfsc STATUS, Z
goto R1
incf seq, 1
goto TIMETABLE
R1
movf seq, 0
call T_L
movwf temp
movf TIME_L, 0
subwf temp, 0
btfss STATUS, C
goto R3
btfsc STATUS, Z
goto R3
incf seq, 0
goto TIMETABLE
R3
movf seq, 0
movwf REF_X
GET_Y
clrf seq
LOADTABLE ;looks for the first value in table that's bigger than
;time value.
movf seq, 0
sublw d'10'
movlw 0x03 ;wrong loadtable
btfsc _Z
goto Err_
movlw 0x03
movwf PCLATH
movf seq, 0
call LOAD_
subwf load, 0
btfss _C
goto R2
incf seq, 1
goto LOADTABLE
R2
movf seq, 0
movwf REF_Y
GET_FRAME
;LOADS 4 SURROUNDING POINTS
MOVF REF_Y, 0
MOVWF AARGB0
MOVLW D'20'
MOVWF AARGB1
CALL MUL8X8 ;ref_y*
MOVF REF_X, 0
ADDWF BARGB1, 0
MOVWF OFFSET1 ;OFFSET1=(X;Y)
ADDLW D'20'
MOVWF OFFSET2 ;OFFSET2=(X;Y+1)
SUBLW D'220'
MOVLW D'20'
BTFSS _C
SUBWF OFFSET2, 1
INCF OFFSET1, 0 ;OFFSET3=(X+1;Y)
MOVWF OFFSET3
SUBLW D'220'
BTFSS _C
DECF OFFSET3, 1
INCF OFFSET2, 0 ;OFFSET4=(X+1;Y+1)
MOVWF OFFSET4
SUBLW D'220'
BTFSS _C
DECF OFFSET4, 1
MOVLW FUEL_MEM ;read fuelmap table
MOVWF PCLATH
MOVF OFFSET1, 0
CALL FUELMAP
MOVWF F1
MOVF OFFSET2, 0
CALL FUELMAP
MOVWF F2
MOVF OFFSET3, 0
CALL FUELMAP
MOVWF F3
MOVF OFFSET4, 0
CALL FUELMAP
MOVWF F4
;read advmap table
MOVLW IGN_MEM ;read IGNMAP table
MOVWF PCLATH
MOVF OFFSET1, 0
CALL IGNMAP
MOVWF ADV1
MOVF OFFSET2, 0
CALL IGNMAP
MOVWF ADV2
MOVF OFFSET3, 0
CALL IGNMAP
MOVWF ADV3
MOVF OFFSET4, 0
CALL IGNMAP
MOVWF ADV4
MOVLW 0X03 ;LOADS FX AND FX_ VALUES
MOVWF PCLATH
MOVF REF_X, 0 ;first less or same value
CALL T_L
MOVWF FLX
MOVF REF_X, 0
CALL T_H
MOVWF FHX
DECF REF_X, 0 ;bigger value
MOVWF FLX_
DECF REF_X, 0
CALL T_H
MOVWF FHX_
movlw 0x03 ;near load values
movwf PCLATH
movf REF_Y, 0
call LOAD_
movwf LX ;first bigger value (X)
decf REF_Y, 0
call LOAD_
movwf LX_ ;same or less value (X-1)
movf F1, 0
movwf S1
movf F2, 0
movwf S2
movf LX_, 0
subwf load, 0
movwf base
call INTERP16
movwf I1
movf F3, 0
movwf S1
movf F4, 0
movwf S2
movf LX_, 0
subwf load, 0
movwf base
call INTERP16
movwf I2
call INTERP24
movwf INJ
movf ADV1, 0
movwf S1
movf ADV2, 0
movwf S2
movf LX_, 0
subwf load, 0
movwf base
call INTERP16
movwf I1
movf ADV3, 0
movwf S1
movf ADV4, 0
movwf S2
movf LX_, 0
subwf load, 0
movwf base
call INTERP16
movwf I2
call INTERP24
movwf ADV
etc movlw SETUP_MEM ;engine temp compensation
movwf PCLATH
banksel ntc1
movf ntc1, 0
andlw d'31'
call ntc1_map
banksel INJ
movwf AARGB0
movf INJ, 0
movwf AARGB1
lcall MUL8X8
bcf _C
rrf BARGB0, 0
movwf INJ
atc movlw SETUP_MEM ;air temp compensation
movwf PCLATH
banksel ntc1
movf ntc2, 0
andlw d'31'
call ntc2_map
banksel INJ
movwf AARGB0
movf INJ, 0
movwf AARGB1
lcall MUL8X8
bcf _C
rrf BARGB0, 0
movwf INJ
o2c ;lambda correction
banksel o2
movlw SETUP_MEM
movwf PCLATH
call o2ref
subwf o2, 0
clrf PCLATH
btfsc _C
goto lean
rich decf o2corr, 1
goto mixok
lean incf o2corr, 1
mixok movf o2corr, 0
banksel INJ
movwf AARGB0
movf INJ, 0
movwf AARGB1
clrf PCLATH
call MUL8X8
bcf _C
rrf BARGB0, 0
movwf INJ
;Coming soon:
;knock advance retarding
banksel tps ;acceleration enrichment
movf tps, 0
subwf tpsold, 0
movwf tpsdiff
clrf PCLATH
btfsc _C
goto noacc ;no new acceleration
movlw SETUP_MEM
movwf PCLATH
call accelrate
subwf tpsdiff, 0
clrf PCLATH
btfss _C
goto noacc ;acc does not reach the limit
movf maxaccel, 0 ;accel value on maximum
movwf accel
movlw SETUP_MEM
movwf PCLATH
call acc_delay
movwf acceldelay
call acc_ratio
movwf temp1
clrf PCLATH
noacc decf acceldelay, 0
movwf acceldelay
btfsc _Z
goto nomul ;acceldelay ready
movf temp1, 0
banksel INJ
movwf AARGB0
movf INJ, 0
movwf AARGB1
clrf PCLATH
call MUL8X8
bcf _C
rrf BARGB0, 0
movwf INJ
nomul
revlim
banksel TIME_H ;rpm limiter
movlw SETUP_MEM
movwf PCLATH
call revlimit_h
movwf temp
movf TIME_H, 0
subwf temp, 0 ;ok if negative
clrf PCLATH
btfss _C
goto revok
btfss _Z
goto shtdwn
movlw SETUP_MEM
movwf PCLATH
call revlimit_l
movwf temp
movf TIME_L, 0
subwf temp, 0 ;ok if negative
clrf PCLATH
btfss _C
goto revok
shtdwn bcf mode, 2 ;sw on delay active
bcf mode, 3 ;disables coil charge
bcf mod1, 0 ;disables injection
btfsc mod1, 0
revok bsf mod1, 0
cutf
clrf PCLATH
banksel REF_Y
movf REF_Y, 1
btfss _Z
goto cutok
movlw SETUP_MEM
movwf PCLATH
call fuelcut_h
movwf temp
movf TIME_H, 0
subwf temp, 0 ;ok if negative
clrf PCLATH
btfss _C
goto cutok
btfss _Z
goto fuelcut
movlw SETUP_MEM
movwf PCLATH
call fuelcut_l
movwf temp
movf TIME_L, 0
subwf temp, 0 ;ok if negative
clrf PCLATH
btfss _C
goto cutok
fuelcut bcf mod1, 0 ;disables injection
btfsc mod1, 0
cutok bsf mod1, 0
bcf INTCON, GIE ;value setting
; movf ?, 0
movwf ignres_h
; movf ?, 0
movwf ignres_l
movf INJ, 0
movwf injres
bsf INTCON, GIE
loop
GOTO MAIN
INTERP16
movf LX_, 0
subwf LX, 0
movwf DIST
movf I1, 0
subwf I2, 0
movwf DIFF
btfss _C
goto neg
movwf AARGB0
movf base, 0
movwf AARGB1
call MUL8X8
movf BARGB0, 0
movwf AARGB0
movf BARGB1, 0
movwf AARGB1
movf DIST, 0
movwf AARGB0
call FXD1608U
movf AARGB1, 0
addwf I1, 0
return
neg comf DIFF, 1
movf base, 0
movwf AARGB1
call MUL8X8
movf BARGB0, 0
movwf AARGB0
movwf AARGB1
movf DIST, 0
movwf AARGB0
call FXD1608U
movf AARGB1, 0
subwf I1, 0
return
INTERP24 ; 24BIT ACCURACY
MOVF I1, 0 ;DIFF=S2-S1
SUBWF I2, 0
MOVWF DIFF
BTFSS _C
GOTO NEG
COMF FHX_, 0 ;DIST=FX-FX_
MOVWF AARGB0
COMF FLX_, 0
MOVWF AARGB1
MOVF FHX, 0
MOVWF BARGB0
MOVF FLX, 0
MOVWF BARGB1
MOVLW 0X01
ADDWF AARGB1, 1
BTFSC _C
INCF AARGB0, 1
CALL XADD
MOVF BARGB0, 0
MOVWF DIST_H
MOVF BARGB1, 0
MOVWF DIST_L
COMF FHX_, 0 ;AARGB=TIME-FX_
MOVWF AARGB0
COMF FLX_, 0
MOVWF AARGB1
MOVF TIME_H, 0
MOVWF BARGB0
MOVF TIME_L, 0
MOVWF BARGB1
MOVLW 0X01
ADDWF AARGB1, 1
BTFSC _C
INCF AARGB0, 1
CALL XADD
MOVF BARGB0, 0
MOVWF AARGB0
MOVF BARGB1, 0
MOVWF AARGB1
MOVF DIFF, 0 ;AARGB=DIFF*(TIME-FX_)
MOVWF BARGB0
CALL FXM1608U
MOVF DIST_H, 0 ;AARGB=((DIFF*(TIME-FX_))/DIST)
MOVWF BARGB0
MOVF DIST_L, 0
MOVWF BARGB1
CALL FXD2416U
MOVF AARGB2, 0 ;RESULT=S1+((DIFF*(TIME-FX_))/DIST)
ADDWF S1, 0
MOVWF RESULT
RETURN
NEG
COMF DIFF, 1
COMF FHX_, 0 ;DIST=FX-FX_
MOVWF AARGB0
COMF FLX_, 0
MOVWF AARGB1
MOVF FHX, 0
MOVWF BARGB0
MOVF FLX, 0
MOVWF BARGB1
MOVLW 0X01
ADDWF AARGB1, 1
BTFSC _C
INCF AARGB0, 1
CALL XADD
MOVF BARGB0, 0
MOVWF DIST_H
MOVF BARGB1, 0
MOVWF DIST_L
COMF FHX_, 0 ;AARGB=TIME-FX_
MOVWF AARGB0
COMF FLX_, 0
MOVWF AARGB1
MOVF TIME_H, 0
MOVWF BARGB0
MOVF TIME_L, 0
MOVWF BARGB1
MOVLW 0X01
ADDWF AARGB1, 1
BTFSC _C
INCF AARGB0, 1
CALL XADD
MOVF BARGB0, 0
MOVWF AARGB0
MOVF BARGB1, 0
MOVWF AARGB1
MOVF DIFF, 0 ;AARGB=DIFF*(TIME-FX_)
MOVWF BARGB0
CALL FXM1608U
MOVF DIST_H, 0 ;AARGB=((DIFF*(TIME-FX_))/DIST)
MOVWF BARGB0
MOVF DIST_L, 0
MOVWF BARGB1
CALL FXD2416U
MOVF AARGB2, 0 ;RESULT=S1+((DIFF*(TIME-FX_))/DIST)
SUBWF S1, 0
MOVWF RESULT
RETURN
#include "maps"
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -