?? mv2.asm
字號:
#include "mv2def.asm"
;VARIABLES
cblock 0x20 ;-0X70, 80 BYTES
cyl
PREVB
TMR3H
TMR3L
TMR0H
ignres_h
ignres_l
injres
ADV1
ADV2
ADV3
ADV4
OFFSET1
OFFSET2
OFFSET3
OFFSET4
F1
F2
F3
F4
REF_X
REF_Y
AARGB0
AARGB1
AARGB2
BARGB2
BARGB0
BARGB1
AARGB5
TEMP
temp
LOOPCOUNT
TEMPB0
TEMPB1
TEMPB2
TEMPB3
REMB2
REMB0
REMB1
FPFLAGS
NAN
SIGN
S1
S2
I1
I2
DIST_H
DIST_L
DIFF
FHX
FLX
FHX_
FLX_
LX
LX_
RESULT
seq
INJ1C
INJ2C
INJ3C
INJ4C
s_mode
s_count
cmnd
IGN1H
IGN1L
IGN2H
IGN2L
charge_h
charge_l
load
time1_l
time1_h
base
DIST
INJ
ADV
ENDC
CBLOCK 0XA0 ;-0XEF, 80 BYTES
tps
map
ntc1
ntc2
o2
knock
o2corr
channel
ch
tpsold
tpsdiff
acceldelay
maxaccel
accel
temp1
ENDC
CBLOCK 0X110 ;-0X16F, 96 BYTES
ENDC
CBLOCK 0X190 ;-0X1EF, 96 BYTES
ENDC
CBLOCK 0X70 ;-0X7F, 16 BYTES
s_save
w_save
p_save
sfsr
mode
TIME_H
TIME_L
mod1
ENDC
org 0x0000
GOTO INIT
org 0x0004
push bcf mode, 0
btfsc STATUS, RP0
bsf mode, 0
movwf w_save
swapf STATUS, 0
movwf s_save
movf PCLATH, 0
movwf p_save
clrf PCLATH
bcf _C
goto int
pop movf p_save, 0
movwf PCLATH
swapf s_save, 0
movwf STATUS
swapf w_save, 1
swapf w_save, 0
bcf _C
btfsc mode, 0
bsf _C
retfie
int btfsc INTCON, INTF
goto signal
btfss mode, 1
goto noign
btfsc PIR1, CCP2IF ;Ignition timing active?
goto ignite
noign btfsc PIR1, TMR2IF
goto t2over
btfsc INTCON, T0IF
goto t0over
signal movf CCPR1H, 0 ;T1 read
movwf time1_h
movf CCPR1L, 0
movwf time1_l
movf TMR0, 0 ;T0 read
movwf TIME_L
movf TMR0H, 0
movwf TIME_H
btfss INTCON, T0IF ;T0 overflow?
goto t0ok
movf TMR0, 0
movwf TIME_L
incf TMR0H, 0
movwf TIME_H
t0ok clrf TMR0 ;T0 ready
clrf TMR0H
bcf INTCON, T0IF ;T0IF = 0
incf cyl, 1
btfsc PORTB, 1 ;CYL No. = 0
clrf cyl
movf ignres_h, 0
addwf time1_h, 0
movwf CCPR2H
movf ignres_l, 0
addwf time1_l, 0
movwf CCPR2L
btfsc _C
incf CCPR2H, 1
bsf STATUS, RP0 ;bank = 1
bsf PIR2, CCP2IE ;ccp2 Interrupt Enable
bcf STATUS, RP0 ;bank = 0
bsf mode, 1 ;ignition timing active
movf cyl, 0
andlw b'00000011'
andwf PCL, 1
goto cyl1
goto cyl2
goto cyl3
goto cyl4
cyl1 bsf PORTD, 7 ;open injector 1
movf injres, 0
addwf TMR3L, 0
movwf INJ1C
btfsc mod1, 0
bsf mode, 7
goto pop
cyl2 bsf PORTD, 6 ;open injector 2
movf injres, 0
addwf TMR3L, 0
movwf INJ2C
btfsc mod1, 0
bsf mode, 6
goto pop
cyl3 bsf PORTD, 5 ;open injector 3
movf injres, 0
addwf TMR3L, 0
movwf INJ3C
btfsc mod1, 0
bsf mode, 5
goto pop
cyl4 bsf PORTD, 4 ;open injector 4
movf injres, 0
addwf TMR3L, 0
movwf INJ4C
btfsc mod1, 0
bsf mode, 4
goto pop
ignite movf cyl, 0
andlw b'00000001'
addwf PCL, 1
goto ign1
goto ign2
ign1 bcf PORTD, 2 ;sw off coil1
movf charge_h, 0
addwf TMR3H, 0
movwf IGN1H
movf charge_l, 0
addwf TMR3L, 0
movwf IGN1L
btfsc _C
incf IGN1H, 1
bsf mode, 2 ;charge timing 1 active
goto pop
ign2 bcf PORTD, 3 ;sw off coil2
movf charge_h, 0
addwf TMR3H, 0
movwf IGN2H
movf charge_l, 0
addwf TMR3L, 0
movwf IGN2L
btfsc _C
incf IGN2H, 1
bsf mode, 3 ;charge timing 2 active
goto pop
t2over movlw 0x01
addwf TMR3L, 1
btfsc _C
incf TMR3H, 0
coil1 movf TMR3L, 0
subwf IGN1L, 0
btfss _Z
goto coil2
movf TMR3H, 0
subwf IGN1H, 0
btfss _Z
goto coil2
bsf PORTD, 2
bcf mode, 2
coil2 movf TMR3L, 0
subwf IGN2L, 0
btfss _Z
goto inj1
movf TMR3H, 0
subwf IGN2H, 0
btfss _Z
goto inj1
bsf PORTD, 3
bcf mode, 3
inj1 movf TMR3L, 0
subwf INJ1C, 0
btfss _Z
goto inj2
bcf PORTD, 7
bcf mode, 7
inj2 movf TMR3L, 0
subwf INJ2C, 0
btfss _Z
goto inj3
bcf PORTD, 6
bcf mode, 6
inj3 movf TMR3L, 0
subwf INJ3C, 0
btfss _Z
goto inj4
bcf PORTD, 5
bcf mode, 5
inj4 movf TMR3L, 0
subwf INJ4C, 0
btfss _Z
goto done
bcf PORTD, 4
bcf mode, 4
done bcf PIR1, TMR2IF
goto pop
t0over bcf INTCON, T0IF
incf TMR0H, 1
goto pop
s_rec movf s_mode, 0
btfsc _Z
goto s_cmnd
andlw b'00000011'
addwf PCL, 1
goto s_rram ;read ram
goto s_wram ;write ram
goto s_rprg ;read prog mem
goto s_wprg ;write prog mem
s_rram
s_wram
s_rprg
s_wprg
s_cmnd movf RCREG, 0
movwf cmnd
andlw b'00000011'
movwf s_mode
clrf s_count
goto pop
;***************************************************************
; 24/16 Bit Unsigned Fixed Point Divide 24/16 -> 24.16
; Input: 24 bit unsigned fixed point dividend in AARGB0, AARGB1,AARGB2
; 16 bit unsigned fixed point divisor in BARGB0, BARGB1
; Use: CALL FXD2416U
; Output: 24 bit unsigned fixed point quotient in AARGB0, AARGB1,AARGB2
; 16 bit unsigned fixed point remainder in REMB0, REMB1
; RESULTult: AARG, REM <-- AARG / BARG
; Max Timing: 2+525+2 = 529 clks
; Max Timing: 2+497+2 = 501 clks
; PM: 2+169+1 = 172 DM: 8
FXD2416U CLRF REMB0
CLRF REMB1
UDIV2416L
RETLW 0x00
;**********************************************************************************************
;**********************************************************************************************
; 16x8 Bit Unsigned Fixed Point Multiply 16x8 -> 24
; Input: 16 bit unsigned fixed point multiplicand in AARGB0
; 8 bit unsigned fixed point multiplier in BARGB0
; Use: CALL FXM1608U
; Output: 24 bit unsigned fixed point product in AARGB0
; RESULTult: AARG <-- AARG x BARG
; Max Timing: 5+119+2 = 126 clks
; Min Timing: 5+54 = 59 clks
; PM: 5+26+1 = 31 DM: 7
FXM1608U CLRF AARGB2 ; clear partial product
MOVF AARGB0,W
MOVWF TEMPB0
MOVF AARGB1,W
MOVWF TEMPB1
UMUL1608L
RETLW 0x00
XADD MOVF AARGB0, 0
ADDWF BARGB0, 1
MOVF AARGB1, 0
ADDWF BARGB1, 0
BTFSC _C
INCF BARGB0, 1
RETLW 0X00
;**********************************************************************************************
;**********************************************************************************************
; 16/8 Bit Unsigned Fixed Point Divide 16/8 -> 16.08
; Input: 16 bit unsigned fixed point dividend in AARGB0, AARGB1
; 8 bit unsigned fixed point divisor in BARGB0
; Use: CALL FXD1608U
; Output: 16 bit unsigned fixed point quotient in AARGB0, AARGB1
; 8 bit unsigned fixed point remainder in REMB0
; Result: AARG, REM <-- AARG / BARG
; Max Timing: 1+291+2 = 294 clks
; Min Timing: 1+227+2 = 230 clks
; PM: 1+39+1 = 41 DM: 7
FXD1608U CLRF REMB0
UDIV1608L
RETLW 0x00
;**********************************************************************************************
MUL8X8
CLRF BARGB0
CLRF BARGB1
MOVLW 8
MOVWF LOOPCOUNT
MOVF AARGB0, W
BCF STATUS, C ; Clear the carry bit in the status Reg.
MULLOOP RRF AARGB1, F
BTFSC STATUS, C
ADDWF BARGB0, F
RRF BARGB0, F
RRF BARGB1, F
DECFSZ LOOPCOUNT, F
GOTO MULLOOP
RETURN
;***************************************************************
Err_
goto Err_
org 0x300
T_L
ADDWF PCL, 1
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
RETLW 0X00
T_H
ADDWF PCL, 1
RETLW 0XFF
RETLW 0XEE
RETLW 0XDD
RETLW 0XCC
RETLW 0XBB
RETLW 0XAA
RETLW 0X99
RETLW 0X88
RETLW 0X77
RETLW 0X70
RETLW 0X66
RETLW 0X60
RETLW 0X55
RETLW 0X50
RETLW 0X45
RETLW 0X40
RETLW 0X35
RETLW 0X25
RETLW 0X12
RETLW 0X00
LOAD_
ADDWF PCL, 1
RETLW 0x00
RETLW 0x10
RETLW 0x20
RETLW 0x40
RETLW 0x50
RETLW 0x60
RETLW 0x80
RETLW 0xA0
RETLW 0xC0
RETLW 0xD0
RETLW 0xE0
RETLW 0XFF
;***************************************************************
INIT
CLRF STATUS
;not yet ready
;timer0 256kHz extrnal signal, prescaler=4
MOVLW B'11100001'
MOVWF OPTION_REG
MOVLW B'01110000'
MOVWF INTCON
BANKSEL PIE1
MOVLW B'00110010'
MOVWF PIE1
MOVLW B'01000000'
ANDWF PIE2, 1
BANKSEL PIR1
CLRF PIR1
CLRF PIR2
;timer1 256kHz ext, pre=1
MOVLW B'00000011'
MOVWF T1CON
;CCP1 capture, int is also connected to it
MOVLW B'00000101'
MOVWF CCP1CON
;CCP2 compare, ignition timing ready
MOVLW B'00001010'
MOVWF CCP2CON
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -