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

📄 cmd6.asm

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

; ***********************************************************************************************
; 命令处理模块

CMD:
		bcf	aFRAME
		
		bsf	PCLATH,3		; Prog page 1
		call	CHECKSUM
		bcf	PCLATH,3		; Prog page 0
		movwf	TEMP
		movf	SBL,W
		addlw	DI0
		movwf	FSR
		movf	INDF,W
		subwf	TEMP,W
		btfss	STATUS,Z
		return			;累加和不等
		
		movlw	A0	
		movwf	FSR
		movlw	.3
		movwf	J
CMD2:
		movf	INDF,W
		sublw	0xFF		;是全网广播?
		btfss	STATUS,Z
		goto	Command1
		incf	FSR,F
		decfsz	J,F
		goto	CMD2
		goto	Command2

Command1:						
; ----   读出通道号   ---------------------------------
	I2C_READ_SUB    0x03, (BFIIC+1), AT_DeviceNO

		movlw	.3
		movwf	J
		movlw	(BFIIC+1)
		movwf	FSR
IF_EQ:
		movf	INDF,W		;取出通道号
		andlw	0x0F
		movwf	TEMP
		movlw	B'01110000'
		xorwf	FSR,F		;21H-->61H 指向A0
		movf	INDF,W		;地址码->W
		andlw	0x0F
		subwf	TEMP,F
		btfss	STATUS,Z	;通道号比较
		goto	IF_0F

EQ1:				
		movlw	B'01110000'
		xorwf	FSR,F		;61H-->21H 指向通道号low

		movf	INDF,W		;取出通道号
		andlw	0xF0
		movwf	TEMP
		movlw	B'01110000'
		xorwf	FSR,F		;21H-->61H 指向A0
		movf	INDF,W		;地址码->W
		incf	FSR,F		;指向A1
		andlw	0xF0
		subwf	TEMP,F
		btfss	STATUS,Z	;通道号比较
		goto	IF_F0
EQ10:		
		movlw	B'01110000'
		xorwf	FSR,F		;62H-->22H 指向通道号high
EQ1A:		
		decfsz	J,F
		goto	IF_EQ
		goto	Command2

IF_0F:		
		sublw	0x0F
		btfsc	STATUS,Z	;=统配符?
		goto	EQ1		;=
		return
IF_F0:		
		sublw	0xF0
		btfsc	STATUS,Z	;=统配符?
		goto	EQ10		;=
		return
; -----------------------------------------------------------------------------------
Command2:						;从站地址吻合或为广播发送
        	clrwdt

		movlw	0x01
		subwf	CCODE,W
		btfsc	STATUS,Z
		goto	READ_REPLY		;读数据

		movlw	0x08
		subwf	CCODE,W
		btfsc	STATUS,Z
		goto	CollectData		;数据巡采

		movlw	0x04
		subwf	CCODE,W
		btfsc	STATUS,Z
		goto	SET_REPLY		;写数据

		btfsc	BUTTON
		return			;编程允许键未按下(=1)为不允许编程

		movlw	0x0A
		subwf	CCODE,W
		btfsc	STATUS,Z
		goto	SetDeviceNO

		return
; -----------------------------------------------------------------------------------
;读数据
READ_REPLY:		
		movlw	0x95
		subwf	DI1,W
		btfsc	STATUS,Z
		goto	FILL95

		movlw	0xA3
		subwf	DI1,W
		btfsc	STATUS,Z
		goto	FILLA3

		return
; -----------------------------------------------------------------------------------
FILL95:
		movlw	0x10
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	ReadCH1

		movlw	0x11
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	ReadCH2

		return
;单独读取通道值时,回送立即值		
ReadCH1:		
		movlw	RB0_I1
		goto	RC
ReadCH2:
		movlw	RB0_V1
RC:		
		movwf	I
		movlw	SDATA
		movwf	J
		movlw	D'3'
		movwf	tempCount
		call	S1_S0
		
		movlw	D'5'
		movwf	SBL
		goto	PRE_DELAY
		
; -----------------------------------------------------------------------------------
FILLA3:
		movlw	0x1F
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	ReadREG

		movlw	0x20
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	ReadDeviceNO

		return
ReadREG:
		bsf	STATUS,RP0		; select page 1
		bcf 	PIE1,TMR1IE 		; disable Timer1中断
		bcf	STATUS,RP0		; select page 1
;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
		movf	insd1,W
		movwf	SDATA

;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
		movf	insd1,W
		movwf	(SDATA+1)

;read out APGain
		call	ReadAPGain
		movf	insd1,W
		movwf	(SDATA+2)	
		movf	insd2,W
		movwf	(SDATA+3)
;;;
;	bsf	_BANK1
;	movf	APGAIN1_LOW,W
;	bcf	_BANK1
;	movwf	(SDATA+2)	
;	bsf	_BANK1
;	movf	APGAIN1_HI,W
;	bcf	_BANK1
;	movwf	(SDATA+3)

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

		movlw	D'6'
		movwf	SBL
		goto	PRE_DELAY
		
ReadDeviceNO:
		movlw	D'2'
		movwf	SBL
		goto	PRE_DELAY
		
; -----------------------------------------------------------------------------------
;写数据
SET_REPLY:
		bsf	STATUS,RP0		; bank 1
		bcf	WP_TRIS			; MOT re_set to output
		bcf	STATUS,RP0		; bank 0
		bcf	WP

		movlw	0xA0
		subwf	DI1,W
		btfsc	STATUS,Z
		goto	SETA0

		movlw	0xA3
		subwf	DI1,W
		btfsc	STATUS,Z
		goto	Correct7756

		return
; -----------------------------------------------------------------------------------
SETA0:
		movlw	0x12
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	SetDisCharge

		movlw	0x14
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	SetCharge

		movlw	0x18
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	SetStandby

		movlw	0x20
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	SetTerminate

		movlw	0x21
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	SetStart

		return
; -----------------------------------------------------------------------------------
SetCharge:
		clrf	LoadOn
		bcf	OverCapacity
		bsf	CMD_Charge
		bcf	OverTermTime		;清除超时标志

		I2C_WR_SUB    0x08, SDATA, AT_Current
		I2C_WR_SUB    0x06, (SDATA+8), (AT_Current+8)
;
;	I2C_READ_SUB    0x08, BFIIC, AT_Current
;	nop
;	nop
;	I2C_READ_SUB    0x06, BFIIC, (AT_Current+8)
;	nop	
		movlw	SDATA
		movwf	I
		movlw	Current_LOW
		movwf	J
		movlw	D'11'		;未传截止容量
		movwf	tempCount
		call	S0_S1

		movf	(SDATA+D'14'),W
		bsf	_BANK1
		movwf	J_H
		bcf	_BANK1

		movlw	D'2'
		movwf	SBL
		goto	REPLY_OK
; -----------------------------------------------------------------------------------
SetDisCharge:
		clrf	LoadOn
		bcf	OverCapacity
		bsf	CMD_DisCharge
		bcf	OverTermTime		;清除超时标志

		I2C_WR_SUB    0x03, SDATA, AT_Current
		I2C_WR_SUB    0x03, (SDATA+3),AT_DisCHTermV
		I2C_WR_SUB    0x02, (SDATA+6),AT_TerminalT

		movlw	SDATA
		movwf	I
		movlw	Current_LOW
		movwf	J
		movlw	D'3'
		movwf	tempCount
		call	S0_S1

		movlw	(SDATA+3)
		movwf	I
		movlw	DisCHTermV_LOW
		movwf	J
		movlw	D'3'
		movwf	tempCount
		call	S0_S1

		movlw	(SDATA+6)
		movwf	I
		movlw	TerminalT_LOW
		movwf	J
		movlw	D'2'
		movwf	tempCount
		call	S0_S1

		movlw	D'2'
		movwf	SBL
		goto	REPLY_OK
; -----------------------------------------------------------------------------------
SetStandby:
		bcf	OverCapacity
		bsf	PCLATH,3		; Prog page 1
		call	ClosePWM		; 没有流程,暂关PWM
		bcf	PCLATH,3		; Prog page 0
		clrf	C_LowerTerm
		bsf	CH			; close 充电控制
		bsf	DISCH			;close 放电控制
		btfss	BattOn
		goto	SS1	
		bsf	RedLed			;有电池亮桔灯
		bsf	GreenLed	
