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

📄 cmd6.asm

📁 用PIC单片机18F6520+ADE7755实现的一个大安培、锂离子电池的化程器。全部源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		movlw	D'5'
		movwf	SBL
		goto	PRE_DELAY


W_CHxOS:		
		movf	TEMP,W		; command to write to chXos register(通道1失调校正寄存器) 
		movwf	spi		; call spi control write to ch1os reg
		movlw	D'8'		; number of bits
		movwf	wordlen
		CALL	SPIDX		; output outd1 to 7756 
		return

; -----------------------------------------------------------------------------------
; 通过调整APGAIN来校准通道1
; 给10A电流,应读出波形值 01020CH
CorrectCH1:
;;;not complete
		movlw	D'4'
		movwf	SBL
		goto	PRE_DELAY
		
ReadAPGain:
		movlw	B'00001011'	; command to read apgain register 
		movwf	spi		; call spi control read apgain reg
		movlw	b'00000010'	; number of bytes to download B'000(5)(4)(3)(2)(1)' 
		movwf	wordlen		; wordlen is 16 bits. Reg is actually 12 bits
		CALL	SPIRX		; CALL SPI read 16 bit word data will be in 
		
		return		
W_APGain:	
		movlw	B'10001011'	; command to write to apgain register 
		movwf	spi		; call spi control write to apgain reg
		movlw	D'16'		; number of bits
		movwf	wordlen
		CALL	SPIDX		; output outd1 and outd2 to 7756
		return
; -----------------------------------------------------------------------------------
CorrectCH2:
;;;做成百分比可设
 		bsf	CorrCH2
		movlw	high TriScope
 		movwf	PWM_HI
		movlw	low TriScope
 		movwf	PWM_LOW		;11 11111111

		movlw	D'4'
		movwf	SBL
		goto	PRE_DELAY

; -----------------------------------------------------------------------------------
; 步进校准

StepCorrect:
		bcf	isCR_1OS
		movlw	H'01'
		xorwf	SDATA,W
		btfsc	_Z
		goto	CR_offset

		movlw	H'02'
		xorwf	SDATA,W
		btfsc	_Z
		goto	CR_vallue

		return

CR_offset:
		movlw	H'01'
		xorwf	(SDATA+1),W
		btfsc	_Z
		goto	CR_offset1

		movlw	H'02'
		xorwf	(SDATA+1),W
		btfsc	_Z
		goto	CR_offset2

		return

CR_offset1:				; correct CH1 offset
		bsf	isCR_1OS
		
		bsf	STATUS,RP0		; select page 1
		bcf 	PIE1,TMR1IE 		; disable Timer1中断
		bcf	STATUS,RP0		; select page 1
;read out APGain
		call	ReadAPGain
		movf	insd1,W
		movwf	(BFIIC+6)	; APGain先保存起来 
		movf	insd2,W
		movwf	(BFIIC+7)
		clrf	outd2		; clear APGain
		clrf	outd1
		call	W_APGain
		I2C_WR_SUB    0x02, outd1, AT_APGAIN

		bsf	_BANK1
		clrf	APGAIN1_LOW
		clrf	APGAIN1_HI
		bcf	_BANK1
			
		
		movf	(SDATA+2),W
		btfsc	_Z
		goto	CRT0		;等于0,读出没有APGain的波形值即可
		
;read out CH1OS
		movlw	B'00001000'
		movwf	spi		; call spi control read
		movlw	b'00000001'	; number of bytes to download B'000(5)(4)(3)(2)(1)' 
		movwf	wordlen		; wordlen is 8 bits.
		CALL	SPIRX		; read out to insd1

		btfss	(SDATA+2),7
		goto	set1a
; --------------------------------------------------------------------
; 是负值,使失调值往负的方向走
		btfss	insd1,5
		goto	set0a
;失调值为负
		movlw	B'00011111'
		andwf	insd1,F		;变正
		movf	(SDATA+2),W
		andlw	B'01111111'
		addwf	insd1,W
		iorlw	B'00100000'	;置符号位
		goto	set1b

