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

📄 f6.asm

📁 用PIC单片机18F6520+ADE7755实现的一个大安培、锂离子电池的化程器。全部源码
💻 ASM
📖 第 1 页 / 共 4 页
字号:
		btfss	STATUS,C
		goto	PI1
		bsf	SEC1
		clrf	C_SEC			; 记满20是1秒
		
PI1:
;正在接收标志是否超时
		btfss	RECEIVING
		goto	PT2
;正在接收
		incf	OVERTIME,F
		movlw	RevTime
		subwf	OVERTIME,W		;OVERTIME-RevTime->W
		btfss	STATUS,C
		goto	PT2
		bcf	RECEIVING		;若ByteReceived<>0持续 RevTime则中断该次通信
		clrf	OVERTIME
		clrf	ByteReceived
		call	TxmtFinished

PT2:
; ******************************************************************************************
		bsf	STATUS,RP0		; select page 1
		bcf 	PIE1,TMR1IE 		; disable Timer1中断
		bcf	STATUS,RP0		; select page 1
		movlw	RB0_I1
		movwf	I
		movlw	I_sample_low
		movwf	J
		movlw	D'6'
		movwf	tempCount
		bcf	PCLATH,3		; Prog page 0
		call	S1_S0
		bsf	PCLATH,3		; Prog page 1
		bsf	STATUS,RP0		; select page 1
		bsf 	PIE1,TMR1IE 		; enable Timer1中断
		bcf	STATUS,RP0		; select page 1

;累加I
		call	DataAdded_I
;累加V
		call	DataAdded_V
		incf	VI_CSamp,F

 		btfsc	CorrCH2
		goto	RI1
		btfsc	DetectBatt
		goto	TV1
;------------------------------------------ 		
ACTION:
		btfsc	Charging
		goto	Charg
		btfsc	disCharging
		goto	DisCharg
;
		goto	PT_OUT			;没有流程
		
; --------------------------------------------------------------------
Charg:
		bsf	_BANK1
		movf	J_H,W	
		bcf	_BANK1
		movwf	TEMP
		movlw	0x48
		xorwf	TEMP,W
		btfsc	_Z
		goto	CG		; 恒压电压,
		movlw	0x4A
		xorwf	TEMP,W
		btfsc	_Z
		goto	ConvertV	; 截止电压
		goto	CG		; 谁也不是

ConvertV:		
		bsf	_BANK1
		movf	ConstantV_HI,W
		subwf	V_Waveform3,W		; 比较大小
		bcf	_BANK1
		btfss	_Z
		goto	CA4
;V_Waveform3 = ConstantV_HI
		bsf	_BANK1
		movf	ConstantV_MID,W
		subwf	V_Waveform2,W	; 比较大小
		bcf	_BANK1
		btfsc	_Z
		goto	CNM
		btfsc	_C
		goto	CompleteCharge2
		goto	CA4
		
CNM:		
;V_Waveform2 >= ConstantV_MID
		bsf	_BANK1
		movf	ConstantV_LOW,W
		subwf	V_Waveform1,W		; 比较大小
		bcf	_BANK1
		btfss	_Z
		goto	CNN
		goto	CompleteCharge2		
CNN:
		btfsc	_C
		goto	CompleteCharge2
		goto	CA4
;不是化成(截止电压)
CG:
		movlw	StartDelay	
		subwf	SecsPassed,W
		btfss	_C
		goto	CA2
		btfss	Pass_1s		;StartDelay之后,每秒判一次
		goto	CA2
		bcf	Pass_1s

		bsf	STATUS,RP0
		movf	I_Waveform3,W	
		bcf	STATUS,RP0
		btfss	_Z
		goto	CA3

		bsf	STATUS,RP0
		movf	ChargeTermI_MID,W	
		subwf	I_Waveform2,W	; Δ = I_Waveform2 - ChargeTermI_MID
		bcf	STATUS,RP0
		btfsc	_Z
		goto	CompleteCharge
		btfsc	_C
		goto	CA3
;小于截止电流
;先认为第二字节相等即可,以后也要判Δ在一个范围内
CompleteCharge:
		incf	C_LowerTerm,F
		movlw	C_arrived
		subwf	C_LowerTerm,W
		btfss	_C
		goto	CA2
CompleteCharge2:
; ----	占空比置为 0
		call	ClosePWM
		clrf	C_LowerTerm
		
		bsf	CH
		bsf	DISCH
		bsf	RedLed			;有电池亮桔灯
		bsf	GreenLed
		bcf	CMD_Charge		;写回24c02

		bcf	Charging
;		bsf	Standing		;置静置标志
		clrf	Minutes

		goto	PT_OUT

