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

📄 f6.asm

📁 用PIC单片机18F6520+ADE7755实现的一个大安培、锂离子电池的化程器。全部源码
💻 ASM
📖 第 1 页 / 共 4 页
字号:
		bsf	STATUS,RP0
		movf	I_Waveform3,W
		bcf	STATUS,RP0
		btfss	_Z
		goto	IT1
		bsf	STATUS,RP0
		movf	I_Waveform2,W
		bcf	STATUS,RP0
		sublw	high I_Code	;high I_Code-I_sample_middle->W
		btfsc	_Z
		goto	DT9
		btfss	_C
		goto	IT1
		clrf	C_IVariety
		goto	DT9		; C=1:>
;I_Waveform2 > I_Code
IT1:
		incf	C_IVariety,F
		movlw	D'10'
		subwf	C_IVariety,W
		btfss	_C
		goto	DT9
;连续十次满足电流大于起始电流,认为有电池
		clrf	C_IVariety
DT7:		
		bcf	DetectBatt
		bsf	BattOn
		bsf	RedLed		;有电池亮桔灯
		bsf	GreenLed	
		
		goto	PT_OUT
DT9:	
		btfss	Rise_Down
		goto	Rise_INC
Down_DEC:
		movlw	D'1'
		subwf	PWM_LOW,F
 		btfsc	STATUS,C
 		goto	RRA
;
 		movf	PWM_HI,W
 		btfsc	STATUS,Z
 		goto	RR0
		decf	PWM_HI,F
		goto	RI1
RR0:
		clrf	PWM_LOW		;00 00000000送给CCPR1L两次
 		bcf	Rise_Down	;做上升波形
 		
		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	BATT
RRA:		
		btfss	_Z
 		goto	RI1
		movf	PWM_HI,W
 		btfss	_Z
 		goto	RI1
 		goto	RR0
		
Rise_INC:		
		movlw	D'1'
		addwf	PWM_LOW,F
		btfsc	STATUS,C
		incf 	PWM_HI, F 	;inc PWM_HI                
					;now load the values into the Duty Cycle registers                 
		movlw	high TriScope
		subwf	PWM_HI,W
		btfss	_Z
		goto	RI1	

		movlw	low TriScope
		subwf	PWM_LOW,W
		btfss	_Z
		goto	RI1	
;PWM_LOW =low TriScope
 		bsf	Rise_Down	;做下降波形
		movf	V_sample_low,W
		bsf	STATUS,RP0
		movwf	V_Full_LOW
		bcf	STATUS,RP0
		movf	V_sample_middle,W
		bsf	STATUS,RP0
		movwf	V_Full_MID
		bcf	STATUS,RP0
		movf	V_sample_high,W
		bsf	STATUS,RP0
		movwf	V_Full_HI
		bcf	STATUS,RP0

;对是否有电池的电压判断 		
BATT:
;高点与中点电压比较
	bsf	STATUS,RP0
		movf	V_Full_HI,W
		subwf	V_Half_HI,W
		btfsc	_Z		; 
		goto	HighEqual
		btfsc	_C		; 
		goto	Half_Large
Full_Large:
		movf 	V_Half_LOW,W
		subwf	V_Full_LOW,W
	bcf	STATUS,RP0
		movwf	insd1
	bsf	STATUS,RP0
		
		btfsc	_C
		goto	OL1
		incf	V_Half_MID,W
		goto	OL2
OL1:		
		movf 	V_Half_MID,W
OL2:		
		subwf	V_Full_MID,W
	bcf	STATUS,RP0
		movwf	insd2
	bsf	STATUS,RP0

		btfsc	_C
		goto	OL3
		incf	V_Half_HI,W
		goto	OL4
OL3:		
		movf 	V_Half_HI,W
OL4:		
		subwf	V_Full_HI,W
	bcf	STATUS,RP0
		movwf	insd3
;	bsf	STATUS,RP0

Compare:
;变化量放到 insd3,insd2,insd1
		movf	insd3,W
		btfss	_Z
		goto	RI1			; 最高字节不为零,直接跳到DT5
		movf	insd2,W
		btfsc	_Z
		goto	DT4			;Δ<1mV

		sublw	high V_Region		;电压的变化量与额定值比较
		btfsc	_Z
		goto	DT4
		btfsc	_C
		goto	DT4			;Δ<1mV
		goto	RI1

Half_Large:
		movf 	V_Full_LOW,W
		subwf	V_Half_LOW,W
	bcf	STATUS,RP0
		movwf	insd1
	bsf	STATUS,RP0
		
		btfsc	_C
		goto	OL5
		incf	V_Full_MID,W
		goto	OL6
OL5:		
		movf 	V_Full_MID,W
