Go Down

Topic: [Projekt] I2C EEPROM (Read 4860 times) previous topic - next topic

combie

Jan 04, 2016, 01:21 pm Last Edit: Oct 22, 2018, 12:08 pm by combie
Hi.

Hier möchte ich euch mal meine neueste Errungenschaft vorstellen.
Eine Library für I2C EEProms.

Perfekt ist sie ganz sicher noch nicht, aber bereit für die ersten Tests im Feld.

Download: siehe Anhang
Eine kleine Doku findet sich in der Zip Datei.


Ich setze hier stark auf "Templates".
Das zeigt sich schon bei der Instanziierung der Objekte:
Code: [Select]
AT24C32<> eep; // Das EEProm auf der china üblichen RTC, default Adresse 0x50 (80)
Code: [Select]
AT24C32<0x51> eep; // Alternative Adresse (A0 = High)

Das sorgt, bei der Verwendung von mehreren EEProms, für etwas mehr Code im Flash. Spart dagegen einiges an Ram ein.
(Und vor allen Dingen erspart es mir viel Schreibarbeit)

Was mir bei anderen Libs teilweise fehlte, und hier jetzt funktionieren soll:
1. Weitgehende Kompatibilität mit der original Arduino EEPROM Lib
2. Viele EEProms abdecken
3. Schreiben und Lesen im Page Modus, nicht nur einzelne Bytes
4. Nutzen der Wartezeit, nach dem Schreiben


Ich würde mich freuen, wenn ihr die Lib mal testen könntet. Gerade von den kleineren EEProms habe ich keine da. Gerne nehme ich auch Vorschläge für EEProms an, welche noch in der Liste aufgenommen werden sollen.

Die Doku ist noch etwas "schwach". Auch hier würde ich mich über Vorschläge freuen, wie man diese etwas klarer bekommt.

Bitte spart nicht mit Kritik!


Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

uwefed

Quote
Bitte spart nicht mit Kritik!
Das mußtest Du nicht extra sagen  ;)  ;)  ;)  ;)
Hätten wir sowieso gemacht.
Grüße   Uwe

Doc_Arduino

#2
Jan 04, 2016, 03:59 pm Last Edit: Jan 04, 2016, 04:00 pm by Doc_Arduino
Hallo,

ist ein ST 24C08 klein genug? Ich würde das mal testen.
Finde das eine feine Sache von Dir.


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#3
Jan 04, 2016, 04:27 pm Last Edit: Jan 04, 2016, 04:38 pm by combie
Hallo,

ist ein ST 24C08 klein genug? Ich würde das mal testen.
Finde das eine feine Sache von Dir.
Das ist genau richtig, zum testen.

Der Baustein ist schon in der Lib  definiert, unter dem Namen ST24C08. In der Doku noch nicht aufgenommen, weil die Bezeichnung wohl demnächst auf M24C08 geändert werden wird.


Beispiel:
Code: [Select]
#include <Wire.h>
#include <I2C_EEPROM.h>




ST24C08<> eep; // STMicroelectronics M24C08  auf default Adresse 0x50

void setup()
{
   Serial.begin(9600);
   Wire.begin();
 
   // die Speichergröße des EEProm wird in der Klasse gespeichert
   // kann also ausgelesen werden, ohne dass das EEProm wirlich
   // bereit ist
   Serial.print("EE Prom lenth: ");
   Serial.println(eep.length());

   if(eep.ready()) // eeprom bereit ?
   {
      // eeprom wurde gefunden, und ist bereit
      Serial.println ("EEProm ist bereit!");
   }else
   {
      // eeprom hat nicht geantwortet
      // Auch direkt nach dem schreiben blockiert das eeprom ein paar ms
      Serial.println("EEProm ist nicht bereit, Verkabelung prüfen ");
   }
}

void loop()
{

}
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

#4
Jan 04, 2016, 04:37 pm Last Edit: Jan 04, 2016, 04:44 pm by Doc_Arduino
Hallo,

bin gerade am Aufbau und verkabeln. Bin aber jetzt total verunsichert was ich mit den Pins
PRE, E und Mode machen muß.  Genau genommen habe ich hier einen ST 24C08WP

Edit:
wenn ich den Sketch von oben kompliere, erhalte ich Warnungen. IDE 1.6.7  auf Mega2560