; 大于截止电流,继续判断 Δ 在那个范围内
CA3:
		clrf	C_LowerTerm
;实测电流跟随化成电流
CA2:
;到截止/恒压电压?
		bsf	_BANK1
		movf	ConstantV_HI,W
		bcf	_BANK1
		subwf	V_sample_high,W		; 比较大小
		btfss	_Z
		goto	CV
;V_sample_high = ConstantV_HI
		bsf	_BANK1
		movf	ConstantV_MID,W
		bcf	_BANK1
		subwf	V_sample_middle,W	; 比较大小
		btfss	_Z
		goto	CV
;V_sample_middle = ConstantV_MID
		bsf	_BANK1
		movf	ConstantV_LOW,W
		bcf	_BANK1
		subwf	V_sample_low,W		; 比较大小
		btfss	_Z
		goto	CAA
		goto	PT_OUT		
CAA:
		btfsc	_C
		goto	FineDec		;略大于4.2V:微调减小
		goto	FineInc		;略小于4.2V:微调增大
;恒压控制
CV:
		btfsc	_C
		goto	DEC_DutyCycle	;大于4.2V:粗调减小
;小于4.2V:恒流控制
CA4:
		bsf	STATUS,RP0
		movf	Current_LOW,W	
		bcf	STATUS,RP0
		movwf	KeepValue_LOW
		bsf	STATUS,RP0
		movf	Current_MID,W	
		bcf	STATUS,RP0
		movwf	KeepValue_MID
		bsf	STATUS,RP0
		movf	Current_HI,W	
		bcf	STATUS,RP0
		movwf	KeepValue_HI

		goto	JUDGE
; --------------------------------------------------------------------
; 放电
DisCharg:
		bsf	STATUS,RP0
		movf	Current_LOW,W	
		bcf	STATUS,RP0
		movwf	KeepValue_LOW
		bsf	STATUS,RP0
		movf	Current_MID,W	
		bcf	STATUS,RP0
		movwf	KeepValue_MID
		bsf	STATUS,RP0
		movf	Current_HI,W	
		bcf	STATUS,RP0
		movwf	KeepValue_HI

SC1:
; 是否小于截止电压?
		movlw	V_StartDelay
		subwf	SecsPassed,W
		btfss	_C
		goto	SC3
;		btfss	Pass_1s		;StartDelay之后,每秒判一次
;		goto	JUDGE
;		bcf	Pass_1s


		bsf	STATUS,RP0
		movf	DisCHTermV_HI,W	
		subwf	V_Waveform3,W
		bcf	STATUS,RP0
		btfss	_Z
		goto	SC0

		bsf	STATUS,RP0
		movf	DisCHTermV_MID,W	
		subwf	V_Waveform2,W
		bcf	STATUS,RP0

		btfsc	_Z
		goto	CompleteDisC
		btfsc	_C
		goto	SC3
		goto	CompleteDisC

SC0:		btfsc	_C
		goto	SC3
CompleteDisC:		
;V_sample小于截止电压
;先认为第二字节相等即可,以后也要判Δ在一个范围内
		call	ClosePWM

		bsf	CH
		bsf	DISCH
		bsf	RedLed			;有电池亮桔灯
		bsf	GreenLed

		bcf	CMD_DisCharge
		bcf	disCharging
		clrf	Minutes

		goto	PT_OUT

SC3:
;是放电流程,实测电流跟随放电电流
		clrf	C_LowerTerm
; --------------------------------------------------------------------
JUDGE:		
		movf	KeepValue_HI,W
		subwf	I_sample_high,W		; 比较大小
		btfsc	_Z
		goto	AT30
		btfsc	_C
		goto	AT20B
;I_sample_high小		
;	movf	I_sample_high,W
;	subwf	KeepValue_HI,W
;	movwf	insd3
;	movlw	D'2'
;	subwf	insd3,W
;	btfsc	_C
;	goto	INC_DutyCycle	;高字节误差 >= 2
;W=1
		movf	I_sample_low,W
		subwf	KeepValue_LOW,W
		movwf	insd1
		btfsc	_C
		goto	JG10
		movlw	D'1'
		subwf	KeepValue_MID,F
		btfsc	_C
		goto	JG10
		movlw	D'1'
		subwf	KeepValue_HI,F
JG10:		
		movf	I_sample_middle,W
		subwf	KeepValue_MID,W
		movwf	insd2
		btfsc	_C
		goto	JG20
		movlw	D'1'
		subwf	KeepValue_HI,F