OL6:		
		subwf	V_Half_MID,W
	bcf	STATUS,RP0
		movwf	insd2
	bsf	STATUS,RP0

		btfsc	_C
		goto	OL7
		incf	V_Full_HI,W
		goto	OL8
OL7:		
		movf 	V_Full_HI,W
OL8:		
		subwf	V_Half_HI,W
	bcf	STATUS,RP0
		movwf	insd3
		goto	Compare
		
HighEqual:
		movf	V_Full_MID,W
		subwf	V_Half_MID,W
		btfsc	_Z		; 
		goto	DT4
		btfsc	_C		; 
		goto	Half_Large
		goto	Full_Large
; ------------------------------------------
DT4:	
	bsf	STATUS,RP0
		movf	V_Start_HI,W
		subwf	V_Half_HI,W
		btfsc	_Z		; 
		goto	HighEqual2
		btfsc	_C		; 
		goto	Half_Large2
Start_Large:
		movf 	V_Half_LOW,W
		subwf	V_Start_LOW,W
	bcf	STATUS,RP0
		movwf	insd1
	bsf	STATUS,RP0
		
		btfsc	_C
		goto	OL9
		incf	V_Half_MID,W
		goto	OL10
OL9:		
		movf 	V_Half_MID,W
OL10:		
		subwf	V_Start_MID,W
	bcf	STATUS,RP0
		movwf	insd2
	bsf	STATUS,RP0

		btfsc	_C
		goto	OL11
		incf	V_Half_HI,W
		goto	OL12
OL11:		
		movf 	V_Half_HI,W
OL12:		
		subwf	V_Start_HI,W
	bcf	STATUS,RP0
		movwf	insd3

Compare2:
;变化量放到 insd3,insd2,insd1
		movf	insd3,W
		btfss	_Z
		goto	RI1			; 最高字节不为零,直接跳到DT5
		movf	insd2,W
		btfsc	_Z
		goto	DT3			;Δ<1mV

		sublw	high V_Region		;电压的变化量与额定值比较
		btfsc	_Z
		goto	DT3
		btfsc	_C
		goto	DT3			;Δ<1mV
		goto	RI1

Half_Large2:
		movf 	V_Start_LOW,W
		subwf	V_Half_LOW,W
	bcf	STATUS,RP0
		movwf	insd1
	bsf	STATUS,RP0
		
		btfsc	_C
		goto	OL13
		incf	V_Start_MID,W
		goto	OL14
OL13:		
		movf 	V_Start_MID,W
OL14:		
		subwf	V_Half_MID,W
	bcf	STATUS,RP0
		movwf	insd2
	bsf	STATUS,RP0

		btfsc	_C
		goto	OL15
		incf	V_Start_HI,W
		goto	OL16
OL15:		
		movf 	V_Start_HI,W
OL16:		
		subwf	V_Half_HI,W
	bcf	STATUS,RP0
		movwf	insd3
		goto	Compare2
		
HighEqual2:
		movf	V_Start_MID,W
		subwf	V_Half_MID,W
		btfsc	_Z		; 
		goto	DT3
		btfsc	_C		; 
		goto	Half_Large2
		goto	Start_Large

DT3:
		bcf	STATUS,RP0
		bsf	STATUS,RP0
		movf	V_Waveform3,W
		bcf	STATUS,RP0
		btfss	_Z
		goto	DT7		;有电池
		movlw	high V_Code

		bsf	STATUS,RP0
;		movf	ChargeTermI_MID,W
		subwf	V_Waveform2,W
		bcf	STATUS,RP0
		btfsc	_C
		goto	DT7		;有电池
;电压低:电流线没接

; ****************************************************************
RI1: 		
		clrf 	T1use 		;T1use = mask for pw1dcl
		movf	PWM_HI,W
		movwf	DC_HI
		movf	PWM_LOW,W
		movwf	DC_LOW

		rrf	DC_HI,F
		rrf 	DC_LOW,F	;get duty cyl. hi byte
		rrf 	T1use,F 	;rotate into lo byte                                  

		rrf	DC_HI,F		;repeat for 2nd lsb
		rrf 	DC_LOW,F 	
		rrf	T1use,F 	;                                                 

		rrf	T1use,F 	;                                                 
		rrf	T1use,F 	;bit5,bit4
		movlw 	B'00110000' 	;mask ccp1X(bit5),ccp1Y(bit4) bits
		andwf	T1use,F
		movlw 	B'00001100'
		iorwf	T1use,F		;CCP1CON byte ready
 ;This code segment ensure that all PWM values (period and duty cycle)       
 ;are updated at the same time. This is done by ensuring that the Timer      
 ;is at least PWM_WIN (0Dh) cycles before the PR1 value                      
 ;(PR1 - PWM_WIN > TMR1).If not a “glitch” could occur in the PWM wave     
 ;form. When only the 1st duty cycle register is latched for this PWM        
 ;cycle, and the following PWM periodwill latch the 2nd duty cycle           
