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

📄 ade6.asm

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


;---------------------------------------------------------
;
;start read of spi port of X bit reg defined by wordlen 
;INPUT:		spi:	存放将写入通信寄存器的值()
;				  W/R 0 0 A4 A3 A2 A1 A0, bit7(w/r)=0:read
;		wordlen:bit0,bit1,bit2=1,bit3=1,bit4=1分别表示8字节,16字节,24字节,32字节,40字节
;
;OUTPUT:	insd3,insd2,insd1

;----------------------------------------------------------


SPIRX: 
	
		bsf   	STATUS,RP0    	; set to bank 1
		bcf	SSPSTAT,BF	; clear buffer full flag 	  	
		bcf   	STATUS,RP0  	; set to bank 0
		movf	spi,w		; spi control word (first 8 bits)
		bcf 	csb		; set  to 0 /cs pin
		movwf	SSPBUF		; 控制字写入通信寄存器

		bsf   	STATUS,RP0    	; set to bank 1
LOOPSPI:
		btfss	SSPSTAT,BF	; wait for completion
		GOTO	LOOPSPI		; wait for output buffer empty 
		bcf	STATUS,RP0    	; set to bank 0

;8个时钟脉冲之后,时钟停顿,再次写入SSPBUF才能重启时钟

		clrf	insd1		; clear input data registers 
		clrf	insd2
		clrf	insd3
		btfsc	wordlen,2	; input 24 bits if set 3 bytes
		GOTO	bit24
		btfsc	wordlen,1	; input 16 bits if set 2 bytes
		GOTO	bit16
		btfsc	wordlen,0	; input 8 bits if set 1 bytes
		GOTO	bit8


bit24:
	bsf	STATUS,RP0    	; set to bank 1
	bcf	SSPSTAT,BF	; clear buffer full flag
	bcf   	STATUS,RP0    	; set to bank 0
	movf	H'0',W		; lower eight bits
	movwf	SSPBUF	
	bsf   	STATUS,RP0    	; set to bank 1
LOOP24:
	btfss	SSPSTAT,BF	; wait for completion
	GOTO	LOOP24
	bcf   	STATUS,RP0    	; set to bank 0
	movf	SSPBUF,w	; 通过读SSPBUF自动清 BF标志
	movwf	insd3

bit16:
	bsf   	STATUS,RP0    	; set to bank 1
	bcf	SSPSTAT,BF	; clear buffer full flag
	bcf   	STATUS,RP0    	; set to bank 0
	movf	H'0',W		; lower eight bits
	movwf	SSPBUF	
	bsf   	STATUS,RP0    	; set to bank 1
LOOP16:	
	btfss	SSPSTAT,BF	; wait for completion
	GOTO	LOOP16
	bcf   	STATUS,RP0    	; set to bank 0	
	movf	SSPBUF,w
	movwf	insd2

 
bit8:
		bsf   	STATUS,RP0    	; set to bank 1
		bcf	SSPSTAT,BF	; clear buffer full flag
		bcf   	STATUS,RP0    	; set to bank 0
		movf	H'0',W		; lower eight bits,主机发送的其实是“哑”数据,目的是给出时钟脉冲,
				; 让7756的数据进入SSPBUF
		movwf	SSPBUF	
		bsf   	STATUS,RP0    	; set to bank 1
LOOP8:
		btfss	SSPSTAT,BF	; wait for completion
		GOTO	LOOP8
		bcf   	STATUS,RP0    	; set to bank 0 
		movf	SSPBUF,w
		movwf	insd1
		bsf	csb		; set /cs to 1

		RETURN

;-----------------------------------------------------------
;
;	This routine writes to the 7756 spi control 
;	control data (first 8 bits before data read or write)
; 
;	OUTPUT 8 BIT SPI CONTROL AND 8 OR 16 BIT DATA 
;	34us FOR 8+16 BIT AND 26us FOR 8+8 BIT 
;-------------------------------------------------------------------


SPIDX:
	bcf 	csb		; set  to 0 /cs pin
	nop
	bsf   STATUS,RP0    ; set to bank 1
	bcf	SSPSTAT,BF	; clear buffer full flag 	  	
	bcf   STATUS,RP0    ; set to bank 0
	movf	spi,w
	movwf	SSPBUF		; 控制字写入通信寄存器
 	
	bsf   STATUS,RP0    ; set to bank 1
TXLOOP1:
	btfss	SSPSTAT,BF	; wait for completion
	GOTO	TXLOOP1
;------------------------end spi control write---------------------- 
 
;------------------------start of data------------------------------
	bsf     STATUS,RP0  ; set to bank 1
	bcf	SSPSTAT,BF	; clear buffer full flag
	bcf     STATUS,RP0  ; set to bank 0
	btfsc	wordlen,3	; test for 8(00001000B) or 16 bits 
	GOTO	eight	  	
	movf	outd2,w		; upper eight bits 注: 移入串行端口DIN的第一个字节被传送至目标寄存器的最高有效字节
				;		       ; 参见ADE7756手册Page27 Line 2
	movwf	SSPBUF		; move word to buffer 

	bsf     STATUS,RP0  	; set to bank 1
TXLOOP2:
	btfss	SSPSTAT,BF	; wait for completion
	GOTO	TXLOOP2