SS1:
		I2C_WR_SUB    0x01, SDATA, AT_HandleTime	; 失调值写入外存

		movf	SDATA,W
		bsf	STATUS,RP0
		movwf	StandBy
		bcf	STATUS,RP0		; select page 1

		clrf	LoadOn
		clrf	WorkFlag
		bsf	Standing
		bcf	OverTermTime		;清除超时标志
		
		clrf	Minutes
		
		movlw	D'2'
		movwf	SBL
		goto	REPLY_OK
; -----------------------------------------------------------------------------------
; 停止流程
SetTerminate:
		bsf	CMD_Stop

		bsf 	PCLATH,3
		call	ClosePWM
		bcf 	PCLATH,3

		movlw	0x43		;ASCII 'C'
		xorwf	SDATA,W
		btfss	_Z
		goto	ST0
		bsf	OverCapacity
		goto	ST2
ST0:		
		bcf	OverCapacity
ST2:
		bsf	CH
		bsf	DISCH
		
		btfss	BattOn
		goto	ST1			
		bsf	RedLed		;有电池亮桔灯
		bsf	GreenLed	
ST1:
		clrf	WorkFlag

		movlw	D'3'
		movwf	SBL
		goto	PRE_DELAY
; -----------------------------------------------------------------------------------
; 启动流程
SetStart:
;		bsf	CMD_Start
		bcf	CMD_Stop
		bcf	OverCapacity

		movlw	D'2'
		movwf	SBL
		goto	PRE_DELAY
; ***********************************************************************************
Correct7756:
		movlw	0x10
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	CorrectCH1OS

		movlw	0x11
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	CorrectCH1

		movlw	0x12
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	CorrectCH2

		movlw	0x13
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	CorrectCH2OS

		movlw	0x1A
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	StepCorrect

		movlw	0x1F
		subwf	DI0,W
		btfsc	STATUS,Z
		goto	ClearREG

		return

; -----------------------------------------------------------------------------------
; 通道1失调校正

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

;first clear CH1OS
		clrf	outd1
		movlw	B'10001000'	; command to write to ch1os 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 
		I2C_WR_SUB 0x01, outd1, AT_CH1OS
;clear APGain
;		clrf	outd1
		clrf	outd2
		call	W_APGain
		I2C_WR_SUB 0x02, outd1, AT_APGAIN
		bsf	_BANK1
		clrf	APGAIN1_LOW
		clrf	APGAIN1_HI
		bcf	_BANK1

		movlw	low MODE_INIT
		iorlw	B'00000001'
		movwf	outd1		; lower eight bits
		movlw	high MODE_INIT
		andlw	B'11011111'	; change to CH1
		iorlw	B'01000001'	; 内部短接模拟地CH1与AGND
		movwf	outd2		; higher eight bits
		call	WriteMODE

		CALL	ReadWafeForm
;
		goto	CT2

; -----------------------------------------------------------------------------------
; 通道2失调校正

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

;first clear CH2OS
		clrf	outd1
		movlw	B'10001001'	; command to write to ch2os register 
		movwf	spi		; call spi control write to ch2os reg
		movlw	D'8'		; number of bits
		movwf	wordlen
		CALL	SPIDX		; output outd1 to 7756
		I2C_WR_SUB 0x01, outd1, AT_CH2OS

		movlw	low MODE_INIT
		iorlw	B'00000001'
		movwf	outd1		; lower eight bits
		movlw	high MODE_INIT
		andlw	B'11111110'	; 内部短接模拟地CH2与AGND
		iorlw	B'01100010'	; 内部短接模拟地CH2与AGND
		movwf	outd2		; higher eight bits
		call	WriteMODE

		CALL	ReadWafeForm
;
CT2:
;失调值送给手抄器
		movf	insd1,W
		movwf	SDATA
		movf	insd2,W
		movwf	(SDATA+1)
		movf	insd3,W
		movwf	(SDATA+2)

; 恢复工作寄存器
		movlw	low MODE_INIT
		movwf	outd1		; lower eight bits
		movlw	high MODE_INIT
		movwf	outd2		; higher eight bits
		call	WriteMODE
		bcf	Mode_0CH1_1CH2
;
		bsf	STATUS,RP0		; select page 1
		bsf 	PIE1,TMR1IE 		; enable Timer1中断
		bcf	STATUS,RP0		; select page 1

⌨️ 快捷键说明

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