You are on page 1of 22

Problem reading ADE7753 registers | AVR Freaks

Pgina 1 de 22

Signup
Login
Search

Problem reading ADE7753


registers
Log in or register to post comments Last post
Author
koseiwind

9 posts / 0 new
Message

Posted by koseiwind: Mon. Apr 6,

#1

2015 - 09:54 AM

Fivestar widget
Total votes: 0

Level: Newbie
Joined: Mon. Apr 6, 2015
Posts: 5 View posts

Hi there,

I am currently using the Arduino Uno to interface with


ADE7753 evaluation board.
My basic connection is:

Arduino Pin

Evaluation Board RS Cable Pin

Pin 11

Pin 2

(DIN)

Pin 12

Pin 13 (DOUT)

Pin 13

Pin 5

(CLK)

Pin 9

Pin 4

(CSBIN)

Pin 5

Pin 3

(RESET)

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 2 de 22

I have problem reading ADE7753 register, example when I


issue a read 8 bit command to the GAIN register I will get a
result of "11111111".
The default value for GAIN register is "00000000". In
addition, upon issuing a write command to the GAIN register
the result remains unchanged.
Similarly for the MODE register I am not able to write into
the register or read the default value in the register.

I am not sure if I am missing out anything, can any kind


soul give me some guidance on this?
Thank you very much.

The attached is the code that I'm currently using (reference


from Yomo code)
/*
Low-cost networked smart meter project YOMO
Christoph Klemenjak
Alpen-Adria-Universitt Klagenfurt
Smart Grids
v1.0 2014
GNU GPL License
*/
/* interfaces */
#include <avr/io.h>
#include <SPI.h>
#include <avr/wdt.h>
/*

global variables

*/

#define DEBUG 1
#define NETWORKING 1
#define BUFFER_SIZE 4
#define SENDTODB 0

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 3 de 22

#define CALIBRATION 1
#define RESET_DATA 0
#define sampleintervall 10000
byte samplecount=0;
unsigned long irms_avg=0;
unsigned long vrms_avg=0;
int Wh_LSB=1, VAh_LSB=1, VARh_LSB=1, VRMS_LSB=1,
IRMS_LSB=1;
unsigned long metered_data_buffer[6];
#define slaveSelectPin 9 //CSBIN pin
#define WRITE 0x80
#define CLKIN 1
#define SAG_PIN

#define IRQ_PIN

#define RESET_PIN 5
#define RELAY_PIN 8
/* register adresses */
/* 24 bit */
#define Waveform
#define AENERGY

0x01

/* waveform sample register*/

0x02

/* active energy register */

#define RAENERGY 0x03


#define LAENERGY 0x04

/* line accumulation active

energy register*/
#define VAENERGY 0x05

/* apparent energy register */

#define RVAENERGY 0x06


#define LVAENERGY 0x07
#define LVARENERGY 0x08
#define IRMS 0x16
#define VRMS 0x17
#define IRMSOS 0x18
#define VRMSOS 0x19
#define IPEAK 0x22
#define VPEAK 0x24
/* 16 bit*/
#define MODE 0x09

/* mode register*/

#define IRQEN 0x0A

/* interrupt enable register */

#define STATUS 0x0B

/* interrupt status register */

#define PERIOD 0x27

/* Period of the channel 2*/

#define LINECYC 0x1C

/* line cycle mode register */

/* 12 bit */
#define ZXTOUT 0x1D
#define CFNUM

0x14

#define CFDEN

0x15

/* Zero-crossing timeout */

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 4 de 22

/* 8 bit */
#define GAIN 0x0F

/*PGA GAIN adjust for the input

channels */
#define TEMP 0x26

/* Temperature register */

#define TMODE 0x3D


#define CH1OS 0x0D
#define CH2OS 0x0E
#define ZX 0x0010
#define RSTSTATUS 0x0C
unsigned long vrmsvalue = 0;
/*******************************/

/*

functions & procedures

*/

