|
|
View previous topic :: View next topic |
Author |
Message |
gomond
Joined: 05 Nov 2008 Posts: 18
|
Power Monitoring with ADE7756 or similar. |
Posted: Tue Oct 13, 2009 2:12 am |
|
|
Hi
I am building a Data Logger, with an 18f8722, SD-Card... and ADE7756 Energy metering IC (SPI interface).
And I was wondering if anyone had ay experience in this area, as I am a little green.
I have hooked it all up and I have the basic datalogger running like a ripper (thanks to Andrew Smallridge from Brush Electronics).
And now I just have to work out how to get the power metering done.
I was thinking of doing it using a couple of diffferential ADC's originally, but this looks quicker, though maybe less flexible.
I was wondering if anyone had already written a CCS driver for this IC?
Before I attempt to reinvent the wheel.
Thanks
Greg. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 14, 2009 4:41 pm |
|
|
This Microchip ASM code could be converted to CCS:
http://www.analog.com/static/imported-files/application_notes/317740795RMS_CODE.txt
Converting it to use CCS functions would greatly reduce the number of
lines of code. Here's an example:
I have converted the SPIRX and ENGREAD1 functions to CCS.
I didn't try to improve it very much. They use globals to transfer
data. For simplicity, I just kept it that way. That could be improved.
Compare this code to the ASM code in the link. But remember,
I don't want to do this project for you. This is just an example to
help you to see how to convert the code in a minimal way. You must
do the rest of it, if you want to.
Code: |
#include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
// SPI mode constants used in the setup_spi() function.
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
#define ADE7756_CS PIN_B4
#define RSTENERGY_CMD 0x03
int8 insd5;
int8 insd4;
int8 insd3;
int8 insd2;
int8 insd1;
//--------------------------
void SPIRX(int8 spi_command, int8 wordlen)
{
output_low(ADE7756_CS);
spi_write(spi_command);
insd1 = 0;
insd2 = 0;
insd3 = 0;
insd4 = 0;
insd5 = 0;
// This switch-case code intentionally leaves out the break
// statements, because it is intended to "fall through" to
// get all the required bytes (from 1 to 5, depending on
// the parameter passed to the SPIRX() function).
switch(wordlen)
{
case 5:
insd5 = spi_read(0);
case 4:
insd4 = spi_read(0);
case 3:
insd3 = spi_read(0);
case 2:
insd2 = spi_read(0);
case 1:
insd1 = spi_read(0);
break;
default:
printf("Error: Incorrect wordlen\n\r");
}
output_high(ADE7756_CS);
}
//---------------------------
void ENGREAD1(void)
{
SPIRX(RSTENERGY_CMD, 5); // 40 bits = 5 bytes
}
//============================
void main()
{
// The ADE7756 will be connected to the 3 hardware SPI pins
// on the PIC. A spare i/o pin is used for the Chip Select.
// The max allowable SCLK is 3 MHz, so a divisor of 4 is used
// with our 4 MHz crystal, to give 1 MHz SCLK.
setup_spi(SPI_MASTER | SPI_MODE_1 | SPI_CLK_DIV_4);
output_high(ADE7756_CS);
delay_ms(10);
ENGREAD1();
// The result from the ENGREAD1() function is returned in
// 5 global variables. Display them.
printf("%x %x %x %x %x \n\r" insd5, insd4, insd3, insd2, insd1);
while(1);
} |
---
Edit: Fixed a problem where I left ADE7756_CS in a low state
at the end of SPIRX(). Also added code to initialize it to a high
level at the start of main() and do a short delay after that.
Last edited by PCM programmer on Thu Oct 15, 2009 5:30 pm; edited 1 time in total |
|
|
gomond
Joined: 05 Nov 2008 Posts: 18
|
|
Posted: Thu Oct 15, 2009 3:13 am |
|
|
Quote: |
This Microchip ASM code could be converted to CCS:
http://www.analog.com/static/imported-files/application_notes/317740795RMS_CODE.txt
Converting it to use CCS functions would greatly reduce the number of
lines of code. Here's an example:
I have converted the SPIRX and ENGREAD1 functions to CCS.
I didn't try to improve it very much. They use globals to transfer
data. For simplicity, I just kept it that way. That could be improved.
Compare this code to the ASM code in the link. But remember,
I don't want to do this project for you. This is just an example to
help you to see how to convert the code in a minimal way. You must
do the rest of it, if you want to.
|
Thanks Heaps PCM Programmer
That is a ripper kick start. I would have never thought that it could be simpilfied like that.
Being a fitter and turner this stuff takes a while to convert to nuts and bolts but with help like this I can at least get my head arround it.
Thanks again.
Greg. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|