;失调值为正
set0a:		
		movf	(SDATA+2),W
		andlw	B'01111111'
		subwf	insd1,W
		btfss	_Z
		goto	FZ1		;FZ means Fu(负) Zheng(正)
		movlw	H'00'		;相等
		goto	set1b
FZ1:
		btfsc	_C
		goto	set1b		;老的失调值大
;校正值大于失调值
;如果为负数,应变成有符号的原码
		movwf	insd1
		comf	insd1,F
		incf	insd1,W
		iorlw	B'00100000'	;置符号位
		goto	set1b

; --------------------------------------------------------------------
; 是正值,使失调值往正的方向走
set1a:
		btfss	insd1,5
		goto	ZZ1
;失调值为负
		movlw	B'00011111'
		andwf	insd1,F		;变正
		movf	(SDATA+2),W
		subwf	insd1,W
		btfss	_Z
		goto	ZF1
		movlw	H'00'		;相等
		goto	set1b
ZF1:
		btfsc	_C
		goto	ZF11		;老的失调绝对值大

;校正绝对值大于失调绝对值:减完后变正值了。例:-3减去4=+1
		movf	insd1,W
		subwf	(SDATA+2),W
		goto	set1b
ZF11:
		iorlw	B'00100000'	;置符号位
		goto	set1b

ZZ1:		
		movf	(SDATA+2),W
		addwf	insd1,W
set1b:
		movwf	outd1		
		movlw	B'10001000'
		movwf	TEMP
		call	W_CHxOS

		I2C_WR_SUB    0x01, outd1, AT_CH1OS	; 失调值写入外存
		goto	CRT0				;等于0,读出没有APGain的波形值即可

CR_offset2:						; correct CH2 offset
		bcf	isCR_1OS

		bsf	STATUS,RP0			; select page 1
		bcf 	PIE1,TMR1IE 			; disable Timer1中断
		bcf	STATUS,RP0			; select page 1

		movf	(SDATA+2),W
		btfsc	_Z
		goto	CRT1				;等于0,读出当前微调电阻下的波形值即可

;read out CH2OS
		movlw	B'00001001'
		movwf	spi		; call spi control read
		movlw	b'00000001'	; number of bytes to download B'000(5)(4)(3)(2)(1)' 
		movwf	wordlen		; wordlen is 8 bits.
		CALL	SPIRX		; read out to insd1

		btfss	(SDATA+2),7
		goto	set2a
; --------------------------------------------------------------------
; 是负值,使失调值往负的方向走
		btfss	insd1,5
		goto	set3a
;失调值为负
		movlw	B'00011111'
		andwf	insd1,F		;变正
		movf	(SDATA+2),W
		andlw	B'01111111'
		addwf	insd1,W
		iorlw	B'00100000'	;置符号位
		goto	set2b

;失调值为正
set3a:		
		movf	(SDATA+2),W
		andlw	B'01111111'
		subwf	insd1,W
		btfss	_Z
		goto	FZ2
		movlw	H'00'		;相等
		goto	set2b
FZ2:
		btfsc	_C
		goto	set2b		;老的失调值大
;校正值大于失调值
;如果为负数,应变成有符号的原码
		movwf	insd1
		comf	insd1,F
		incf	insd1,W
		iorlw	B'00100000'	;置符号位
		goto	set2b

; --------------------------------------------------------------------
; 是正值,使失调值往正的方向走
set2a:
		btfss	insd1,5
		goto	ZZ2
;失调值为负
		movlw	B'00011111'
		andwf	insd1,F		;变正
		movf	(SDATA+2),W
		subwf	insd1,W
		btfss	_Z
		goto	ZF2
		movlw	H'00'		;相等
		goto	set2b
ZF2:
		btfsc	_C
		goto	ZF21		;老的失调绝对值大

;校正绝对值大于失调绝对值:减完后变正值了。例:-3减去4=+1
		movf	insd1,W
		subwf	(SDATA+2),W
		goto	set2b
