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

📄 mv2.asm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -