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

📄 f6.asm

📁 用PIC单片机18F6520+ADE7755实现的一个大安培、锂离子电池的化程器。全部源码
💻 ASM
📖 第 1 页 / 共 4 页
字号:
		
		incf	I,F
		incf	J,F
		decfsz	tempCount,F
		goto	S1_S0
		
		return
;*********************************************************************************************************
	#include 	<ADE6.ASM>
	#include 	<CMD6.ASM>
	#include 	<IIC.ASM>
;*********************************************************************************************************
	org	High2k				; Page 1

ReadDelayInINT:
; 5.0688MHz crystal,tc=4*90=360,delay=360*0.789us=284us
		movlw	D'90'
		movwf	M
RT1:
		btfsc	INTCON,INTF	
		return
		decfsz	M,F
		goto	RT1
		return

;***********************************************************************
; Timer1 overflow interrupt
;
KeepValue_LOW	set	DC_LOW
;KeepValue_MID	defined
KeepValue_HI		set	DC_HI

T1OVFL:
		bcf	PIR1, TMR1IF

		movlw	low T1_TICK
		movwf 	TMR1L 			; set Timer1 Low byte
		movlw	high T1_TICK
		movwf 	TMR1H 			; set Timer1 high byte

		incf	C_T,F			
		movlw	D'2'
		subwf	C_T,W
		btfss	_C
		goto	RW0
		bsf	TimerArrived
		clrf	C_T
		
;*********************************************************************
RW0:
		btfsc	Mode_0CH1_1CH2
		goto	Mode_CH2
		
		bcf	INTCON,INTF	

		call	ReadDelayInINT
		btfsc	INTCON,INTF	
		goto	RWF1
		call	ReadDelayInINT
		btfsc	INTCON,INTF	
		goto	RWF1
; 还不能更新
		goto	ErrorProcedure
RWF1:

		movlw	B'00000001'	; 波形寄存器地址
		movwf	spi		; output to spi read active energy and reset 
		movlw	b'00000100'	; number of bytes to download B'000(5)(4)(3)(2)(1)' 
		movwf	wordlen		; wordlen is 24 bits. reg is actually 24 bits
		bcf	PCLATH,3
		CALL	SPIRX		; CALL SPI read 24 bit word data will be in 
 					; insd1,2,3.  3 being msb 1 being lsb
		call	START		;求补
		bsf	PCLATH,3

		bsf	ReadedCH1

		movf 	insd3,W		; mov in serial data (insd1-3) to sample low to high
		bsf	STATUS,RP0		; select page 1
		movwf	RB0_I3
		bcf	STATUS,RP0

		movf 	insd2,W
		bsf	STATUS,RP0		; select page 1
		movwf	RB0_I2
		bcf	STATUS,RP0

		movf 	insd1,W
		bsf	STATUS,RP0		; select page 1
		movwf	RB0_I1
		bcf	STATUS,RP0
; swap
		movlw	low MODE_INIT
		movwf	outd1		; lower eight bits
		movlw	high MODE_INIT
		iorlw	B'01100000'	; change to ch2
;		iorlw	B'00000100'	; swap
		movwf	outd2		; higher eight bits
; 写工作模式寄存器
		bcf	PCLATH,3
		call	WriteMODE

;;;*****************************************************
;		bsf	_BANK1
;		movf	APGAIN2_LOW,W
;		bcf	_BANK1
;		movwf	outd1
;		bsf	_BANK1
;		movf	APGAIN2_HI,W
;		bcf	_BANK1
;		movwf	outd2
;		call	W_APGain
;;;*****************************************************

		bsf	PCLATH,3
		bsf	Mode_0CH1_1CH2

		goto	T1OUT	
Mode_CH2:
		bcf	INTCON,INTF	

		call	ReadDelayInINT
		btfsc	INTCON,INTF	
		goto	RWF2
		call	ReadDelayInINT
		btfsc	INTCON,INTF	
		goto	RWF2
; 还不能更新
		goto	ErrorProcedure
RWF2:

		movlw	B'00000001'	; 波形寄存器地址
		movwf	spi		; output to spi read active energy and reset 
		movlw	b'00000100'	; number of bytes to download B'000(5)(4)(3)(2)(1)' 
		movwf	wordlen		; wordlen is 24 bits. reg is actually 24 bits
		bcf	PCLATH,3
		CALL	SPIRX		; CALL SPI read 24 bit word data will be in 
 					; insd1,2,3.  3 being msb 1 being lsb
		call	START		;求补
		bsf	PCLATH,3
		
		bsf	ReadedCH2

		movf 	insd3,W		; mov in serial data (insd1-3) to sample low to high
		bsf	STATUS,RP0		; select page 1
		movwf	RB0_V3
		bcf	STATUS,RP0

		movf 	insd2,W
		bsf	STATUS,RP0		; select page 1
		movwf	RB0_V2
		bcf	STATUS,RP0

		movf 	insd1,W
		bsf	STATUS,RP0		; select page 1
		movwf	RB0_V1
		bcf	STATUS,RP0