ZF21:
		iorlw	B'00100000'	;置符号位
		goto	set2b

ZZ2:		
		movf	(SDATA+2),W
		addwf	insd1,W
set2b:
		movwf	outd1		
		movlw	B'10001001'
		movwf	TEMP
		call	W_CHxOS

		I2C_WR_SUB    0x01, outd1, AT_CH2OS	; 失调值写入外存
CRT1:		
;给的是旧值
		movf	V_sample_low,W
		movwf	SDATA
		movf	V_sample_middle,W
		movwf	(SDATA+1)
		movf	V_sample_high,W
		movwf	(SDATA+2)
		goto	CRT2

CR_vallue:
		movlw	H'01'
		xorwf	(SDATA+1),W
		btfss	_Z
		return

; correct CH1 vallue
		bsf	STATUS,RP0		; select page 1
		bcf 	PIE1,TMR1IE 		; disable Timer1中断
		bcf	STATUS,RP0		; select page 1

		movf	(SDATA+2),W
		btfsc	_Z
		goto	CRT0		;等于0,读出当前APGain下的波形值即可
;read out APGain
		call	ReadAPGain

		btfss	(SDATA+2),7
		goto	CRV1
;是负值,转换为12位补码
		movlw	B'00001111'
		movwf	TEMP
		movlw	B'01111111'
		andwf	(SDATA+2),F
		comf	(SDATA+2),F
		incf	(SDATA+2),F
		goto	CRV2
CRV1:
		clrf	TEMP
CRV2:
		movf	(SDATA+2),W
		addwf	insd1,W
		movwf	outd1		
	bsf	_BANK1
	movwf	APGAIN1_LOW
	bcf	_BANK1

		btfss	_C
		goto	CRV3		;无进位
		incf	insd2,F
		movlw	B'00001111'
		andwf	insd2,F		;‘与’掉高半字节的进位

CRV3:
		movf	TEMP,W
		addwf	insd2,F
		movlw	B'00001111'
		andwf	insd2,W		;‘与’掉高半字节的进位
		
		movwf	outd2
	bsf	_BANK1
	movwf	APGAIN1_HI
	bcf	_BANK1
		call	W_APGain

		I2C_WR_SUB    0x02, outd1, AT_APGAIN
CRT0:
		CALL	ReadWafeForm

		movf	insd1,W
		movwf	SDATA
		movf	insd2,W
		movwf	(SDATA+1)
		movf	insd3,W
		movwf	(SDATA+2)
		
CRT2:
		btfss	isCR_1OS	;是CH1的失调校正?
		goto	CRT3
		movf	(BFIIC+6),W	;yes,恢复APGain
		movwf	outd1
		movf	(BFIIC+7),W
		movwf	outd2
		call	W_APGain
		I2C_WR_SUB    0x02, outd1, AT_APGAIN
		
CRT3:
		bsf	STATUS,RP0		; select page 1
		bsf 	PIE1,TMR1IE 		; enable Timer1中断
		bcf	STATUS,RP0		; select page 1

		movlw	D'5'
		movwf	SBL
		goto	REPLY_OK

; -----------------------------------------------------------------------------------
ClearREG:
		bsf	STATUS,RP0		; select page 1
		bcf 	PIE1,TMR1IE 		; enable Timer1中断
		bcf	STATUS,RP0		; select page 1

		clrf	outd1
		clrf	outd2		; clear APGain
		movlw	B'10001000'
		movwf	TEMP
		call	W_CHxOS

		call	W_APGain
		I2C_WR_SUB    0x02, outd1, AT_APGAIN
		bsf	_BANK1
		clrf	APGAIN1_LOW
		clrf	APGAIN1_HI
		bcf	_BANK1

		movlw	B'10001001'
		movwf	TEMP
		call	W_CHxOS
		bsf	STATUS,RP0		; select page 1
		bsf 	PIE1,TMR1IE 		; enable Timer1中断
		bcf	STATUS,RP0		; select page 1