Quote
In file included from C:\Users\Worker\AppData\Local\Temp\arduino_c9d36c1d8c7605f5d3b249f4cd568f68\sketch_jan04a.ino:2:0:

C:\Users\Worker\Documents\Arduino\libraries\I2C_EEPROM/I2C_EEPROM.h:42:94: warning: large integer implicitly truncated to unsigned type [-Woverflow]

 template<uint8_t I2CADDRESS=0x50> class AT24C512  : public  eephandler<I2CADDRESS,65536U,2,32>{};

                                                                                              ^

C:\Users\Worker\Documents\Arduino\libraries\I2C_EEPROM/I2C_EEPROM.h:49:92: warning: large integer implicitly truncated to unsigned type [-Woverflow]

 template<uint8_t I2CADDRESS=0x50> class M24512  : public  eephandler<I2CADDRESS,65536U,2,32>{};


                                                                                            ^


Der Sketch verwendet 4.316 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 253.952 Bytes.
Globale Variablen verwenden 488 Bytes (5%) des dynamischen Speichers, 7.704 Bytes für lokale Variablen verbleiben. Das Maximum sind 8.192 Bytes.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#5
Jan 04, 2016, 04:47 pm Last Edit: Jan 04, 2016, 04:48 pm by combie
Quote
warning: large integer implicitly truncated to unsigned type
Danke!
Wird in der nächsten Version behoben sein.
Bis dahin bitte keine 24C512 nutzen.

Die Meldung steht der Nutzung kleinerer EEProms nicht im Wege.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

so, habe jetzt

Pin 1 "PRE"  auf Masse
Pin 3 "E"      auf Masse
Pin 7 "MODE"  auf Masse

gelegt und mit Warnungen geflasht. Ergebnis:

Quote
EE Prom lenth: 1024
EEProm ist bereit!

Reicht das?
Nochwas testen?
Irgendwas schreiben und wieder lesen?

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

Quote
Irgendwas schreiben und wieder lesen?
Gerne!
  8)  hoffentlich gelingt das  8)
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie

Wird in der nächsten Version behoben sein.
So, der Fehler ist behoben.

Nochmal Danke, dafür.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

#9
Jan 04, 2016, 08:12 pm Last Edit: Jan 04, 2016, 08:13 pm by Doc_Arduino
Hallo,

ist die online Version schon aktuell? Weil ich bekomme immer noch die gleichen Warnungen.

Das Bsp. CharArray mit
ST24C08<> eep;

Sollte hier nicht der Text vom String stehen?

Quote
EE Prom lenth: 1024
EE Prom ist bereit!
eep.get()  294308
fastBlockRead 50732


Wenn du nochmal sagst, jetzt sollte es passen, versuche ich schreiben und lesen.  :)

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#10
Jan 04, 2016, 08:31 pm Last Edit: Jan 04, 2016, 08:32 pm by combie
Quote
ist die online Version schon aktuell?
Eigentlich ja!
Müssten auch eigentlich behoben sein.

Quote
Weil ich bekomme immer noch die gleichen Warnungen.
Die Meldungen kann ich nicht reproduzieren.
Aber das kommt noch!
Wie gesagt, der Überlauf zeigt sich nur bei 512 KBit EEProms. Und Auswirkungen hat er sowieso nicht.
Also kein Problem bei kleineren.



Die Ausgabe von  CharArray sollte so aussehen!
Code: [Select]

EE Prom lenth: 4096
EE Prom ist bereit!
eep.get()  68980
fastBlockRead 33640
Dieses ist ein total langer Teststring. Eigentlich muesste hier ein ganzer Roman stehen.

*getestet mit AT24C32*

Schreiben und lesen ist da eigentlich schon drin.

Da scheint noch ein Wurm zu stecken......
Du hast keine Ausgabe?





Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

#11
Jan 04, 2016, 08:40 pm Last Edit: Jan 04, 2016, 08:40 pm by Doc_Arduino
Hallo,

ich hab die Lib nochmal runterladen und an Ort und Stelle gepackt. Also. Die Warnungen sind weg.
Wer weis was ich verhauen hatte.  :)


Nur der Text vom String fehlt noch.

EE Prom lenth: 1024
EE Prom ist bereit!
eep.get()  294308
fastBlockRead 50732





Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#12
Jan 05, 2016, 11:36 am Last Edit: Jan 06, 2016, 02:13 pm by combie
Tja.....
Das ist ja spannend!

Noch bereit, zum Testen?

Erstmal schauen, ob dein EEProm das tut, was es tun muss!


Hier mal ein Testprogramm, ganz ohne meine Lib:

Code: [Select]
#include <Wire.h>

void meldung(byte fehler)
{
  switch(fehler)
  {
    case 0 : Serial.println("0:success"); break;
    case 1 : Serial.println("1:data too long to fit in transmit buffer"); break;
    case 2 : Serial.println("2:received NACK on transmit of address"); break;
    case 3 : Serial.println("3:received NACK on transmit of data"); break;
    case 4 : Serial.println("4:other error"); break;

    // eigene Fehler
    case 100 : Serial.println("100:Keine Daten gelesen"); break;
    default : Serial.print(fehler);Serial.println(":unbekannt"); break;
  } 
}

const uint8_t M24C08_addr = 0x50;

uint8_t eepread(uint16_t address)
{
   int Adresse =  M24C08_addr + (address >> 8);
   Wire.beginTransmission(Adresse);
   Wire.write(address & 0x00ff);       
   meldung(Wire.endTransmission());   
   Wire.requestFrom(Adresse,1);
    if(Wire.available()) return Wire.read();
   meldung(100);
}

uint8_t eepwrite(uint16_t address, uint8_t value)
{
   int Adresse =  M24C08_addr + (address >> 8);
   Wire.beginTransmission(Adresse);
   Wire.write(address & 0x00ff);       
   Wire.write(value);       
   meldung(Wire.endTransmission()); 
   delay(30); 
}


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

   Serial.println("Starte lesen");
   byte data = eepread(0);
   Serial.print(data,HEX);
   Serial.println(" gelesen ");

   data++;   
   Serial.println("Starte schreiben");
   eepwrite(0,data);
   Serial.print(data,HEX);
   Serial.println(" geschrieben ");
}

void loop() {}


Bei jedem Druck auf den Resetknopf sollte eine Zelle im EEProm hochzählen.

Die Ausgabe sollte so aussehen:
Nach dem ersten Reset:
Quote
Starte lesen
0:success
ff gelesen  <<-- leereZellen sind immer 0xff
Starte schreiben
0:success
0 geschrieben
Nach dem zweiten Reset:
Quote
Starte lesen
0:success
0 gelesen  <<-- leereZellen sind immer 0xff
Starte schreiben
0:success
1 geschrieben
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

so lange ich Zeit habe teste ich gern mit dir. Mein Schwippbogen mit Helligkeitssteuerung ist fertig. Werde ich noch vorstellen.

Dein Testsketch bringt Ausgaben. fängt aber nicht mit 1 sondern mit 61 an.

Quote
Starte lesen
0:success
61 gelesen
Starte schreiben
0:success
62 geschrieben
Starte lesen
0:success
62 gelesen
Starte schreiben
0:success
63 geschrieben
Starte lesen
0:success
63 gelesen
Starte schreiben
0:success
64 geschrieben
Starte lesen
0:success
64 gelesen
Starte schreiben
0:success
65 geschrieben
Starte lesen
0:success
65 gelesen
Starte schreiben
0:success
66 geschrieben

Jetzt dachte ich das hängt mit dem Page-Mode zusammen. Habe Mode auf + gelegt, was Multibyte Write entspricht, aber da kommt nur Müll raus.

Quote
Starte lesen
0:success
66 gelesen
Starte schreiben
3:received NACK on transmit of data
67 geschrieben
Starte lesen
0:success
66 gelesen
Starte schreiben
3:received NACK on transmit of data
67 geschrieben

Habe Mode wieder auf Masse gelegt für Page Mode.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

ackern wir wirklich auf dem kleinen EEProm rum? Ich frage, weil ich mit Adresse 0x50 beim reinen auslesen mit dem EEprom Monitor Sketch alle Zellen mit 255 angezeigt bekomme? Als wenn da noch nie drauf geschrieben wurden wäre.

Und dieser "Device Select Code" auf Seite 3 im Datenblatt macht mich auch langsam stutzig. Als wenn man den anders ansprechen muß.


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up