void enableMeter(void){
digitalWrite(slaveSelectPin, LOW);
}
void disableMeter(void){
digitalWrite(slaveSelectPin, HIGH);
}
void enableLoad(void){
digitalWrite(RELAY_PIN, HIGH);
}
void disableLoad(void){
digitalWrite(RELAY_PIN, LOW);
}
void setMode(int modus){
setREG16(MODE, modus);
}
int getMode(){
return readREG16(MODE);
}
void printREG16(int adress){
enableMeter();
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
Serial.print(SPI.transfer(0x00),HEX); //SPI.transfer(0x00)
is a dummy btye value
Serial.print("-");
Serial.println(SPI.transfer(0x00),HEX);
delayMicroseconds(5);
disableMeter();
}

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 5 de 22

void setREG8(int adress, int value){


enableMeter();
adress |= WRITE;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
SPI.transfer(value);
disableMeter();
}
void setREG12(int adress, int value){
enableMeter();
adress |= WRITE;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
SPI.transfer(value>>4);
delayMicroseconds(5);
disableMeter();
}
void setREG16(int adress, int value){
enableMeter();
adress |= WRITE;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
SPI.transfer(value>>8);
delayMicroseconds(5);
SPI.transfer(value);
disableMeter();
}
void setREG24(int adress, long value){
enableMeter();
adress |= WRITE;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
SPI.transfer(value>>16); //Why shift 16 bits instead of 8?
delayMicroseconds(5);
SPI.transfer(value>>8);
delayMicroseconds(5);
SPI.transfer(value);
disableMeter();
}
int readREG8(int adress){

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 6 de 22

enableMeter();
unsigned long reg;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
reg = SPI.transfer(0x00);
delayMicroseconds(5);
disableMeter();
return reg;
}
long readREG16(int adress){
enableMeter();
long reg, a;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
reg = SPI.transfer(0x00);
a = SPI.transfer(0x00);
delayMicroseconds(5);
disableMeter();
reg

= reg <<

8;

reg = reg + a;
return reg;
}
unsigned long readREG24(int adress){
enableMeter();
unsigned long reg, a, b;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
reg = SPI.transfer(0x00);
a = SPI.transfer(0x00);
b = SPI.transfer(0x00);
delayMicroseconds(5);
disableMeter();
reg

= reg <<

8;

reg = reg + a;
reg = reg <<

8;

reg = reg + b;
return reg;

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 7 de 22

}
///////////////////////////////////////////////////////////////////////////////////////////////////
/*
long getVRMS(void){
unsigned long lastupdate = 0;
getresetInterruptStatus();
lastupdate = millis();
while(! (getInterruptStatus() & ZX)){
if((millis() - lastupdate) >100){
wdt_reset();
Serial.println("\n VRMS timeout");
break;
}
}
return readREG24(VRMS);
}
long getIRMS(void){
unsigned long lastupdate = 0;
getresetInterruptStatus();
lastupdate = millis();
while(! (getInterruptStatus() & ZX)){
if((millis() - lastupdate) >100){
Serial.println("\n IRMS timeout");
break;
}
}
return readREG24(IRMS);
}
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
int getresetInterruptStatus(void){
return readREG16(RSTSTATUS);
}
int getInterruptStatus(void){
return readREG16(STATUS);
}
/*
unsigned long VRMS_COEFFICIENT(int iterations){
for(int i=0;i<iterations;i++){
vrms_avg += getVRMS();
delay(100);}

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 8 de 22

vrms_avg = vrms_avg/iterations;
// vrms_avg = (vrms_avg*230)/18000000;
return vrms_avg;
}
unsigned long IRMS_COEFFICIENT(int iterations){
for(int i=0;i<iterations;i++){
irms_avg += readREG24(IRMS);
delay(100);}
irms_avg = irms_avg/iterations;
return irms_avg;
}
*/
///////////////////////////////////////////////////////////////////////////////////////////////////

unsigned long VRMS_COEFFICIENT(int iterations){


for(int i=0;i<iterations;i++){
vrms_avg += readREG24(VRMS);
delay(100);}
vrms_avg = vrms_avg/iterations;
return vrms_avg;
}
unsigned long IRMS_COEFFICIENT(int iterations){
for(int i=0;i<iterations;i++){
irms_avg += readREG24(IRMS);
delay(100);}
irms_avg = irms_avg/iterations;
return irms_avg;
}
/*******************************/
/*

setup routine

*/