;清除7756校准参数区
		clrf	BFIIC
		clrf	(BFIIC+1)
		clrf	(BFIIC+2)
		clrf	(BFIIC+3)
;		clrf	(BFIIC+4)
;		clrf	(BFIIC+5)
;		clrf	(BFIIC+6)
;		clrf	(BFIIC+7)
	I2C_WR_SUB    0x08, BFIIC, AT_CH1OS
		bsf	STATUS,RP0
		bsf	WP_TRIS		;change input
		bcf	STATUS,RP0
		bsf	WP

		movlw	D'2'
		movwf	SBL
		goto	REPLY_OK

; -----------------------------------------------------------------------------------
;数据巡采
CollectData:
;;;		movlw	I_Waveform1	;平均值

;**************************************************
	bsf	STATUS,RP0		; select page 1
	bcf 	PIE1,TMR1IE 		; disable Timer1中断
	bcf	STATUS,RP0		; select page 1

	movlw	RB0_I1			;立即值
		movwf	I
		movlw	DI0
		movwf	J
		movlw	D'3'
		movwf	tempCount
		call	S1_S0

;;;		movlw	V_Waveform1
	movlw	RB0_V1			;立即值
		movwf	I
		movlw	(DI0+3)
		movwf	J
		movlw	D'3'
		movwf	tempCount
		call	S1_S0
	bsf	STATUS,RP0		; select page 1
	bsf 	PIE1,TMR1IE 		; disable Timer1中断
	bcf	STATUS,RP0		; select page 1
;**************************************************

;配置状态字
		clrf	(DI0+6)
		clrw

		btfsc	BattOn
		bsf	(DI0+6),7
		btfsc	disCharging
		movlw	B'00100000'
		btfsc	Charging
		movlw	B'00110000'
		btfsc	Standing
		movlw	B'01000000'
		btfsc	CMD_Stop
		movlw	B'01100000'
		
		btfss	OverTermTime		;超时?
		goto	CL1
		movlw	B'01110000'
		iorlw	B'00001100'
CL1:		
		btfss	OverCapacity
		goto	CL2
		movlw	B'01110000'
		iorlw	B'00001000'
		
;************************************************
;	bit7		=1/0	有/无电池	*	
;当前工作状态指示				*
;	bit6 bit5 bit4	=000			*
;			=010	放电		*
;			=011	充电		*
;			=100	静置		*
;			=110	命令停止	*
;			=111	异常中止	*
;当前错误状态指示				*
;	bit3 bit2	=00	电流异常	*
;			=01	电压异常	*
;			=10	超时		*
;			=11			*
;	bit1		=1/0	7756已/未 校准	*
;	bit0		=1/0			*	
;************************************************
CL2:
		iorwf	(DI0+6),F

		movlw	D'7'
		movwf	SBL
		goto	PRE_DELAY
; -----------------------------------------------------------------------------------
;设置点号:	5位设备号+1位通道号(BCD码)
SetDeviceNO:
		bsf	STATUS,RP0		; bank 1
		bcf	WP_TRIS			; MOT re_set to output
		bcf	STATUS,RP0		; bank 0
		bcf	WP
	I2C_WR_SUB    0x03, DI0, AT_DeviceNO
		btfss	Txmt_Success
		return

;写EEPROM正确,才能回送
		movlw	D'0'
		movwf	SBL
;		goto	REPLY_OK
; -----------------------------------------------------------------------------------
; 数据填充之后的应答帧
PRE_DELAY:
		call	DELAY10ms

REPLY_OK:
	I2C_READ_SUB    0x03, A0, AT_DeviceNO
		
		bsf	PCLATH,3		; Prog page 1
		goto	Transmit
OK_OUT:		
		return
; ---------------------------------------------------------------------------------------------
; 写工作模式寄存器
WriteMODE:		
		movlw	B'10000110'	; command to write to mode register 
		movwf	spi		; call spi control write to mode reg
		movlw	D'16'		; number of bits
		movwf	wordlen
		CALL	SPIDX		; output outd1 and outd2 to 7756
		return

⌨️ 快捷键说明

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