;register.                                                                  
PWM1_UD:
 		MOVF	TMR2, W         ;Load W reg. with Timer1 value                      
		SUBWF 	PR2, W          ;PR1 - TMR1 -> W reg.                                
 		sublw	PWM_WIN		;Check if Timer1 is about to overflow
 					;PWM_WIN - W
		btfss	STATUS,C	;PR2 - TMR2 =< PWM_WIN ?
		GOTO 	PU	         ;yes,Overflow would have occurred during                 
					;PWM updates, Delay a few cycles
		nop					
		nop					
		nop					
		nop					
		nop					
		nop					
		nop					
		nop					
PU:
;在TMR2IF=1之前更新CCPR1L、CCP1CON,when TMR1=PR2,the new DC value latched
		bcf	INTCON,GIE
		movf	DC_LOW,W
		movwf	CCPR1L		;Loaded in duty cycle buffer
		movf	T1use,W
		movwf	CCP1CON		;Your New PWM LSB
		bsf	INTCON,GIE

PT_OUT:
		bcf	TimerArrived
		return

;----------------------------------------------------------
Average:
		movf	VI_CSamp,W
		btfsc	_Z
		goto	FT2	;=0
		
		movlw	Iaddend1
		movwf	I
		movlw	AARGB3
		movwf	J
		movlw	D'4'
		movwf	tempCount
		bcf	PCLATH,3		; Prog page 0
		call	S1_S0
		bsf	PCLATH,3		; Prog page 1

		movf	VI_CSamp,W
		movwf	BARGB1
		clrf	BARGB0
		call	FXD3216U

		movlw	AARGB3
		movwf	I
		movlw	I_Waveform1
		movwf	J
		movlw	D'3'
		movwf	tempCount
		bcf	PCLATH,3		; Prog page 0
		call	S0_S1
		bsf	PCLATH,3		; Prog page 1
;4字节除以1字节,应该只剩3字节
FT2:
		movf	VI_CSamp,W
		btfsc	_Z
		goto	FT3	;=0
		movlw	Vaddend1
		movwf	I
		movlw	AARGB3
		movwf	J
		movlw	D'4'
		movwf	tempCount
		bcf	PCLATH,3		; Prog page 0
		call	S1_S0
		bsf	PCLATH,3		; Prog page 1
		movf	VI_CSamp,W
		movwf	BARGB1
		clrf	BARGB0
		call	FXD3216U

		movlw	AARGB3
		movwf	I
		movlw	V_Waveform1
		movwf	J
		movlw	D'3'		;4字节除以1字节,应该只剩3字节
		movwf	tempCount
		bcf	PCLATH,3		; Prog page 0
		call	S0_S1
		bsf	PCLATH,3		; Prog page 1
FT3:
		return		
; -----------------------------------------------------------------------------------
Transmit:		
		movlw	0x80
		iorwf	CCODE,F

		call	CHECKSUM
		movwf	TEMP
		movlw	DI0
		addwf	SBL,W
		movwf	FSR
		movf	TEMP,W
		movwf	INDF
		incf	FSR,F
		movlw	0x16
		movwf	INDF

;		movlw	D'9'			;FE,68,A0,A1,A2,CODE,L,CS,16
		movlw	D'8'			;68,A0,A1,A2,CODE,L,CS,16
		addwf	SBL,W
		movwf	ByteNumber		;发送字节数
; 发送
		bsf	STATUS,RP0		; select page 1
		bcf	PIE1,RCIE		;关闭接收中断
		bcf	STATUS,RP0		; select page 1
		bcf	RCSTA,CREN		;不允许连续接收

;		movlw	(SERIALBUFFER-1)
		movlw	SERIALBUFFER
		movwf	FSR
SEND1:
        	clrwdt
		bsf	STATUS,RP0		; SFR bank 0
		bsf	TXSTA,TXEN		;打开发送允许位
		bcf	STATUS,RP0		; SFR bank 0

		movf	INDF,W
		call	GenParity		;计算偶校验位

		bsf	STATUS,RP0		; SFR bank 1
		bcf	TXSTA,TX9D
		btfsc	PARITY,0
		bsf	TXSTA,TX9D
		bcf	STATUS,RP0		; SFR bank 0
		bcf	Enable485		;如果是485,打开485发送
		
		movf	INDF,W
		movwf	TXREG

		btfss	PIR1,TXIF
		goto	$-1
		call	Delay1ms		;用延时1ms代替字节间延时	

		incf	FSR,F
		decfsz	ByteNumber,F
		goto	SEND1

		bsf	STATUS,RP0		; SFR bank 0
		btfss	TXSTA,TRMT
		goto	$-1
		bcf	STATUS,RP0		; SFR bank 0
		bcf	PCLATH,3		; Prog page 0
		call	DELAY10ms
		bsf	PCLATH,3		; Prog page 0