; switch back to CH1
		movlw	low MODE_INIT
		movwf	outd1		; lower eight bits
		movlw	high MODE_INIT
		movwf	outd2		; higher eight bits

		bcf	PCLATH,3
		call	WriteMODE	; 写工作模式寄存器
;;;*****************************************************
;		bsf	_BANK1
;		movf	APGAIN1_LOW,W
;		bcf	_BANK1
;		movwf	outd1
;		bsf	_BANK1
;		movf	APGAIN1_HI,W
;		bcf	_BANK1
;		movwf	outd2
;		call	W_APGain
;;;*****************************************************
		bsf	PCLATH,3
		bcf	Mode_0CH1_1CH2
		
T1OUT:
		bcf 	PCLATH,3
		goto	END_ISR

; --------------------------------------------------------------------
; 应为中断中也调用ClosePWM,所以靠判TMR2IF来传递CCPR1L到CCPR1H,
; 可能会有问题
ClosePWM:
		clrwdt

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

; ----	占空比置为 0
		clrf	CCPR1L			; Duty Cycle is 50% of PWM Period
		movlw	B'00000011'
		movwf	ResistNet
		bsf	STATUS,RP0		; Bank 1
		bsf	R46_TRIS
		bsf	R47_TRIS
		bcf	STATUS,RP0		; bank 0
CC1:
		movf	CCPR1H,W
		btfss	_Z
		goto	CC1

; ----	close PWM
		clrf	PWM_LOW
		clrf	PWM_HI
		bcf	TopPoint
		
		clrf	CCP1CON			; close CCP2
		bcf	PWM
		clrf	TMR2			; Clear Timer2
		clrf	T2CON			; stop Timer2
;
;		bsf	STATUS,RP0		; select page 1
;		bsf 	PIE1,TMR1IE 		; disable Timer1中断
;		bcf	STATUS,RP0		; select page 1

		clrf	SecsPassed

		return
; --------------------------------------------------------------------------------------
; 7756 mode register was changed,can't read out data from wafeform register

ErrorProcedure:
		nop
		goto	ErrorProcedure	; wait DOG reset

;***************************************************************************
; 串口接收中断
RCINT:			
; 读出接收到的第9位数据
            	bcf	RX9D_copy
            	btfsc	RCSTA,RX9D
            	bsf	RX9D_copy

; 计算偶校验位,与RX9D_copy比较 ......
; 清除OERR
; 判断FERR
; ------------------------------------------------------------------------
		movf	RCREG,W			; 读出接收到的数据
		movwf	RevTemp			; 暂存->RevTemp
		movf	ByteReceived,W
		addlw	SERIALBUFFER
		movwf	FSR

		movlw	.5
		subwf	ByteReceived,W		;ByteReceived-5
		btfsc	STATUS,Z
		goto	REC8			;Z=1,=5
		btfss	STATUS,C
		goto	REC8			;C=0,<5
;>5
		movf	SBL,W
		addlw	D'7'			;68,A0,A1,A2,CODE,L,CS
		subwf	ByteReceived,W		;ByteReceived-(BSL+11)->W
		btfss	STATUS,Z
		goto	RR_SAV			
;Z=1
		movlw	0x16
		subwf	RevTemp,W		; RevTemp-0x16->W
;等于结束符?
		btfss	STATUS,Z
		goto	RC_OUT			; not equal 0x16
;等于		
		movf	RevTemp,W
		movwf	INDF
;收到一帧
		bsf	aFRAME
		goto	RC_OUT
REC8:           
		movlw	high ADR
		movwf	PCLATH
		movlw	low ADR
		addwf	ByteReceived,W
		movwf	PCL		
ADR:		goto	RR68
		goto	RR_SAV
		goto	RR_SAV
		goto	RR_SAV
		goto	R_CMD
		goto	RR69
	
RR68:           
		movf	RevTemp,W
		sublw	0x68
		btfss	STATUS,Z
		goto	SerialOut
		bsf	RECEIVING
		goto	RR_SAV
R_CMD:		
		btfss	RevTemp,7		; 与上海规约相反
		goto	RR_SAV
RC_OUT:
		bcf	RECEIVING		; 清正在接收标志
		clrf    OVERTIME
		clrf	ByteReceived
		goto	SerialOut
RR69:           
		movlw	DataLength
		subwf	RevTemp,W		; RevTemp-DataLength->W
		btfsc	STATUS,C
		goto	RC_OUT			;大于最大长度
