Testproject met EEPROM 24LCxxx gaat niet goed

algemene C code
Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor FonzieBonzo » 05 Jun 2017, 15:57

Hi,

Ik ben probeer twee functies te maken om een int naar en van een geheugen EEPROM 24LC256.
Nu dacht ik deze klaar te hebben tot dat ik een tweede int er naar toe wilde schijven.
Het is nu zelf zo dat als ik het schijven/lezen van de tweede int uitvoer, hij de eerste lees/schrijf int ook vernagelt terwijl dit
in mijn ogen niet zou moeten kunnen omdat het programma chronologisch de eerst int al heeft geschreven en gelezen.

Als ik mijn code uitvoer met exit(0) dan krijg ik :
Writing int test1: 1234
Reading int test1: 1234

En als ik het met exit(0), dus zonder het lezen/schijven van test2 dan krijg ik :
Writing int test1: 1234
Reading int test1: -11261
Writing int test2: 5432
Reading int test2: -11261

Snapt iemand dit ? ik ben al de hele dag binnen met dit mooie weer om het te begrijpen :mrgreen:

Gr,
Fonzie

c code
#include <Wire.h>

// i2c_eeprom memorry settings
#define EEPROM_ADDR 0x50 // I2C Buss address of 24LCxxx EEPROM
#define i2c_eeprom_speed 0
#define i2c_eeprom_step 3
void setup()
{
Wire.begin();
Serial.begin(9600);

unsigned int intvalue1 = 1234;
unsigned int intvalue2 = 5432;

Serial.print("Writing int test1: ");
Serial.print(intvalue1);
Serial.println();
i2c_eeprom_write_int(i2c_eeprom_speed, intvalue1);


Serial.print("Reading int test1: ");
Serial.print(i2c_eeprom_read_int(i2c_eeprom_speed));
Serial.println();

delay(5000);
//exit(0);

Serial.print("Writing int test2: ");
Serial.print(intvalue2);
Serial.println();
i2c_eeprom_write_int(i2c_eeprom_step, intvalue2);

Serial.print("Reading int test2: ");
Serial.print((int)i2c_eeprom_read_int(i2c_eeprom_step));
Serial.println();
}

void loop()
{
}

void i2c_eeprom_write_int( int eeaddress, unsigned int the_int )
{

byte b[4];
b[0] = (byte )((the_int >> 24) & 0xff);
b[1] = (byte )((the_int >> 16) & 0xff);
b[2] = (byte )((the_int >> 8) & 0xff);
b[3] = (byte )(the_int & 0xff);
Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // Address High Byte
Wire.write((int)(eeaddress & 0xFF)); // Address Low Byte

byte c;
for ( c = 0; c < 3; c++)
{
Wire.write(b[c]);
}
Wire.endTransmission();
}


int i2c_eeprom_read_int( int eeaddress )
{
Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // Address High Byte
Wire.write((int)(eeaddress & 0xFF)); // Address Low Byte
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDR, eeaddress);

byte b[4];
for ( int c = 0; c < 3; c++ )
{
if (Wire.available()) {
b[c] = Wire.read();
}
}
Wire.endTransmission();

unsigned int the_int = 0;
the_int = ((long )b[0]) << 24;
the_int |= ((long )b[1]) << 16;
the_int |= ((long )b[2]) << 8;
the_int |= b[3];
return the_int;
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor nicoverduin » 05 Jun 2017, 16:46

Je weet dat een int 2 bytes is? En geen 4
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor FonzieBonzo » 05 Jun 2017, 17:32

Hoi


Niet als je een Arduino Due hebt. Nou heb ik die niet :mrgreen: maar evengoed als ik er een long van maak stuit ik op het zelfde probleem.


Gr,
Fonzie

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor nicoverduin » 05 Jun 2017, 17:50

En je weet ook dat je maar 3 bytes leest terwijl je er 4 wegschrijft?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor FonzieBonzo » 05 Jun 2017, 18:34

Als je doelt op " for ( int c = 0; c < 3; c++ )" deze heb ik aangepast in " for ( int c = 0; c <= 3; c++ )" uit de read
Maar deze fout zat ook in de write functie.

Update van mijn code waar ik nog het zelfde probleem heb :

c code
#include <Wire.h>

// i2c_eeprom memorry settings
#define EEPROM_ADDR 0x50 // I2C Buss address of 24LCxxx EEPROM
#define i2c_eeprom_speed 0
#define i2c_eeprom_step 4
void setup()
{
Wire.begin();
Serial.begin(9600);

long longvalue1 = 1234;
Serial.print("Writing int test1: ");
Serial.print(longvalue1);
Serial.println();
i2c_eeprom_write_long(i2c_eeprom_speed, longvalue1);

Serial.print("Reading int test1: ");
Serial.print(i2c_eeprom_read_long(i2c_eeprom_speed));
Serial.println();

delay(5000);
//exit(0);

long longvalue2 = 5432;
Serial.print("Writing int test2: ");
Serial.print(longvalue2);
Serial.println();
i2c_eeprom_write_long(i2c_eeprom_step, longvalue2);

Serial.print("Reading int test2: ");
Serial.print((int)i2c_eeprom_read_long(i2c_eeprom_step));
Serial.println();
}

void loop()
{
}

void i2c_eeprom_write_long( int eeaddress, long the_long )
{

byte b[4];
b[0] = (byte)((the_long >> 24) & 0xff);
b[1] = (byte)((the_long >> 16) & 0xff);
b[2] = (byte)((the_long >> 8) & 0xff);
b[3] = (byte)(the_long & 0xff);
Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // Address High Byte
Wire.write((int)(eeaddress & 0xFF)); // Address Low Byte


for (int i = 0; i <= 3; i++)
{
Wire.write(b[i]);
}
Wire.endTransmission();
}