eight:	 
	bsf     STATUS,RP0  	; set to bank 1
	bcf	SSPSTAT,BF	; clear buffer full flag
	bcf     STATUS,RP0  	; set to bank 01
	movf	outd1,w		; lower eight bits
	movwf	SSPBUF	

	bsf     STATUS,RP0  	; set to bank 1
TXLOOP3:
	btfss	SSPSTAT,BF	; wait for completion
	GOTO	TXLOOP3
	bcf 	STATUS,RP0

	nop
	bsf	csb		; set /cs to 1

	RETURN


;-----------------end spi control and data (x) out--------------------



;------------------- Read Waveform register--------------------------------
;	The clock frequency of the ADE7756 is 3.579545 MHz.
;	With this frequency,the sampling periods available
;	through the ADE7756 are 35.7 μs,71.5 μs,143 μs,and
;	286 μs.As the microcontroller needs more time to do
;	the signal processing,the lowest sampling rate is used
;	for the ADE7756 and the samples are read with a deci-
;	mation factor of 2.The actual sampling rate for the
;	samples used in the digital signal processing is then
;	CLKIN/2048,which represents approximately 1.748 kHz.

;-----------------This initializes the part as a power meter------------------------------------------------	
; 	156us for 8bit control and 16 bit data, 112us for 8bit control and 8 bit out   	 
; 	RECALL 7756 SETTINGS FROM EEPROM 

KWH:
;----------    clear some unused REG  -------------------------------------------------------------
;		clrf	outd1
;		clrf	outd2

;		movlw	ADDR_CFDIV
;		iorlw	H'80'
;		movwf	spi		; call spi control write to gain reg
;		movlw	D'16'		; number of bits
;		movwf	wordlen
;		CALL	SPIDX		; output outd1 to 7756

;		movlw	ADDR_ZXTOUT
;		iorlw	H'80'
;		movwf	spi		; call spi control write to gain reg
;		movlw	D'16'		; number of bits
;		movwf	wordlen
;		CALL	SPIDX		; output outd1 to 7756

;		movlw	ADDR_SAGCYC
;		iorlw	H'80'
;		movwf	spi		; call spi control write to gain reg
;		movlw	D'8'		; number of bits
;		movwf	wordlen
;		CALL	SPIDX		; output outd1 to 7756

;------------------------------mode write-------------------------------------------------------------

		movlw	low MODE_INIT
		movwf	outd1		; lower eight bits
		movlw	high MODE_INIT
		movwf	outd2		; higher eight bits
		call	WriteMODE
		bcf	Mode_0CH1_1CH2
;;; >>>
;		movlw	B'00000110'	;
;		movwf	spi		; output to spi read active energy and reset 
;		movlw	b'00000010'	; number of bytes to download B'000(5)(4)(3)(2)(1)' 
;		movwf	wordlen		; wordlen is 24 bits. reg is actually 24 bits
;		CALL	SPIRX		; CALL SPI read 24 bit word data will be in 
;;; <<<
;------------------------------gain write-------------------------------------------------------------

		movlw	GAIN_INIT
		movwf	outd1

		movlw	B'10001010'	; command to write to gain register 
		movwf	spi		; call spi control write to gain reg
		movlw	D'8'		; number of bits
		movwf	wordlen
		CALL	SPIDX		; output outd1 to 7756
;----------------------------  mask  write  ----------------------------------------------------------

		movlw	IRQEN_INIT
		movwf	outd1		; lower eight bits
		movlw	B'10010000'	; command to write to mode register 
		movwf	spi		; call spi control write to mode reg
		movlw	D'8'		; number of bits
		movwf	wordlen
		CALL	SPIDX		; output outd1 and outd2 to 7756
;------------------------------icoef---------------------------------------------------------------------
		I2C_READ_SUB    0x01, outd1, AT_CH1OS
;
		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 

;------------------------------ch2os read-------------------------------------------------------------
		I2C_READ_SUB    0x01, outd1, AT_CH2OS

		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

;------------------------------apgain read--------------------------------------------------------------------
		I2C_READ_SUB    0x02, outd1, AT_APGAIN
		nop
		movf	outd1,W
		bsf	_BANK1
		movwf	APGAIN1_LOW
;;;
	movwf	APGAIN2_LOW	;测试CH2若有APGAIN会否波动
		bcf	_BANK1
		movf	outd2,W
		bsf	_BANK1
		movwf	APGAIN1_HI
;;;
	movwf	APGAIN2_HI	;测试CH2若有APGAIN会否波动
		bcf	_BANK1
		
		call	W_APGain

		RETURN
;-------------------------------------------------------------------------------------------------------------
START:
	
		btfss	insd3,7	; test sign bit if neg compliment and add 1 to get absolute value
		GOTO 	POSITIVE	; in not negative skip to truncate to 16 bit 

		comf	insd3,F	; compliment 
		comf	insd2,F
		comf	insd1,F

				; add one 
		bcf	STATUS,C	; clear carry
		movlw	D'1'
		addwf	insd1,F
		btfss	STATUS,C
		GOTO 	POSITIVE
		bcf	STATUS,C	; clear carry
		movlw	D'1'
		addwf	insd2,F
		btfss	STATUS,C
		GOTO 	POSITIVE
		bcf	STATUS,C	; clear carry
		movlw	D'1'	 
		addwf	insd3,F

POSITIVE:
		RETURN	


⌨️ 快捷键说明

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