Testproject met EEPROM 24LCxxx gaat niet goed
11 berichten
• Pagina 1 van 2 • 1, 2
- FonzieBonzo
- Berichten: 118
- Geregistreerd: 01 Okt 2015, 11:54
- Woonplaats: Castricum
Testproject met EEPROM 24LCxxx gaat niet goed
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
Gr,
Fonzie
c code
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
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Testproject met EEPROM 24LCxxx gaat niet goed
Je weet dat een int 2 bytes is? En geen 4
- FonzieBonzo
- Berichten: 118
- Geregistreerd: 01 Okt 2015, 11:54
- Woonplaats: Castricum
Re: Testproject met EEPROM 24LCxxx gaat niet goed
Hoi
Niet als je een Arduino Due hebt. Nou heb ik die niet maar evengoed als ik er een long van maak stuit ik op het zelfde probleem.
Gr,
Fonzie
Niet als je een Arduino Due hebt. Nou heb ik die niet maar evengoed als ik er een long van maak stuit ik op het zelfde probleem.
Gr,
Fonzie
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Testproject met EEPROM 24LCxxx gaat niet goed
En je weet ook dat je maar 3 bytes leest terwijl je er 4 wegschrijft?
- FonzieBonzo
- Berichten: 118
- Geregistreerd: 01 Okt 2015, 11:54
- Woonplaats: Castricum
Re: Testproject met EEPROM 24LCxxx gaat niet goed
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
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;
}
Re: Testproject met EEPROM 24LCxxx gaat niet goed
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'.
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'.
- FonzieBonzo
- Berichten: 118
- Geregistreerd: 01 Okt 2015, 11:54
- Woonplaats: Castricum
Re: Testproject met EEPROM 24LCxxx gaat niet goed
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
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;
}
- FonzieBonzo
- Berichten: 118
- Geregistreerd: 01 Okt 2015, 11:54
- Woonplaats: Castricum
Re: Testproject met EEPROM 24LCxxx gaat niet goed
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
Jou andere punten ga ik nog aanpassen in mijn functies want ik ga natuurlijk nu wel mijn eigen gebruiken...
Bedankt & gr,
Fonzie
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
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.
Re: Testproject met EEPROM 24LCxxx gaat niet goed
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.
- FonzieBonzo
- Berichten: 118
- Geregistreerd: 01 Okt 2015, 11:54
- Woonplaats: Castricum
Re: Testproject met EEPROM 24LCxxx gaat niet goed
Hahaha
Maar ik heb als test met mijn functie nu al 999.999 geschreven en gelezen met 0 fouten!
Maar ik heb als test met mijn functie nu al 999.999 geschreven en gelezen met 0 fouten!
11 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten