⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mv2.asm

📁 CCP1模块使用的有关PIC应用程序Trabicom On Board Engine Controller
💻 ASM
📖 第 1 页 / 共 2 页
字号:
#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 + -