?? ade6.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
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 + -