RR_SAV:
		movf	RevTemp,W
		movwf	INDF
		incf	ByteReceived,F
SerialOut:
		bcf 	PCLATH,3
		goto	END_ISR

;***************************************************************************
; Configure internal peripherals (except LCD) for operation.
; Also configures interrupts.
;
;***************************************************************************
; Inputs:  none
; Outputs: none

InitPeriph:
		movlw	PORTA_LATCH
		movwf	PORTA
		movlw	PORTB_LATCH
		movwf	PORTB
		movlw	PORTC_LATCH
		movwf	PORTC
		bsf	STATUS,RP0		; Bank 1
		movlw	PORTA_TRIS
		movwf	TRISA			;
		movlw	PORTB_TRIS
		movwf	TRISB
		movlw	PORTC_TRIS
		movwf	TRISC
		bcf	STATUS,RP0		; bank 0

		movlw	B'00000000'	;set up spi as master fos/4 idle state high 
		movwf	SSPCON		;mov W to spi control register 

		movlw	B'00000000'
		bsf     STATUS,RP0		; set to bank 1
		movwf	SSPSTAT			; set up clk edges 
		bcf     STATUS,RP0        	; set to bank 0
		bsf	SSPCON,5		; Synchronous Serial Port Enable
;---------------------------------------------------------------------------------	
;配置USART
		movlw 	RCSTA_INIT		; 8-bit receive, receiver enabled,
		movwf 	RCSTA 			; serial port enabled
		bsf	STATUS,RP0		; Bank 1
		movlw	TXSTA_INIT
		movwf	TXSTA
;配置波特率
		movlw	SPBRG_INIT
		movwf	SPBRG
; set A0-A4  to digital
		movlw	0x06
		movwf	ADCON1
		bcf	STATUS,RP0		; Bank 0
; close A/D
		clrf	ADCON0
; -------------------------------------------------------------
; PWM Initialization
;PWMInit:
		clrf	CCP1CON			; close CCP2
		clrf	TMR2			; Clear Timer2
		clrf	T2CON			; stop Timer2
		movlw	PR2_INIT
		bsf	STATUS,RP0		; Bank 1
		movwf	PR2
		bcf	STATUS,RP0		; Bank 0
		movlw	CCPR1L_INIT		; 8 bits of DC
		movwf	CCPR1L			; Duty Cycle is 50% of PWM Period
		movlw	CCP1CON_INIT		; PWM mode, 2 LSbs of Duty cycle = 00
		movwf	CCP1CON			; Duty Cycle is 00% of PWM Period
		BCF     PIR1, TMR2IF    	; Clear the TRM2 = PR2 flag
		movlw	T2CON_INIT
		movwf	T2CON			; 1:1 prescale, 1:1 postscale
		bsf	T2CON,TMR2ON		; TMR2 on

		return

;***************************************************************************
ConfigInt:					; configure interrupts
		movf	PORTB,W			; required to clear interrupt on PORTB change
		clrf	PIR1			; clear all pending peripheral interrupts
		clrf	INTCON			; clear all remaining interrupts and
						; some interrupt enable flags
		bsf	STATUS,RP0		; select page 1
		movlw	OPTION_INIT		; Interrupt on RB0/INT falling edge
		movwf	OPTION_REG		; TMR0 in Timer mode

		bsf 	PIE1,RCIE 		; 允许SCI接收中断
		bsf 	PIE1,TMR1IE 		; 允许Timer1中断

		bcf	STATUS,RP0		; select page 0
; T1 setup
		movlw	low T1_TICK
		movwf 	TMR1L 			; set Timer1 Low byte
		movlw	high T1_TICK
		movwf 	TMR1H 			; set Timer1 high byte
		movlw	T1CON_INIT
		movwf	T1CON

; enable GIE,PEIE,T0IE,INTE,RBIE
;		movlw	INTCON_INIT
;		movwf	INTCON
;		bsf	INTCON,RBIE
		bcf	INTCON,RBIE
		bcf	INTCON,INTE
		bcf	INTCON,T0IE
		bsf	INTCON,PEIE
		bsf	INTCON,GIE

		return

; ***************************************************************************
; clear 20H--7FH(bank0),A0H--FFH(bank1)
ClearRAM:					; This was a cold start, clear memory
		movlw	BFIIC			; start of GPRs
		movwf	FSR

CR:
		clrf	INDF			; clear GPR
		incf	FSR,F			; increment POINTER
		movf	FSR,W			; get POINTER
		xorlw	0x80			; test for first GPR to not clear
		btfss	STATUS,Z		; was there a match?
		goto	CR			; no, clear another GPR

		movlw	0xA0			; start of GPRs
		movwf	FSR
		bsf	STATUS,RP0