void setup(){
pinMode(slaveSelectPin, OUTPUT);
pinMode(RESET_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(slaveSelectPin, HIGH);
digitalWrite(RESET_PIN, HIGH);

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 9 de 22

SPI.setDataMode(SPI_MODE1);
SPI.setClockDivider(SPI_CLOCK_DIV32);
SPI.setBitOrder(MSBFIRST);
SPI.begin();
Serial.begin(9600);
delay(1000);
//enableMeter();
setREG16(0x09,0000000010001100); //Binary code
written , before edit 0000000010001100,
0000000010011100
Serial.println(readREG16(0x09));
//disableMeter();
SPI.end();
//setREG16(LINECYC, 0xFFFF); //0000 0000 1100 1000 ->
What does it means? , before edit 0x00C8
//setREG16(IRQEN,0x0040); //0100 0000 0100 0000,
before edit 0x404, to turn on bit5(for tempsel): 0x4050
}
/*******************************/
/*

main routine

*/

void loop(){
printREG16(0x0B);
printREG16(MODE);
//VRMS_COEFFICIENT(10);
//IRMS_COEFFICIENT(10);
delay(1000);
setREG16(0x09,0000000010001100); //Binary code
written , before edit 0000000010001100,
0000000010011100
Serial.println(readREG16(0x09));
//Serial.print("VRMS : ");
//Serial.println(vrms_avg);
//Serial.print("V");
//Serial.print("IRMS : ");
//Serial.println(irms_avg);
//Serial.print("A");
/*
Serial.print("VRMSvalue : ");
vrmsvalue = getVRMS();
Serial.println(vrmsvalue);
Serial.print("\n");

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 10 de 22

*/
delay(1000);

}
/*******************************/

Tags:
Tools, Compilers, ATxmega256A3
Top

Log In / Register to post comments

Posted by Kartman: Wed. Apr 8,


Kartman

#2

2015 - 10:49 PM

Total votes: 0

You can't express binary numbers like you've done! The


compiler will translate them as decimal.
Level: 10k+ Postman
Joined: Thu. Dec 30,
2004
Posts: 13202 View posts
Location:
Melbourne,Australia

You need the prefix of 0b like this 0b0000000010001100


Or just use hex 0x008c
I also assume you've wired a 0v signal between the two
boards.

Log In or Register to post comments

koseiwind

Posted by koseiwind: Wed. Apr

Top

#3

8, 2015 - 11:14 PM (Reply to


#2)

Total votes: 0

Level: Newbie
Joined: Mon. Apr 6, 2015
Posts: 5 View posts

Hi Kartman, thank you very much for looking at my


question.

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 11 de 22

Okay so i have to add 0b/0x for the values that im setting,


got it.
So i have simplified my code for debugging purposes but
still facing the same problem. The reading of register value
is wrong still =//
I'm kinda running out of ideas to debug this.

Example of the problem:


- when i issue a read to a 8bit GAIN register, the value of
the register will be 1111 1111 in binary or 255 in hex. The
default value is 0x0.
- I also have problem writing to this register to change the
value.

I have also check the output signal from arduino under


oscilloscope, seems like it is working fine.
Not sure, how to check the if the signal from ADE7753
output is correct.

The code below is the one i am currently using.


Thank you very much for helping out.

#include <Arduino.h>
#include "SPI.h"
//Register address
#define WAVEFORM
#define AENERGY

0x01
0x02

#define RAENERGY

0x03

#define LAENERGY

0x04

#define VAENERGY

0x05

#define RVAENERGY

0x06

#define LVAENERGY

0x07

#define LVARENERGY 0x08


#define MODE

0x09

#define IRQEN

0x0A

// interrupts enable register

#define STATUS

0x0B

// interrupts status register

#define RSTSTATUS

0x0C

// interrupts status register but

read will reset all interrupt flags

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

#define CH1OS

Pgina 12 de 22

0x0D

#define CH2OS

0x0E

#define GAIN

0x0F

#define PHCAL

0x10

#define APOS

0x11

#define WGAIN

0x12

#define WDIV

0x13

#define CFNUM

0x14

#define CFDEN

0x15

#define IRMS

0x16

#define VRMS

0x17

#define IRMSOS

0x18

#define VRMSOS

0x19

#define VAGAIN

0x1A

#define VADIV

0x1B

#define LINECYC

0x1C

#define ZXTOUT

0x1D

#define SAGCYC

0x1E

#define SAGLVL

0x1F

#define IPKLVL

0x20

#define VPKLVL

0x21

#define IPEAK

0x22

#define RSTIPEAK
#define VPEAK

0x23
0x24

#define RSTVPEAK

0x25

#define TEMP

0x26

#define PERIOD

0x27

#define TMODE

0x3D

#define CHKSUM

0x3E

#define DIEREV

0X3F

#define DATAOUT 11//MOSI


#define DATAIN

12//MISO

#define SPICLOCK

13//sck

//#define SLAVESELECT 10//ss


// Class Atributes
#define RESET 5
#define CS 10

// Chip Select ADE7753 -

Digital output pin


#define WRITE 0x80

// WRITE bit BT7 to write to

registers
#define CLKIN 4000000

// ADE7753 frec,

4.000000MHz
void setup()
{
Serial.begin(9600);

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 13 de 22

pinMode(RESET, OUTPUT);
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(CS,OUTPUT);
digitalWrite(RESET,LOW);
digitalWrite(RESET,HIGH);
digitalWrite(CS,HIGH);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1);
SPI.setClockDivider(SPI_CLOCK_DIV32);
SPI.begin();
//Serial.println(read8(GAIN),BIN);
//write8(GAIN,0b01100001);
//Serial.println(read8(GAIN),BIN);
//digitalWrite(SLAVESELECT,HIGH);
SPI.end();
}
unsigned char write8(char reg, unsigned char data){
digitalWrite(CS,LOW);
unsigned char data0 = 0;
// 8th bit (DB7) of the register address controls the
Read/Write mode (Refer to spec page 55 table 13)
// For Write -> DB7 = 1

/ For Read -> DB7 = 0

reg |= WRITE;
data0 = (unsigned char)data;
delayMicroseconds(500);
SPI.transfer((unsigned char)reg);

//register

selection
delayMicroseconds(500);
SPI.transfer((unsigned char)data0);
delayMicroseconds(500);
digitalWrite(CS,HIGH);
}
unsigned char read8(char reg){
// enableChip();
digitalWrite(CS,LOW);
float b0;
delayMicroseconds(5);
SPI.transfer(reg);
delayMicroseconds(5);
b0=SPI.transfer(0x00);
Serial.print("b0 value: ");
Serial.println(b0);

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 14 de 22

delayMicroseconds(10);
digitalWrite(CS,HIGH);
// disableChip();
//

return (unsigned long)SPI.transfer(0x00);

return b0;
}

void loop(){
pinMode(CS,OUTPUT);

// Chip select by digital

output on pin nbs CS


digitalWrite(CS, HIGH);//is disabled by default, so
need to set
// SPI Init
SPI.setDataMode(SPI_MODE1);
SPI.setClockDivider(SPI_CLOCK_DIV32);
SPI.setBitOrder(MSBFIRST);
SPI.begin();
delay(1000);
Serial.print("Read register value: ");
Serial.println(read8(0x0F),HEX);
write8(0x0F,0x00);
Serial.print("Read register value again after writing:
");
Serial.println(read8(0x0F),BIN);
Serial.println("

");

delay(1000);
//write8(GAIN,01100001);
//Serial.println(read8(GAIN),BIN);
//digitalWrite(SLAVESELECT,HIGH);
SPI.end();
delay(10);

Last Edited: Wed. Apr 8, 2015 - 11:26 PM

Log In or Register to post comments

koseiwind

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

Top

#4

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 15 de 22

Posted by koseiwind: Thu. Apr 9, 2015 - 04:59 AM

Total votes: 0

Level: Newbie
Joined: Mon. Apr 6, 2015
Posts: 5 View posts

So i tried measuring the MOSI,MISO,CLK and SS with the


oscilloscope to double check the SPI signal.

Arduino Pin

Evaluation Board RS Cable Pin

Pin 11(MOSI)

Pin 2

Pin 12(MISO)

Pin 13 (DOUT)

Pin 13(CLK)

Pin 5

Pin 10(SS)
Pin 5

(DIN)

(CLK)

Pin 4
Pin 3

(CSBIN)

(RESET) (Hardwired to 5V so

that it will not reset)

The picture below shows the results where


Yellow: SS
Green: MOSI
Purple: CLK
Blue: MISO

Seems like SS(yellow) fluctuates when data is sent to


ade7753.
Could this be the problem?
Once again, thanks for your help.

**The code and picture are as attached **!

Attachment(s):
Debugcode2.txt

(http://www.avrfreaks.net/sites/default/files/forum_attachme
DSC_0044.JPG

(http://www.avrfreaks.net/sites/default/files/forum_attachme

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 16 de 22

Top

Log In or Register to post comments

Posted by awneil: Thu. Apr 9,


awneil

#5

2015 - 06:05 AM (Reply to #2)

Total votes: 0

Kartman wrote:

Level: Raving Lunatic


Joined: Fri. Jul 1, 2005
Posts: 3365 View posts
Location: Basingstoke,
Hampshire, UK

You can't express binary numbers like you've


done! The compiler will translate them as
decimal.

Actually, it will treat numbers beginning with a leading zero


as octal !

Quote:

You need the prefix of 0b like this


0b0000000010001100

IF your compiler supports it - this is not standard 'C' !


Quote:

Or just use hex 0x008c

That would be the standard way.

Log In or Register to post comments

Posted by awneil: Thu. Apr 9,

Top

#6

2015 - 06:11 AM (Reply to #4)

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 17 de 22

awneil
Total votes: 0

koseiwind wrote:

Level: Raving Lunatic


Joined: Fri. Jul 1, 2005
Posts: 3365 View posts
Location: Basingstoke,
Hampshire, UK

**The code and picture are as attached **!

Rather than attach it - so that it can't be seen in context it's better to place the actual picture in the post:

And, yes:

if the yellow trace is supposed to be the Slave-

Select (SS) - then that certainly explains why it doesn't


work!!

Now you need to find out why it's doing that...

Log In or Register to post comments

koseiwind

Posted by koseiwind: Thu. Apr 9,

Top

#7

2015 - 06:33 AM (Reply to #6)

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 18 de 22

Total votes: 0

Yup Awneil, thanks for replying btw. I definitely need to


Level: Newbie
Joined: Mon. Apr 6, 2015
Posts: 5 View posts

make that SS signal constant without fluctuations.


I tried declaring another digital pin as the Chip Select but
the result is still the same.

Anyone have any idea why???

Top

Log In or Register to post comments

Posted by awneil: Thu. Apr 9,


awneil

#8

2015 - 06:40 AM

Total votes: 0

It looks like your SS control is not working at all: it appears


to be a solid zero when the SPI is idle, and
Level: Raving Lunatic
Joined: Fri. Jul 1, 2005
Posts: 3365 View posts
Location: Basingstoke,
Hampshire, UK

"unconnected" (so just "noise") when the SPI is active.

Top

Log In or Register to post comments

koseiwind

Posted by koseiwind: Fri. Apr 10,

#9

2015 - 03:46 AM (Reply to #8)

Total votes: 0

Hi Awneil,
Level: Newbie
Joined: Mon. Apr 6, 2015
Posts: 5 View posts
I finally got arduino to read and write the registers of
ADE7753. Seems like it is the problem with the oscillator.

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 19 de 22

After i changed the oscillator everything worked fine.


And apparently the fluctuation in the CS signal doesn't affect
the read and write function.

And i have another problem, i am not getting any values


from the LAENERGY register.
The following is the code that im using:

#include <avr/io.h>
#include <SPI.h>
/*

global variables

*/

#define DEBUG 1
#define NETWORKING 1
#define BUFFER_SIZE 4
#define SENDTODB 0
#define CALIBRATION 1
#define RESET_DATA 0
#define sampleintervall 10000
byte samplecount=0;
int Wh_LSB=1, VAh_LSB=1, VARh_LSB=1, VRMS_LSB=1,
IRMS_LSB=1;
unsigned long metered_data_buffer[6];
#define slaveSelectPin 10 //CSBIN pin
#define WRITE 0x80
#define CLKIN 1
#define SAG_PIN

#define IRQ_PIN

#define RESET_PIN 5
#define RELAY_PIN 8
/* register adresses */
/* 24 bit */
#define Waveform
#define AENERGY

0x01
0x02

/* waveform sample register*/


/* active energy register */

#define RAENERGY 0x03


#define LAENERGY 0x04

/* line accumulation active

energy register*/
#define VAENERGY 0x05

/* apparent energy register */

#define RVAENERGY 0x06


#define LVAENERGY 0x07
#define LVARENERGY 0x08
#define IRMS 0x16

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 20 de 22

#define VRMS 0x17


#define IRMSOS 0x18
#define VRMSOS 0x19
#define IPEAK 0x22
#define VPEAK 0x24
/* 16 bit*/
#define MODE 0x09

/* mode register*/

#define IRQEN 0x0A

/* interrupt enable register */

#define STATUS 0x0B

/* interrupt status register */

#define PERIOD 0x27

/* Period of the channel 2*/

#define LINECYC 0x1C

/* line cycle mode register */

/* 12 bit */
#define ZXTOUT 0x1D
#define CFNUM

0x14

#define CFDEN

0x15

/* Zero-crossing timeout */

/* 8 bit */
#define GAIN 0x0F

/*PGA GAIN adjust for the input

channels */
#define TEMP 0x26

/* Temperature register */

#define TMODE 0x3D


#define CH1OS 0x0D
#define CH2OS 0x0E

void enableMeter(void){
digitalWrite(slaveSelectPin, LOW);
}
void disableMeter(void){
digitalWrite(slaveSelectPin, HIGH);
}

void setREG16(int adress, int value){


enableMeter();
adress |= WRITE;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
SPI.transfer(value>>8);
delayMicroseconds(5);
SPI.transfer(value);

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 21 de 22

disableMeter();
}
void setREG24(int adress, long value){
enableMeter();
adress |= WRITE;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
SPI.transfer(value>>16); //Why shift 16 bits instead of 8?
delayMicroseconds(5);
SPI.transfer(value>>8);
delayMicroseconds(5);
SPI.transfer(value);
disableMeter();
}

unsigned long readREG24(int adress){


enableMeter();
unsigned long reg, a, b;
delayMicroseconds(5);
SPI.transfer(adress);
delayMicroseconds(5);
reg = SPI.transfer(0x00);
a = SPI.transfer(0x00);
b = SPI.transfer(0x00);
delayMicroseconds(5);
disableMeter();
reg

= reg <<

8;

reg = reg + a;
reg = reg <<

8;

reg = reg + b;
return reg;
}

/*******************************/
/*

setup routine

*/

void setup(){
pinMode(slaveSelectPin, OUTPUT);
digitalWrite(slaveSelectPin, LOW);
SPI.setDataMode(SPI_MODE2);

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

Problem reading ADE7753 registers | AVR Freaks

Pgina 22 de 22

SPI.setClockDivider(SPI_CLOCK_DIV32);
SPI.setBitOrder(MSBFIRST);
SPI.begin();
Serial.begin(9600);
delay(1000);
setREG16(MODE,0x008C);
setREG16(LINECYC, 0x07D0); //Set 2000 Linecycles
setREG16(IRQEN,0xFFFF); // Enable all interrupts
Serial.println(readREG16(MODE));
Serial.println(readREG16(LINECYC));
Serial.println(readREG16(IRQEN));
digitalWrite(slaveSelectPin, HIGH);
}
/*******************************/
/*

main routine

*/

void loop(){

Serial.println(readREG24(LAENERGY));
delay(2000);

}
/*******************************/

Log In or Register to post comments

Top

Jump To
-Evaluation and Development Kits

2015 Atmel Corporation

Privacy(http://www.atmel.com/About/privacy.aspx)
Contact(http://www.atmel.com/About/contact/distributors/default.aspx?
contactType=Online%20Directory)

Site Use Terms(http://www.atmel.com/About/legal.aspx)


Cookies(http://www.atmel.com/About/cookies.aspx)

http://www.avrfreaks.net/forum/problem-reading-ade7753-registers

25/04/2015

You might also like