JG20:		
		movf	I_sample_high,W
		subwf	KeepValue_HI,W
		movwf	insd3
		btfss	_Z
		goto	INC_DutyCycle	;高字节误差 >= 2
		movf	insd2,W
		goto	AT30A
;I_sample_high大		
AT20B:		
		movf	KeepValue_LOW,W
		subwf	I_sample_low,W
		movwf	insd1
		btfsc	_C
		goto	JG30
		movlw	D'1'
		subwf	I_sample_middle,F
		btfsc	_C
		goto	JG30
		movlw	D'1'
		subwf	I_sample_high,F
JG30:		
		movf	KeepValue_MID,W
		subwf	I_sample_middle,W
		movwf	insd2
		btfsc	_C
		goto	JG40
		movlw	D'1'
		subwf	I_sample_high,F
JG40:		
		movf	KeepValue_HI,W
		subwf	I_sample_high,W
		movwf	insd3
		btfss	_Z
		goto	DEC_DutyCycle	;高字节误差 >= 2
		movf	insd2,W
		goto	AT30B1
		
AT30:		
		movf	KeepValue_MID,W
		subwf	I_sample_middle,W		; 比较大小
		btfsc	_Z
		goto	AT40
		btfsc	_C
		goto	AT30B
;I_sample_middle小		
AT30C:
		movf	I_sample_low,W
		subwf	KeepValue_LOW,W	; KeepValue_LOW - I_sample_low
		movwf	insd1		; backup
		btfsc	_C
		goto	JD30
		incf	I_sample_middle,W
		goto	JD31
JD30:		
		movf	I_sample_middle,W
JD31:		
		subwf	KeepValue_MID,W		; 比较大小
		movwf	insd2		; backup
AT30A:		
		btfsc	_Z
		goto	AT40A		; insd2 = 0
;		
		sublw	high FineADJ	; FineADJ(高字节) - Δ
		btfss	_Z
		goto	AT3_3
		
		movf	insd1,W
		sublw	low FineADJ	; FineADJ(高字节) - Δ
AT3_3:		
		btfsc	_C
		goto	FineInc	; FineADJ >= insd2,微调
; FineADJ < insd2,粗调,
;		goto	INC_DutyCycle
		btfss	TopPoint
		goto	INC_DutyCycle
		goto	PT_OUT
		
;I_sample_middle大
AT30B:		
		movf	KeepValue_LOW,W
		subwf	I_sample_low,W	; Δ = I_sample_low - KeepValue_LOW
		movwf	insd1		; backup
		btfsc	_C
		goto	JD32
		incf	KeepValue_MID,W
		goto	JD33
JD32:		
		movf	KeepValue_MID,W
JD33:		
		subwf	I_sample_middle,W		; 比较大小
		movwf	insd2		; backup
AT30B1:		
		btfsc	_Z
		goto	AT40B		; insd2 = 0
;		
		sublw	high FineADJ	; FineADJ(高字节) - Δ
		btfss	_Z
		goto	AT3_4
		
		movf	insd1,W
		sublw	low FineADJ	; FineADJ(高字节) - Δ
AT3_4:		
		btfsc	_C
		goto	FineDec	; FineADJ >= insd2,微调
; FineADJ < insd2,粗调,
		goto	DEC_DutyCycle
AT40:		
		movf	KeepValue_LOW,W
		subwf	I_sample_low,W	; Δ = I_sample_low - KeepValue_LOW
		movwf	insd1		; backup
		btfsc	_Z
		goto	PT_OUT		; Δ = 0
		btfsc	_C
		goto	AT40B
;I_sample_low小		
		comf	insd1,W
		addlw	D'1'
		movwf	insd1
AT40A:	
		movf	insd1,W
		sublw	Accord		; Accord - Δ
		btfsc	_C
		goto	PT_OUT		; Accord >= Δ
		goto	FineInc		; Accord < Δ
		
;I_sample_low大
AT40B:		
		movf	insd1,W
		sublw	Accord		; Accord - Δ
		btfsc	_C
		goto	PT_OUT		; Accord >= Δ
;		goto	FineDec		; Accord < Δ
; -----------------------------------------------
;占空比微减
FineDec:	
		movf	ResistNet,W
		btfsc	_Z
		goto	FD3		; =0,要向DC借位
		decf	ResistNet,F
		movlw	B'00000011'
		andwf	ResistNet,F

		btfsc	ResistNet,0
		goto	FD0
		bsf	STATUS,RP0
		bcf	TRISA,0
		bcf	STATUS,RP0
		goto	FD1
FD0:		
		bsf	STATUS,RP0
		bsf	TRISA,0
		bcf	STATUS,RP0
