Atmega 328 mit 24c08

Hallo,

ich speichere in einem i2c EEPROM 24c08 in den Adr. 0-150 div. Werte zwischen 0-255... was auch einwandfrei klappt.

nun möchte ich eine Datensicherung des Atmega328 EEPROMs auf den i2c EEPROM kopieren.
Vom Atmega möchte ich Adr. 0-200 auf den i2C EEPROM Adr. 200-400 kopieren.

Busadresse = 0x50

Dazu verwende ich folgenden Code:

for ( int i=0; i < 201; i++) { //Zaehler von 0-200

byte Wert = EEPROM.read(i); //Wert aus dem CPU EEPROM auslesen

delay(100);
Wire.beginTransmission(i2c_eeprom_adr); //Bus Kommunikation mit i2C Adresse beginnen..
Wire.write(200 +i); //auf welchem Speicher-Byte speichern senden
Wire.write(Wert); //welche Daten auf obiges Byte speichern..
Wire.endTransmission(); //Uebertragung beenden
delay(100);

int Prozent = (i * 100 / 200); //Berechnen des Fortschrittes in %

lcd.setCursor(0,0);
lcd.print(Prozent); lcd.print(F(" % kopiert"));
lcd.setCursor(0,1);
lcd.print(F("lese Adr: ")); lcd.print(i);
lcd.setCursor(0,2);
lcd.print(F("schreibe: ")); lcd.print(200 +i);
lcd.setCursor(0,3);
lcd.print(F(" Wert: ")); lcd.print(Wert); lcd.print(F(" "));
}

Mein Problem ist dass bei obigen Kopiervorgang die Daten des i2C EEPROM auf Adresse 0-150 überschrieben werden. Warum??

24c08 ist doch ein 8x1024, also müsste es die Adressen 0-1023 doch geben?
oder verstehe ich da was nicht richtig?

Datenblatt durchlesen, vor allem den Teil über Paging. Das EEPROM ist in Seiten/Blöcke zu je 256 Bytes aufgeteilt. Die Seite steckt in der Adresse drin.

Dem entsprechend ist das hier Unsinn:

Wire.write(200 +i);

Die Speicherzelle setzt sich aus der Seite in der Adresse in einem einzelnen Byte für die Zelle innerhalb der Seite zusammen

Also kann ich mit obigem Code nur die Speicherzellen 0-256 beschreiben?

Korrekt, wenn du Wire.write(i) machen würdest.

Wenn du 200 Bytes schreiben willst, aber nicht am Anfang, nimmst du einfachheitshalber die nächste Seite, dann musst du die Daten nicht über zwei Seiten verteilen.

Siehe auch die Anmerkungen unten rechts auf Seite 5:

Wobei das eher für Page Writes ist, also wenn man mehrere Bytes mit nur einer Adressierung schreibt. Du adressierst jedes Byte einzeln, aber dabei kannst du auch nur innerhalb einer Seite schreiben

OK vielen Dank!

Wobei es genaugenommen von 0-255 geht pro Seite geht :slight_smile:

Das sollte sich auch ganz einfach ausrechnen lassen:

void writeByte(unsigned int adr, byte data)
{
   byte page = adr / 256;
   Wire.beginTransmission(i2c_eeprom_adr | page);
   Wire.write(adr % 256);      
   Wire.write(data);    
   Wire.endTransmission();   
}

Nicht getestet, aber bei 400 hat man dann Seite 1, Zelle 144. 144 + 256 = 400

Hallo nochmal,

gibt es denn ein EEPROM in welches ich ohne PageWrite direkt z.B. die Adr. 0-600 direkt beschrieben kann, natürlich nur mit Werten von 0-255???

Vielen Dank!

Wo ist den das Problem dabei? Du kannst doch die Kombination aus Seite und Zelle einfach wie in #5 berechnen.

Man kann auch 256 Zellen am Stück beschreiben (z.B. aus einem Array) und danach einmal neu adressieren.