long i2c_eeprom_read_long( int eeaddress )
{
Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // Address High Byte
Wire.write((int)(eeaddress & 0xFF)); // Address Low Byte
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDR, eeaddress);

byte b[4];
for ( int i = 0; i <= 3; i++ )
{
if (Wire.available()) {
b[i] = Wire.read();
}
}
Wire.endTransmission();

long the_long = 0;
the_long = ((int)b[0]) << 24;
the_long |= ((int)b[1]) << 16 ;
the_long |= ((int)b[2]) << 8;
the_long |= (int)b[3] ;
return the_long;
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor Koepel » 05 Jun 2017, 19:41

Het adres voor binnen de eeprom in twee delen splitsen... ging dat per 'page' ? Volgens mij was daar iets mee.
Na een Wire.requestFrom() hoort geen Wire.endTransmission() meer.
Bij de Wire.requestFrom() is de tweede parameter het aantal, en niet het adres. Wanneer dat nul is, dan lees je ook echt nul bytes.
Het is niet toegestaan om tijdens het schrijven van bytes over de grens van de interne 'page' te gaan.
Na het schrijven is er even tijd nodig.

Je hoeft het wiel niet opnieuw uit te vinden, gebruik gewoon een library: https://github.com/JChristensen/extEEPROM. Die zit in de BibliotheekBeheerder, zoek naar 'exteeprom'.

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor FonzieBonzo » 05 Jun 2017, 19:45

YES finally !

Het lijkt er op dat ik niet snel van lezen naar schijven over mag stappen van de
I2C bus dus er zit nu een check in of er een delay van minimaal 10ms tussen zit en het werkt nu !

Gr,
Fonzie

c code
#include <Wire.h>

// i2c_eeprom memorry settings
#define EEPROM_ADDR 0x50 // I2C Buss address of 24LCxxx EEPROM
#define i2c_eeprom_speed 10
#define i2c_eeprom_step 4
unsigned long MinDelay = 0;


void setup()
{
Wire.begin();
Serial.begin(9600);

long longvalue1 = 1234;
Serial.print("Writing int test1: ");
Serial.print(longvalue1);
Serial.println();

i2c_eeprom_write_long(i2c_eeprom_speed, longvalue1);
Serial.print("Reading int test1: ");
Serial.print(i2c_eeprom_read_long(i2c_eeprom_speed));
Serial.println();

long longvalue2 = 5432;
Serial.print("Writing int test2: ");
Serial.print(longvalue2);
Serial.println();
i2c_eeprom_write_long(i2c_eeprom_step, longvalue2);

Serial.print("Reading int test2: ");
Serial.print((int)i2c_eeprom_read_long(i2c_eeprom_step));
Serial.println();
}

void loop()
{
}

void i2c_eeprom_write_long( int eeaddress, long the_long )
{
if (millis() - MinDelay < 10) delay(10);

byte b[4];
b[0] = (byte)((the_long >> 24) & 0xff);
b[1] = (byte)((the_long >> 16) & 0xff);
b[2] = (byte)((the_long >> 8) & 0xff);
b[3] = (byte)(the_long & 0xff);
Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // Address High Byte
Wire.write((int)(eeaddress & 0xFF)); // Address Low Byte

for (int i = 0; i <= 3; i++)
{
Wire.write(b[i]);
}
Wire.endTransmission();
MinDelay = millis();
}


long i2c_eeprom_read_long( int eeaddress )
{
if (millis() - MinDelay < 10) delay(10);

Wire.beginTransmission(EEPROM_ADDR);
Wire.write((int)(eeaddress >> 8)); // Address High Byte
Wire.write((int)(eeaddress & 0xFF)); // Address Low Byte
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDR, eeaddress);

byte b[4];
for ( int i = 0; i <= 3; i++ )
{
if (Wire.available()) {
b[i] = Wire.read();
}
}
Wire.endTransmission();

long the_long = 0;
the_long = ((int)b[0]) << 24;
the_long |= ((int)b[1]) << 16 ;
the_long |= ((int)b[2]) << 8;
the_long |= (int)b[3] ;

MinDelay = millis();


return the_long;
}

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor FonzieBonzo » 05 Jun 2017, 19:58

Hey dank je Koepel,

Ik zag dat onze berichten gelijkertijd kwamen.
Later zag ik ook dat er al een libary voor was maar ik kon het niet uitstaan waarom ik kreeg wat ik kreeg, je kent dan vast wel :mrgreen:

Jou andere punten ga ik nog aanpassen in mijn functies want ik ga natuurlijk nu wel mijn eigen gebruiken...


Bedankt & gr,
Fonzie
Laatst gewijzigd door FonzieBonzo op 05 Jun 2017, 20:31, in totaal 1 keer gewijzigd.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor Koepel » 05 Jun 2017, 20:20

Er komt nog best wat kijken bij een externe EEPROM. Wanneer je het wiel opnieuw gaat uitvinden, dan krijg je een wobbling wiel met losse spaken, een drooggelopen lager, en gemaakt van strokarton. Nu is het altijd handig om strokarton in huis te hebben (https://www.youtube.com/watch?v=2XjhcM6UIxY), maar gebruik nu maar gewoon die exteeprom library.

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: Testproject met EEPROM 24LCxxx gaat niet goed

Berichtdoor FonzieBonzo » 05 Jun 2017, 20:39

Hahaha

Maar ik heb als test met mijn functie nu al 999.999 geschreven en gelezen met 0 fouten!

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten