Escolar Documentos
Profissional Documentos
Cultura Documentos
;setup ports
;----------------freq setup--------------------
#DEFINE timer PORTA,1 ; timer,0 stop timer,1 start
#DEFINE mcsb PORTB,5 ; cs for spi rom
INITIALIZE:
TRISTATE:
;=====================check for cal cable set all pins to input=================
===========
; if cable present display cal mode on display and tristate all spi buss pins to
allow pc to take over
bcf STATUS,6
bsf STATUS,5 ; set to bank 1
movlw H'06' ; set port a to digital same as 16C62B
movwf ADCON1
clrf PIE1 ; clr register in bank 1
clrf PIE2 ; clr register in bank 1
bcf STATUS,5 ; set to bank 0
movlw B'11010111' ; w := 11111010 binary
tris PORTA ; port A ctrl register := w
movlw B'11111111' ; w := 11111010 binary
tris PORTB ; port B ctrl register := w
movlw B'00111000' ; w := 11111010 binary outputs
are on for lcd only!!!
tris PORTC ; port c ctrl register := w
nop
nop
btfss PORTB,7 ; test for cable if there loop
GOTO CABLE
GOTO NORMAL ; normal operation
CABLE:
CALL INITLCD ; initialize lcd for 4 bit mode
MULT10:
movlw D'8' ; number of bits to multiply
movwf wordlen ; mov 40 into wordlen
MULTLOOP0: ;
;
btfsc mem,0 ; if bit is 1 add insd1-9 to aenergy0-10
CALL ADDEGY ; add insd1-11 to energy accu.
bcf STATUS,0 ;
rrf mem,1 ; rotate constant for next bit to multiply
bcf STATUS,0
rlf insd1,1 ; rotate for next add
rlf insd2,1 ; rotate for next add
rlf insd3,1 ; rotate for next add
rlf insd4,1 ; rotate for next add
rlf insd5,1 ; rotate for next add
rlf insd6,1 ; rotate for next add
rlf insd7,1 ; rotate for next add
rlf insd8,1 ; rotate for next add
rlf insd9,1 ; rotate for next add
rlf insd10,1 ; rotate for next add
rlf insd11,1 ; rotate for next add Register is long enought b
y mult 32 bits
bcf STATUS,0
decfsz wordlen,1
GOTO MULTLOOP0 ; repeat
RETURN
ADDEGY:
;-----------------------40 bit add routine results in 88 bit aenergy0-10 10msb
movf insd1,w
bsf STATUS,5 ; page 1
addwf aenergy0,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy1,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy2,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy3,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy4,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy5,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy6,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 1
movf insd2,w
bsf STATUS,5 ; page 1
addwf aenergy1,1
bcf STATUS,5 ; page 1
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy2,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy3,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy4,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy5,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy6,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd3,w
bsf STATUS,5 ; page 1
addwf aenergy2,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy3,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy4,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy5,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy6,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd4,w
bsf STATUS,5 ; page 1
addwf aenergy3,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy4,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy5,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy6,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd5,w
bsf STATUS,5 ; page 1
addwf aenergy4,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy5,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy6,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd6,w
bsf STATUS,5 ; page 1
addwf aenergy5,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy6,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd7,w
bsf STATUS,5 ; page 1
addwf aenergy6,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd8,w
bsf STATUS,5 ; page 1
addwf aenergy7,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd9,w
bsf STATUS,5 ; page 1
addwf aenergy8,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd10,w
bsf STATUS,5 ; page 1
addwf aenergy9,1
bcf STATUS,5 ; page 0
CALL CARRYCHK
movf carry,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
movf insd11,w
bsf STATUS,5 ; page 1
addwf aenergy10,1
bcf STATUS,5 ; page 0
RETURN
CARRYCHK:
clrf carry ; clear carry register
btfsc STATUS,0 ; test status reg carry bit. skip if clr
incf carry,1 ; increment carry
RETURN
;-----------------------------end 40 bit add routine------------------------
PLUSORMINUS:
;-------------divide by 2^40 the result of Aenergyxeconstant
; mov aenergy5-10 to e0-e5 for temporary manipulation before conversion to ascII
bsf STATUS,5 ; page 1
movf aenergy5,w
movwf e0
movf aenergy6,w
movwf e1
movf aenergy7,w
movwf e2
movf aenergy8,w
movwf e3
movf aenergy9,w
movwf e4
movf aenergy10,w
movwf e5
btfss aenergy10,7 ;test for sign extension
GOTO PLORMIEND
comf e0,1 ; complement and add 1
comf e1,1
comf e2,1
comf e3,1
comf e4,1
comf e5,1
bcf STATUS,0 ; clear carry
movlw B'00000001'
addwf e0,1 ; add 1 and ripple if carry jump when no carry t
o PLORMIEND
btfss STATUS,0
GOTO PLORMIEND
bcf STATUS,0 ; clear carry
movlw B'00000001'
addwf e1,1
btfss STATUS,0
GOTO PLORMIEND
bcf STATUS,0 ; clear carry
movlw B'00000001'
addwf e2,1
btfss STATUS,0
GOTO PLORMIEND
bcf STATUS,0 ; clear carry
movlw B'00000001'
addwf e3,1
btfss STATUS,0
GOTO PLORMIEND
bcf STATUS,0 ; clear carry
movlw B'00000001'
addwf e4,1
bcf STATUS,0 ; clear carry
GOTO PLORMIEND
bcf STATUS,0 ; clear carry
movlw B'00000001'
addwf e5,1
bcf STATUS,0 ; clear carry
PLORMIEND:
bcf STATUS,5 ; page 0
RETURN
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy3
bcf STATUS,5 ; page0
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy4
bcf STATUS,5 ; page0
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy5
bcf STATUS,5 ; page0
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy6
bcf STATUS,5 ; page0
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy7
bcf STATUS,5 ; page0
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy8
bcf STATUS,5 ; page0
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy9
bcf STATUS,5 ; page0
CALL MEMDATAIN
bsf STATUS,5 ; page1
movwf aenergy10
bcf STATUS,5 ; page0
bsf mcsb ; write enable eeprom
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
RETURN
ENERGYDUMP:
; dump energy to eeprom starting at address 00 when called by inte
rrupt routine
: after sag is detected
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
;===============================================================================
=====
bsf csb ; set 7756 csb to high if not already
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000110' ; WREN instruction
bcf mcsb ; clear chip select for eeprom
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT ; wait for spi buff to be empty
bsf mcsb ; write enable eeprom
;===============================================================================
======
SPI7756:
;------------------------------ setup spi port CALL SPI7756 ------------------
------------------------------------
SPIRX:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movf spi,w ; spi control word (first 8 bits)
bcf csb ; set to 0 /cs pin
movwf SSPBUF ; output 8 bit word msb first
bsf STATUS,5 ; set to bank 1
LOOPSPI:
btfss SSPSTAT,0 ; wait for completion
GOTO LOOPSPI ; wait for output buffer empty
bcf STATUS,5 ; set to bank 0
clrf insd1 ; clear input data registers
clrf insd2
clrf insd3
clrf insd4
clrf insd5
btfsc wordlen,4 ; input 40 bits if set 5 bytes
GOTO bit40
btfsc wordlen,3 ; input 32 bits if set 4 bytes
GOTO bit32
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
bit40:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movf H'0',w ; lower eight bits
movwf SSPBUF
bsf STATUS,5 ; set to bank 1
LOOP40:
btfss SSPSTAT ; wait for completion
GOTO LOOP40
bcf STATUS,5 ; set to bank 0
movf SSPBUF,w
movwf insd5
bit32:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movf H'0',w ; lower eight bits
movwf SSPBUF
bsf STATUS,5 ; set to bank 1
LOOP32:
btfss SSPSTAT,0 ; wait for completion
GOTO LOOP32
bcf STATUS,5 ; set to bank 0
movf SSPBUF,w
movwf insd4
bit24:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movf H'0',w ; lower eight bits
movwf SSPBUF
bsf STATUS,5 ; set to bank 1
LOOP24:
btfss SSPSTAT,0 ; wait for completion
GOTO LOOP24
bcf STATUS,5 ; set to bank 0
movf SSPBUF,w
movwf insd3
bit16:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movf H'0',w ; lower eight bits
movwf SSPBUF
bsf STATUS,5 ; set to bank 1
LOOP16:
btfss SSPSTAT,0 ; wait for completion
GOTO LOOP16
bcf STATUS,5 ; set to bank 0
movf SSPBUF,w
movwf insd2
bit8:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movf H'0',w ; lower eight bits
movwf SSPBUF
bsf STATUS,5 ; set to bank 1
LOOP8:
btfss SSPSTAT,0 ; wait for completion
GOTO LOOP8
bcf STATUS,5 ; set to bank 0
movf SSPBUF,w
movwf insd1
bsf csb ; set /cs to 1
RETURN
SPIDX:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movf spi,w
bcf csb ; set to 0 /cs pin
movwf SSPBUF ; output 8 bit word msb first
bsf STATUS,5 ; set to bank 1
TXLOOP1:
btfss SSPSTAT,0 ; wait for completion
GOTO TXLOOP1
;------------------------end spi control write----------------------
;------------------------start of data------------------------------
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
btfsc wordlen,3 ; test for 8 or 16 bits
GOTO eight
movf outd2,w ; upper eight bits
movwf SSPBUF ; move word to buffer
bsf STATUS,5 ; set to bank 1
TXLOOP2:
btfss SSPSTAT,0 ; wait for completion
GOTO TXLOOP2
eight:
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 01
movf outd1,w ; lower eight bits
movwf SSPBUF
bsf STATUS,5 ; set to bank 1
TXLOOP3:
btfss SSPSTAT,0 ; wait for completion
GOTO TXLOOP3
bcf STATUS,5
LCDCHAR:
movwf lcdup ;
movwf lcdlow ;
movlw B'11110000' ; for masking lower bits
andwf lcdup,1 ; lcdupper= xxxx0000
swapf lcdup,1 ; lcdupper= 0000xxxx
movlw B'00010000' ; add data command to lcd output
addwf lcdup,0 ; " " "
CALL LCD ; output upper 4 bits to lcd
movlw B'00001111' ; for masking upper bits
andwf lcdlow,1 ; lcdlower= 0000xxxx
movlw B'00010000' ; add data command to lcd output
addwf lcdlow,0 ; " " "
CALL LCD ; output lower 4 bits
RETURN
;------------------end ascii convert for lcd--------------------------
KWH:
;-------------------------------------------------------------------------------
----------------------------
;-----------------This initializes the part as a power meter--------------------
----------------------------
; 156us for 8bit control and 16 bit data, 112us for 8bit control and 8 bit out
; first two writes set up start address for block read. each word is shifted out
after 8 clock pulses.
; keep clocking and each work is sent out in order until eeprom cs is set high.
will roll over to the
; address after 16 words.
;------------------------------cf read------------------------------------------
----------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom rising edge
transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'16' ; start at address 16 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 16
movwf outd1
CALL MEMDATAIN ; get address 17
movwf outd2
movlw B'10000111' ; command to write to cfdiv register
movwf spi ; call spi control write to cfdiv reg
movlw D'16' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 and outd2 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------apgain read--------------------------------------
------------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'18' ; start at address 18 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 18
movwf outd1
CALL MEMDATAIN ; get address 19
movwf outd2
movlw B'10001011' ; command to write to apgain register
movwf spi ; call spi control write to apgain reg
movlw D'16' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 and outd2 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------apos read----------------------------------------
------------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'37' ; start at address 37 PAGE 3
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 37
movwf outd1
CALL MEMDATAIN ; get address 38
movwf outd2
movlw B'10001101' ; command to write to apos register
movwf spi ; call spi control write to apos reg
movlw D'16' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 and outd2 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------icoef--------------------------------------------
-------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'21' ; start at address 21 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 21
movwf outd1
movlw B'10001000' ; command to write to ch1os register
movwf spi ; call spi control write to ch1os reg
movlw D'8' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------ch2os read---------------------------------------
----------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'22' ; start at address 22 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 22
movwf outd1
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
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------gain read----------------------------------------
---------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'23' ; start at address 23 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 23
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
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------phcal read--------------------------------------
-----------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'24' ; start at address 24 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 24
movwf outd1
movlw B'10001100' ; command to write to phcal register
movwf spi ; call spi control write to phcal reg
movlw D'8' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------sagcyc read-------------------------------------
------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'25' ; start at address 25 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 25
movwf outd1
movlw B'10001111' ; command to write to sagcyc register
movwf spi ; call spi control write to sagcyc reg
movlw D'8' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------saglvl read-------------------------------------
------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'26' ; start at address 26 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 26
movwf outd1
movlw B'10010001' ; command to write to saglvl register
movwf spi ; call spi control write to saglvl reg
movlw D'8' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 and outd2 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------mask read---------------------------------------
----------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'27' ; start at address 27 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 27
movlw b'00000010'
movwf outd1
movlw B'10010000' ; command to write to mask register
movwf spi ; call spi control write to mask reg
movlw D'8' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------mode read----------------------------------------
---------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'28' ; start at address 28 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 28
movwf outd1
movwf mode0
CALL MEMDATAIN ; get address 29
movwf outd2
movwf mode1
movlw B'10000110' ; command to write to mode register
movwf spi ; call spi control write to mode reg
movlw D'16' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 and outd2 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------zxout read---------------------------------------
----------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'30' ; start at address 30 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 30
movwf outd1
CALL MEMDATAIN ; get address 31
movwf outd2
movlw B'10001110' ; command to write to zxout register
movwf spi ; call spi control write to zxout reg
movlw D'16' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ; output outd1 and outd2 to 7756
;-------------------------------------------------------------------------------
------------------------------
;------------------------------constant1 read----------------------------------
---------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'32' ; start at address 32 PAGE 3
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 32
movwf econstant0
CALL MEMDATAIN ; get address 33
movwf econstant1
CALL MEMDATAIN ; get address 34
movwf econstant2
CALL MEMDATAIN ; get address 35 set bit 7 to show watts clr to
show tenths of watts
movwf point
CALL MEMDATAIN ; get address 36 temp offset
movwf tempof
bsf mcsb ; chip select high
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
;-------------------------------------------------------------------------------
------------------------------
;------------------------------Current Offset and voltage offset for rms--------
----------------------------
CALL SPIEEPROM ; call routine to setup spi port for eeprom risi
ng edge transfer
bcf mcsb ; clear chip select for eeprom
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw B'00000011' ; read instruction
movwf SSPBUF ; output 8 bit word msb first (mode and A8 bit)
CALL EEPWAIT
bsf STATUS,5 ; set to bank 1
bcf SSPSTAT,0 ; clear buffer full flag
bcf STATUS,5 ; set to bank 0
movlw D'48' ; start at address 48 PAGE 2
movwf SSPBUF ; output 8 bit word msb first
CALL EEPWAIT
CALL MEMDATAIN ; get address 48
bsf STATUS,5
movwf icof1
bcf STATUS,5
CALL MEMDATAIN ; get address 49
bsf STATUS,5
movwf icof2
bcf STATUS,5
CALL MEMDATAIN ; get address 50
bsf STATUS,5
movwf vcof1
bcf STATUS,5
CALL MEMDATAIN ; get address 51
bsf STATUS,5
movwf vcof2
bcf STATUS,5
CALL MEMDATAIN ; get address 48
bsf STATUS,5
movwf ioffset1
bcf STATUS,5
CALL MEMDATAIN ; get address 49
bsf STATUS,5
movwf ioffset2
bcf STATUS,5
CALL MEMDATAIN ; get address 50
bsf STATUS,5
movwf voffset1
bcf STATUS,5
CALL MEMDATAIN ; get address 51
bsf STATUS,5
movwf voffset2
bcf STATUS,5
bsf mcsb ; clear chip select for eeprom
CALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
CALL SPIDX ;
RETURN
;-------------------------------------------------------------------------------
------------------------------
LCD:
movwf lcdout ; mov lcd data+ins/char into lcdout
LCDL:
bcf lcde ; set lcde low
bcf lcdrw ; set lcd to write
bcf lcdrs ; set rs bit low
bcf lcd4 ; clears lcd databit 4-7
bcf lcd5
bcf lcd6
bcf lcd7
btfsc lcdout,0 ; test lcd data bit 0 if set set lcd4
bsf lcd4
btfsc lcdout,1 ; test lcd data bit 1 if set set lcd5
bsf lcd5
btfsc lcdout,2 ; test lcd data bit 2 if set set lcd6
bsf lcd6
btfsc lcdout,3 ; test lcd data bit 3 if set set lcd7
bsf lcd7
btfsc lcdout,4 ; test lcd data bit 4 if set set lcdrs instructi
on or character
bsf lcdrs
CALL DELAY ; wait for data to stablize before enable
CALL DELAY2 ;removed 45 CALL DELAY2's incase of problem 20 mhz
bsf lcde ; set lcde high for enable
CALL DELAY ; sets enable pulse width
CALL DELAY ; sets enable pulse width
CALL DELAY2 ;removed 45 CALL DELAY2's incase of problem 20 mhz
bcf lcde ; set lcde low to latch data
RETURN
;------------------------------------------------------------------------------
DELCD: ; called in initLCD routine
movlw D'100'
movwf wait3 ; mov 100 into wait3 loop
WAIT3:
decfsz wait3,1 ; dec wait if zero return
GOTO WAIT3
RETURN ; return to lcd routine
RETURN
;----------------------------end initialization-----------------------------
;-------------------------------------------------------------------------------
; 24-bit binary to BCD conversion.
;
; Binary input data is taken from bin0-bin4 which is destroyed.
; The result is stored in bcd0..bcd3, bcd0 holds the two LS Digits.
;
;
;-------------------------------------------------------------------------------
BIN2BCD:
do_b2b:
movlw D'32' ;
movwf wordlen ;
clrf bcd0 ; clear bcd0
clrf bcd1 ; clear bcd1
clrf bcd2 ; clear bcd2
clrf bcd3 ; clear bcd3
clrf bcd4 ; clear bcd4
BCDLOOP:
bcf STATUS,0
rlf bin0,f ; rotate bin to left through carry
rlf bin1,f
rlf bin2,f
rlf bin3,f
btfsc STATUS,0
bsf 0x0C,0
rlf bcd0,f ; ...into bcd
rlf bcd1,f
rlf bcd2,f
rlf bcd3,f
rlf bcd4,f
decfsz wordlen,f
GOTO ADJUST
RETURN
ADJUST:
movlw H'2E' ; make magic adjustment to each BCD digit
movwf FSR ; mov address of bcd0 to indirect pointer
CALL ADJBCD
incf FSR,f ; increment pointer to bcd1
CALL ADJBCD
incf FSR,f ; increment pointer to bcd2
CALL ADJBCD
incf FSR,f ; increment pointer ro bcd3
CALL ADJBCD
incf FSR,f ; increment pointer ro bcd4
CALL ADJBCD
GOTO BCDLOOP
ADJBCD:
movf INDF,w ;
movwf bcdtemp ;
movlw 0x33 ;
addwf bcdtemp,f ;
clrw ;
btfss bcdtemp,3 ;
iorlw 0x03 ;
btfss bcdtemp,7 ;
iorlw 0x30 ;
subwf bcdtemp,f ;
movf bcdtemp,w ;
movwf INDF ;
RETURN
;-------------------end bcd convert-----------------------------------
LCDUPDATE:
btfss point,6
GOTO KWHDIGIT ;
bsf STATUS,5
btfsc rmsch,0
GOTO RMSSPACE
bcf STATUS,5
bcf STATUS,5
bsf point,1 ; set bit 2 to display 0.0000 1 for 0.000 or
0 for 0.00
movf bcd1,w ; mov aenergy to w
CALL BCD2ASCII ; output aenergy to serial or lcd 2 character pe
r call
bcf point,1
NOWATT:
RETURN
;--------------------displays tenths of kwh .x
RMSDIGIT:
bcf STATUS,5 ; Page 0
bcf point,0 ; set bit 2 to display 0.0000 1 for 0.000 or 0 for 0.
00
bcf point,1
btfss point,5 ; this bit is used to select .0 or .00 for rms output al
low the same
;routine to be used for Irms and Vrms
bsf point,0 ; set bit 2 to display 0.0000 1 for 0.000 or 0 for 0.
00
movf bcd1,w ; mov aenergy to w
CALL BCD2ASCII ; output aenergy to serial or lcd 2 character pe
r call
bcf point,0 ; clear decimal pointers
bcf point,1
btfsc point,5 ; test for I rms or vrms see above
bsf point,1 ; set bit 2 to display 0.0000 1 for 0.000 or 0 for 0.
00
btfss point,7
GOTO NOWATT
movf bcd0,w ; mov aenergy to w
CALL BCD2ASCII ; output aenergy to serial or lcd 2 character pe
r call
btfsc point,6
GOTO RMSDIGGAP
RETURN
RMSDIGGAP:
movlw A' ' ; ascii " " to put space between Irms and vrms
CALL LCDCHAR
movlw A' ' ; ascii " "
CALL LCDCHAR
RETURN
;-------------end output to lcd--------------------------------------------
BCD2ASCII:
;--------------------------------bcd0-4 to ascii convert------------------------
----------
; btfsc point,3
; mov aenergy value into w before calling routin
e
movwf msdbcd ; msdbcd
movwf lsdbcd ; lsdbcd
movlw B'11110000' ; for masking lower bits
andwf msdbcd,1 ; msdbcd = xxxx0000
swapf msdbcd,1 ; msdbcd = 0000xxxx
movlw B'00110000' ; add 48 to change bcd to ascii character of bcd
value
addwf msdbcd,0 ; "0011xxxx"
btfsc point,2
GOTO NODIGIT
CALL LCDCHAR ; output upper 4 bits to lcd
NODIGIT:
btfsc point,1 ; test for point
CALL POINT ;
movlw B'00001111' ; for masking upper bits
andwf lsdbcd ,1 ; lcdlower= 0000xxxx
movlw B'00110000' ; add 48 to change bcd to ascii character of bcd
value
addwf lsdbcd ,0 ; " " "er
CALL LCDCHAR ; output lower 4 bits to lcd
btfsc point,0 ; test for point
CALL POINT
RETURN
POINT:
movlw A'.' ; ascii "."
CALL LCDCHAR
RETURN
;--------------------------------end bcd to ascii to lcd character output-------
------------
START1:
; CALL GETDATA;------------------------------------------------LOOP----
---------------------------------------------------
; CALL ENGREAD1 ; Initial read before loop
GOTO START1 ; loop until interrupt
MODEMASK:
movf mode0,w
movwf outd1
movlw B'01011000' ; set mode register for waveform sampling
iorwf mode1,w
movwf outd2
movlw B'10000110' ; command to write to mode register
movwf spi ; call spi control write to mode reg
movlw D'16' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
LCALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
LCALL SPIDX ; mov lsb of word to output to outd2
NOENG:
bcf STATUS,5
clrf y1 ; clear all register for rms calculation
clrf y2
clrf y3
clrf y4
clrf y5
clrf y6
clrf x1
clrf x2
clrf x3
clrf x4
clrf x5
clrf x6
clrf dave1
clrf dave2
LCALL CHANNEL
bsf INTCON,7 ; enable interrupts
GOTO START1 ; return to start loop and wait for wav sample interrupt
RETURN
;------------------- Square routine--------------------------------
SQR:
;------------------- clear register--------------------------------
clrf square1 ; multiply 24 bit word by itself (shift and add)
clrf square2
clrf square3
clrf square4
clrf square5
clrf square6
clrf add1
clrf add2
clrf add3
clrf add4
clrf add5
clrf add6
clrf addend1
clrf addend2
clrf addend3
clrf addend4
clrf addend5
clrf addend6
;------------------- Load the register--------------------------------
movf sample_low,w ;load adder with sample data
movwf add1
movf sample_middle,w
movwf add2
movf sample_high,w
movwf add3
;------------ Square the register results in square registers-----------
--------------
movf sample_low,w ; test sample work shift and add as indicated
movwf mem
CALL MULT1
movf sample_middle,w
movwf mem
CALL MULT1
movf sample_high,w
movwf mem
CALL MULT1
RETURN
; this is the add one routine used after compliment to make positive or negative
PLUSONE:
bcf STATUS,0 ; clear carry
movlw D'1'
addwf sample_low,1
btfss STATUS,0
RETURN
bcf STATUS,0 ; clear carry
movlw D'1'
addwf sample_middle,1
btfss STATUS,0
RETURN
bcf STATUS,0 ; clear carry
movlw D'1'
addwf sample_high,1
btfss STATUS,0
RETURN
; necessary for lcall's
ADDJUMP:
CALL ADD
RETURN
; x1-6 is the output of the iir filter or the square root of the input
; divide output of iir filter by 2^9 to negate the multiply sample by 2^9 this w
as done so
; no lsb's would be lost in the filter
movlw D'9'
movwf div
DIVBYN5: ; div by 2^9
bcf STATUS,0
rrf x6,1
rrf x5,1
rrf x4,1
rrf x3,1
rrf x2,1
rrf x1,1
BCF STATUS,0
decfsz div,1
GOTO DIVBYN5
Y1:
; add one
bcf STATUS,0 ; clear carry
movlw D'1'
addwf add1,1
btfss STATUS,0
GOTO SKIP2
bcf STATUS,0 ; clear carry
movlw D'1'
addwf add2,1
btfss STATUS,0
GOTO SKIP2
bcf STATUS,0 ; clear carry
movlw D'1'
addwf add3,1
btfss STATUS,0
GOTO SKIP2
bcf STATUS,0
movlw D'1'
addwf add4,1
btfss STATUS,0
GOTO SKIP2
bcf STATUS,0 ; clear carry
movlw D'1'
addwf add5,1
btfss STATUS,0
GOTO SKIP2
bcf STATUS,0 ; clear carry
movlw D'1'
addwf add6,1
bcf STATUS,0 ; clear carry
SKIPNC:
RETURN
RETURN
ADDVOFF:
GOTO ADDVOFF1 : long call stuff
COEFDIV: ; last part of coeficient
movlw D'16'
movwf div
DIVBY16: ; div by 2^16
bcf STATUS,0
rrf addend6,1
rrf addend5,1
rrf addend4,1
rrf addend3,1
rrf addend2,1
rrf addend1,1
BCF STATUS,0
decfsz div,1
GOTO DIVBY16
RETURN
;---Configure the Mode register for Current or Voltage RMS
;----calculation
;set mode register depending rmsch 0 or 1 this is incremented in getdata routine
CHANNEL:
bsf STATUS,5 ; set to bank 1
btfsc rmsch,0
GOTO CH2
bcf STATUS,5 ; set to bank 1
bcf point,5 ; point5 aux channel indicator
movlw B'00001000' ; sets mode reg for ch1 wav samp at 3.5k
ps
movwf outd1
movwf mode0
movlw B'01011000'
movwf outd2
movwf mode1
CH2:
bsf STATUS,5 ; set to bank 1
btfss rmsch,0
GOTO SETCH
bcf STATUS,5 ; set to bank 1
bsf point,5 ; point5 aux channel indicator
movlw B'00001000' ; sets mode reg for ch2 wav samp at 3.5k
ps
movwf outd1
movwf mode0
movlw B'01111000'
movwf outd2
movwf mode1
SETCH:
bcf STATUS,5
movlw B'10000110' ; command to write to mode register
movwf spi ; call spi control write to mode reg
movlw D'16' ; number of bits
movwf wordlen
bsf mcsb ; chip select high
LCALL SPI7756 ; sets spi port to talk to 7756 data latch on the fallin
g edge.
LCALL SPIDX ; mov lsb of word to output to outd2
RETURN
START:
CH2COFF:
bsf STATUS,5 ; set to bank 1
btfsc rmsch,0
GOTO WHY
LGOTO COFFCOMP
WHY:
movf vcof1,w ; multiply by vcoef
bcf STATUS,5 ; set to bank 0
movwf mem
LCALL MULT1
bsf STATUS,5 ; set to bank 1
movf vcof2,w
bcf STATUS,5 ; set to bank 0
movwf mem
LCALL MULT1
LCALL COEFDIV
; add v offset
bsf STATUS,5 ; set to bank 1
movf voffset1,w
bcf STATUS,5 ; set to bank 0
movwf add1
bsf STATUS,5 ; set to bank 1
movf voffset2,w
bcf STATUS,5 ; set to bank 0
movwf add2
clrf add3
clrf add4
clrf add5
clrf add6
btfss add2,7 ; SKIP IF NEGATIVE
GOTO ADDVOFF
comf add3,1 ; SIGN EXTEND NEGATIVE
comf add4,1
comf add5,1
comf add6,1
ADDVOFF1: ; more long call stuff
LCALL ADD
COFFCOMP:
bcf STATUS,5 ; set to bank 0
RETURN
END