CR1:
		clrf	INDF			; clear GPR
		incf	FSR,F			; increment POINTER
		movf	FSR,W			; get POINTER
		xorlw	0xFF			; test for first GPR to not clear
		btfss	STATUS,Z		; was there a match?
		goto	CR1			; no, clear another GPR

		bcf	STATUS,RP0
		return

;----------------------------------------------------------
P_Charge:
		btfss	BattOn
		return
		

		btfsc	CMD_Stop
		return				;处停止状态
		movf	WorkFlag,W
		btfss	_Z
		return

;流程寄存器 = 0:没有其他流程		
		bsf	Charging
		bsf	RedLed			;正在充电,亮红灯
		bcf	GreenLed

		bcf	CH			; enable
		bsf	DISCH			; disable

P_OUT:
		clrf	C_TermT_LOW
		clrf	C_TermT_HI

; 重新启动PWM		
		movlw	CCPR1L_INIT		; 8 bits of DC
		movwf	CCPR1L			; Duty Cycle is 50% of PWM Period
		movlw	CCP1CON_INIT		; PWM mode, 2 LSbs of Duty cycle = 00
		movwf	CCP1CON			; Duty Cycle is 00% of PWM Period
		movlw	T2CON_INIT
		movwf	T2CON			; 1:1 prescale, 1:1 postscale
		bsf	T2CON,TMR2ON		; TMR2 on

;关闭电阻网络
		bsf	STATUS,RP0		; Bank 1
		bsf	R46_TRIS
		bsf	R47_TRIS
		bcf	STATUS,RP0		; bank 0
		
;		clrf	ResistNet
		movlw	B'00000011'
		movwf	ResistNet
		bsf	T1CON,TMR1ON
		
		return

;----------------------------------------------------------
P_DisChar:
		btfss	BattOn
		return
		
		btfsc	CMD_Stop
		return				;处停止状态
		movf	WorkFlag,W
		btfss	_Z
		return

;流程寄存器 = 0:没有其他流程		
		bsf	disCharging
		bcf	RedLed			; close红灯
		bsf	GreenLed		; on 

		bsf	CH	
		bcf	DISCH			; 输出0放电

		goto	P_OUT

;----------------------------------------------------------
DataAdded_I:
		bcf	_C
		movf	I_sample_low,W
		bsf	STATUS,RP0
		addwf	Iaddend1,F
		
		btfss	_C
		goto	ADD2
		movlw	D'1'
		addwf	Iaddend2,F
		btfss	_C
		goto	ADD2
		movlw	D'1'
		addwf	Iaddend3,F
		btfss	_C
		goto	ADD2
		movlw	D'1'
		addwf	Iaddend4,F
ADD2:		
		bcf	STATUS,RP0

		movf	I_sample_middle,W
		bsf	STATUS,RP0
		addwf	Iaddend2,F

		btfss	_C
		goto	ADD3
		movlw	D'1'
		addwf	Iaddend3,F
		btfss	_C
		goto	ADD3
		movlw	D'1'
		addwf	Iaddend4,F
ADD3:		
		bcf	STATUS,RP0
		movf	I_sample_high,W
		bsf	STATUS,RP0
		addwf	Iaddend3,F
		
		btfss	_C
		goto	DA_OUT
		movlw	D'1'
		addwf	Iaddend4,F
DA_OUT:		
		bcf	STATUS,RP0
		return

; --------------------------------------------------------
DataAdded_V:
		bcf	_C
		movf	V_sample_low,W
		bsf	STATUS,RP0
		addwf	Vaddend1,F
		
		btfss	_C
		goto	VDD2
		movlw	D'1'
		addwf	Vaddend2,F
		btfss	_C
		goto	VDD2
		movlw	D'1'
		addwf	Vaddend3,F
		btfss	_C
		goto	VDD2
		movlw	D'1'
		addwf	Vaddend4,F
VDD2:		
		bcf	STATUS,RP0

		movf	V_sample_middle,W
		bsf	STATUS,RP0
		addwf	Vaddend2,F

		btfss	_C
		goto	VDD3
		movlw	D'1'
		addwf	Vaddend3,F
		btfss	_C
		goto	VDD3
		movlw	D'1'
		addwf	Vaddend4,F
VDD3:		
		bcf	STATUS,RP0
		movf	V_sample_high,W
		bsf	STATUS,RP0
		addwf	Vaddend3,F
		
		btfss	_C
		goto	VA_OUT
		movlw	D'1'
		addwf	Vaddend4,F
VA_OUT:		
		bcf	STATUS,RP0
		return

; --------------------------------------------------------
P_TIMER:
		incf	C_SEC,F			
		movlw	SEC1divTimer
		subwf	C_SEC,W

⌨️ 快捷键说明

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