|
|
View previous topic :: View next topic |
Author |
Message |
perkins
Joined: 03 Jan 2004 Posts: 2
|
Help reading Serial EEPROM |
Posted: Sat Jan 03, 2004 9:06 pm |
|
|
Wow, first time to this group and already I'm looking for help with code.
My problem is that I can write a Floating point number to a serial EEPROM but cannot read back any reliable data that makes sense.
The hardware is part of a datalogger I'm working on and the serial EEPROM has been tested using inteter number and works fine- I believe that I can write a floating point number to the EEPROM but cannot read the hex values I expect to see.
I've distilled the code and I would be most appreciative if anyone can offer me inisghts to my problem.
Thanks, Al
PCM Version 2.693 (yes it is old!)
#include <16F877.H>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
/* EXTERNAL EEPROM ASSIGNMENTS */
#define EEPROM_ADDRESS long int
#define EEPROM_BYTE_SIZE 8192
#define EEPROM_SCL PIN_C3
#define EEPROM_SDA PIN_C4
#define hi(x) (*(&x+1))
#use delay ( clock=4000000 ) // clock 4 Mhz
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N)
#use i2c ( master, scl=EEPROM_SCL, sda=EEPROM_SDA )
void init_ext_eeprom ( void );
void write_ext_eeprom ( long int lngAddress, byte intData );
byte read_ext_eeprom ( long int lngAddress );
void WRITE_FLOAT_EXT_EEPROM(long int n,float fTempVal);
static float fTempVal;
static long int iTempVal;
void main ( void )
{
long int j,k;
float data;
init_ext_eeprom(); /* set SDA and SCL to float */
data=100.20; /* float data to start recording */
printf("\n\r");
for (k=0; k<3;k++)
{
printf("\n\rdata= %3.2f",data);
WRITE_FLOAT_EXT_EEPROM(k,data);
data=data+.2;
}
for (j=0; j<12;j++)
{
iTempVal=read_ext_eeprom(j);
}
}
/* EEPROM Routines */
void init_ext_eeprom ( void )
{
output_float ( EEPROM_SCL );
output_float ( EEPROM_SDA );
}
void write_ext_eeprom ( long int lngAddress, byte intData )
{
byte intDataR;
i2c_start();
i2c_write ( 0xa0 ); /* set up for writing address and data, chip address 000 */
i2c_write ( hi ( lngAddress ) ); /* write high address */
i2c_write ( lngAddress ); /* write low address */
i2c_write ( intData ); /* write data */
i2c_stop();
delay_ms ( 11 );
printf("\n\r\t\tWr %X",intData); /* print hex Write Data */
}
byte read_ext_eeprom ( long int lngAddress )
{
byte intData;
i2c_start();
i2c_write ( 0xa0 ); /* set up for writing address, chip address 000 */
i2c_write ( hi ( lngAddress ) ); /* write high address */
i2c_write ( lngAddress ); /* write low address */
i2c_start();
i2c_write ( 0xa1 ); /* set up for reading data, chip address 000 */
intData = i2c_read ( 0 ); /* read data */
i2c_stop();
delay_ms ( 11 );
printf("\n\r\t\tRd %X",intData); /* print hex Read Data */
return ( intData );
}
void WRITE_FLOAT_EXT_EEPROM(long int n,float fTempVal)
{
int i;
for (i=0;i<4;i++)
{
write_ext_eeprom(i+n,*(&fTempVal+i));
delay_ms(2);
}
}
Output Data on serial port:
data= 100.19
Wr 85
Wr 48
Wr 66
Wr 66
data= 100.39
Wr 85
Wr 48
Wr CC
Wr CC
data= 100.59
Wr 85
Wr 49
Wr 33
Wr 32
This is the serial data read - bears litlle resemblance to the written data
Rd 85
Rd 85
Rd 85 <- data 100.59?
Rd 49
Rd 33 <-
Rd 32
Rd 85
Rd 85
Rd 4B
Rd 38
Rd 4F |
|
|
mcafzap
Joined: 07 Sep 2003 Posts: 46 Location: Manchester, UK
|
Re: Help reading Serial EEPROM |
Posted: Sat Jan 03, 2004 9:22 pm |
|
|
data=100.20; /* float data to start recording */
printf("\n\r");
for (k=0; k<3;k++)
{
printf("\n\rdata= %3.2f",data);
WRITE_FLOAT_EXT_EEPROM(k,data);
data=data+.2;
}
for (j=0; j<12;j++)
{
iTempVal=read_ext_eeprom(j);
}
I may be mistaken, but you seem to be incrementing your address within the EEPROM by one instead of 4 (since each float requires 4 bytes).
Steve |
|
|
Steve H. Guest
|
|
|
Guest
|
|
Posted: Sun Jan 04, 2004 11:34 pm |
|
|
Thank you very much Steve, I thought I had taken the 4 byte conversion into account but not so.
The program works and just in time- it's -23.4 degrees C outside and now I can start recording my temperature sensors.
Thanks again and Seasons Greetins.
Al |
|
|
|
|
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
|