FD1:
		btfsc	ResistNet,1
		goto	FD2
		bsf	STATUS,RP0
		bcf	TRISA,1
		bcf	STATUS,RP0
		goto	PT_OUT
FD2:		
		bsf	STATUS,RP0
		bsf	TRISA,1
		bcf	STATUS,RP0
		goto	PT_OUT
FD3:
		movlw	B'00000011'
		movwf	ResistNet
		bsf	STATUS,RP0		; Bank 1
		bsf	R46_TRIS
		bsf	R47_TRIS
		bcf	STATUS,RP0		; bank 0
		goto	DEC_DutyCycle	;减高十位
; -----------------------------------------------
;占空比微增
FineInc:	
		incf	ResistNet,F
		movlw	B'00000011'
		andwf	ResistNet,F
		movf	ResistNet,W
		btfsc	_Z
		goto	FI3		; C=1,要向DC进位

		btfsc	ResistNet,0
		goto	FI0
		bsf	STATUS,RP0
		bcf	TRISA,0
		bcf	STATUS,RP0
		goto	FI1
FI0:		
		bsf	STATUS,RP0
		bsf	TRISA,0
		bcf	STATUS,RP0
FI1:
		btfsc	ResistNet,1
		goto	FI2
		bsf	STATUS,RP0
		bcf	TRISA,1
		bcf	STATUS,RP0
		goto	PT_OUT
FI2:		
		bsf	STATUS,RP0
		bsf	TRISA,1
		bcf	STATUS,RP0
		goto	PT_OUT
FI3:
		bsf	STATUS,RP0		; Bank 1
		bsf	R46_TRIS
		bsf	R47_TRIS
		bcf	STATUS,RP0		; bank 0
		goto	INC_DutyCycle
; --------------------------------------------------------------------
DEC_DutyCycle:
 		bcf	TopPoint

		movlw	D'1'
		subwf	PWM_LOW,F	;dec PWM_HI
 		btfsc	STATUS,C
 		goto	RI1		; C=1:>=
;
 		movf	PWM_HI,W
 		btfsc	STATUS,Z
 		goto	RR1
		decf	PWM_HI,F
		goto	RI1
RR1:
		clrf	PWM_LOW		;00 00000000送给CCPR1L两次
; 		bcf	TopPoint
		goto	RI1	
INC_DutyCycle:		
		movlw	D'1'
		addwf	PWM_LOW,F
		btfss	STATUS,C
		goto	RI1
		incf 	PWM_HI, F 	;inc PWM_HI                
					;now load the values into the Duty Cycle registers                 
		btfss	PWM_HI,2
		goto	RI1		
;PWM_HI=0
 		movlw	0x03		;11 11111111送给CCPR1L两次
		movwf	PWM_HI
		movlw	0xFF
		movwf	PWM_LOW		;11 11111111
		bsf	TopPoint
		goto	RI1	
; --------------------------------------------------------------------
TV1:

		movf	PWM_LOW,W
		btfss	_Z
		goto	TV1A
 		movf	PWM_HI,W
		btfss	_Z
		goto	TV1A

		bsf	STATUS,RP0
		movf	V_Start_LOW,W
		bcf	STATUS,RP0
		btfss	_Z
		goto	DT6
		bsf	STATUS,RP0
		movf	V_Start_MID,W
		bcf	STATUS,RP0
		btfss	_Z
		goto	DT6
		bsf	STATUS,RP0
		movf	V_Start_HI,W
		bcf	STATUS,RP0
		btfss	_Z
		goto	DT6

		movf	V_sample_low,W
		bsf	STATUS,RP0
		movwf	V_Start_LOW
		bcf	STATUS,RP0
		movf	V_sample_middle,W
		bsf	STATUS,RP0
		movwf	V_Start_MID
		bcf	STATUS,RP0
		movf	V_sample_high,W
		bsf	STATUS,RP0
		movwf	V_Start_HI
		bcf	STATUS,RP0
		goto	DT6
TV1A:
		movf	PWM_LOW,W
		xorlw	low HalfScope
		btfss	_Z
		goto	DT6
		movf	PWM_HI,W
		xorlw	high HalfScope
		btfss	_Z
		goto	DT6
		movf	V_sample_low,W
		bsf	STATUS,RP0
		movwf	V_Half_LOW
		bcf	STATUS,RP0
		movf	V_sample_middle,W
		bsf	STATUS,RP0
		movwf	V_Half_MID
		bcf	STATUS,RP0
		movf	V_sample_high,W
		bsf	STATUS,RP0
		movwf	V_Half_HI
		bcf	STATUS,RP0
DT6:		

⌨️ 快捷键说明

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