;		bcf	RECEIVING		;若ByteReceived<>0持续 RevTime则中断该次通信
		clrf	OVERTIME
		clrf	ByteReceived

		call	TxmtFinished

		bcf	PCLATH,3		; Prog page 0
		goto	OK_OUT
TxmtFinished:		
		movf	RCREG,W
          	BCF     RCSTA,CREN 
          	BCF     RCSTA,OERR  																												         ;清错误标志
          	BSF     RCSTA,CREN  	
		bcf	RCSTA,FERR
		bsf	Enable485		; 处于接收状态

		bsf	STATUS,RP0		; SFR bank 0
		bcf	TXSTA,TXEN		;打开发送允许位
		bsf	PIE1,RCIE		; 打开接收中断
		bcf	STATUS,RP0		; SFR bank 0
		
		return

Delay1ms:
; 5.0688MHz crystal,延时1.83ms,周期数 T=D'3'	tc=2320,delay=1.83ms
		movlw	D'3'
		movwf	J
		movlw	0xFF
		movwf	I
DY1:
		decfsz	I,F	;1/2tc
		goto	DY1

        	clrwdt

		decfsz	J,F
		goto	DY1
		nop
		return

; -----------------------------------------------------------------------------------
;计算校验和(结果存放A中)
CHECKSUM:
		movlw	D'6'
		addwf	SBL,W
		movwf	J
		movlw	SERIALBUFFER
		movwf	FSR
		clrw
CK:
		addwf	INDF,W
		incf	FSR,F
		decfsz	J,F
		goto	CK
		return
;*********************************************************************************************************
;				Generate Parity for the Value in WREG
;
;  The parity bit is set in _parityBit 
;  Common Routine For Both Transmission & Reception
;
;*********************************************************************************************************
GenParity:
		movwf	RevTemp				;save data
		movlw	.8
		movwf	J
		clrw
Parityloop:
		btfsc	RevTemp,0			;put data in carry bit
		xorlw	01h				;parity calculated by XORing all data bits
        	rrf	RevTemp,F
		decfsz	J,F
		goto	Parityloop			;decrement count

; Parity bit is in Bit 0 of EvenUse1
;
;    偶校验,IF 偶数个1,parityBit=0
		bsf	STATUS,RP0		; SFR bank 1
		movwf	PARITY
		bcf	STATUS,RP0
		
		
		return
;*********************************************************************************************************
	#include 	<MATH2.ASM>

;Debug record

; 12.16	更新PWM_HI,PWM_LOW时,40%V不成功是因为电压的判断出错
; 12.20	为什么进入化成电流就到最大值?因为CH改为输出0(原为高阻态)
; 1.8	状态回送慢,并不是因为电池判断慢,1 是原来的200mA保持一分钟,
;	2 是流程的PWM正从小上升,却被判为到了截止电流
;	3 to change:if not corrected, not start Detect procedure
; 1.9	1.发充电命令40秒之后,若电流线还未夹上,则会转入静置流程。
;	2.关闭PWM的步骤:清CCPR1L,等待CCPR1H清零,清PWM_LOW、PWM_HI,清CCP1CON
;	  PWM输出腿置低,清TMR2、T2CON
;	  手工夹放电线,因打火出现大电流(从静置向放电转换的一瞬间),具体数据见:充-静-放.txt
;	3.CHxOS总读错:SPIRX的wordlen入口要求与SPIDX不一样;给SPI发的是写(spi.7=1)
; 1.17	1.correct the module DataAdded bug.
;	2.correct charging can't terminate.
; 1.20	1.注意:指标值的中字节不能有00H或FFH
;	2.ClosePWM 时没有关闭R46,R47,导致有小电流
;	3.FineINC时,对PORTA重新初始化,导致CH,DISCH被关闭
;	4.Read_I没有等待刷新就读,在10A充放电时,高字节有时读错(01H->02H)
;
; 2.7	1.delete PWM1_UD:
;	2.the most fast sample
; 2.28	1.In IDE,use Open project,not Recent workspace,can display color key words.
; 3.3	1.P_TIMER中,goto PT2误作goto PM2,导致WorkFlag被破坏
; 3.4	1.use stopwatch test:P-Timer:9.03ms;P_SEC:1.00284S;P_MIN:60.002S
;	2.停止了静置,不能再用启动命令启动它
; 3.21	1.增大判有电池的电压阀值,这样改了之后,上电桔灯亮一下可能会消失,因为以前就是电压判据满足了导致亮的。
;	2.读CH1,CH2失调值时,未清外存的存储值
;	3.以前漏帧:超时的时限过长
;
;
	END	; directive indicating the end of code
;*********************************************************************************************************

⌨️ 快捷键说明

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