Go Down

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

combie

#15
Jan 05, 2016, 12:15 pm Last Edit: Jan 05, 2016, 12:18 pm by combie
Herzlichen Dank!

Quote
Dein Testsketch bringt Ausgaben. fängt aber nicht mit 1 sondern mit 61 an.
Wenn es mit 61 anfängt, dann standen in der Zelle vorher schon Daten drin.
z.B. der Buchstabe "a"

Ansonsten sieht die erste Ausgabe gut aus!
Sehr gut.
Dein EEProm scheint zu funktionieren.
Meine Lib leider nicht.

Gut, dann werde ich nochmal ordentlich in mich gehen und die Wurst überprüfen.

Quote
EEprom Monitor Sketch alle Zellen mit 255 angezeigt bekomme? Als wenn da noch nie drauf geschrieben wurden wäre.
Hmm...
Ackert der EEprom Monitor Sketch nicht auf dem im AVR eingebautem EEProm rum?
Bzw: Ich habe KA, welches Script du meinst...

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

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

bin ich völlig gahgah? I2C Verbindung getrennt. Dein Sketch bringt
received NACK on transmit of address
Meldung.
I2C Verbindung wieder hergestellt und zusätzlich 5,6k Pullups eingesetzt und neu geflasht.
Startet bei 1. Nach nochmaliges Flash zählt er allerdings weiter und fängt nicht mehr bei 1 an.
Scheint zu funktionieren wie gewünscht.

Quote
Starte lesen
0:success
5 gelesen
Starte schreiben
0:success
6 geschrieben
Starte lesen
0:success
6 gelesen
Starte schreiben
0:success
7 geschrieben
Starte lesen
0:success
7 gelesen
Starte schreiben
0:success
8 geschrieben
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

#17
Jan 05, 2016, 12:21 pm Last Edit: Jan 05, 2016, 12:36 pm by Doc_Arduino
Ackert der EEprom Monitor Sketch nicht auf dem im AVR eingebautem EEProm rum?
Bzw: Ich habe KA, welches Script du meinst...

Hatte die Adresse 0x50 eingestellt zum auslesen und Endaddresse spaßenshalber auf 4095 belassen. Ohne zu murren lass er bis zum Ende 255 aus. Hätte bei 1023 Ende sein müssen.
Er liest auch jetzt noch bis 4095 den Wert 255 aus. ???

Mein Mega2560  hat genau die 4k.
Der 24C08 hat nur 1k.
So langsam werde ich wieder stutzig.


Code: [Select]
/*
Arduino Mega2560
RTC DS3231 (0x68) mit AT24C32 EEprom (0x57)

EEprom wird komplett ausgelesen und im Terminalfenster dargestellt
AT24C32: 32kbits = 32768 bits = 4kByte  |  Speicherbereich 0 ... 4095
*/

#include <Wire.h>
#define AT24C32  0x50  
#define Startadresse  0
#define Endeadresse   1023

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  
  unsigned int adr = 0;
  
  for (unsigned int adr = Startadresse; adr <= Endeadresse; adr++)
    {
      int a;
      // Dezimal
      a = leseEEprom(AT24C32, adr);
      if ( (adr == 0) || (adr % 8 == 0) )
        Serial.print(int2dez(adr, 4) + ": ");  // zeige Speicheradresse
        
      Serial.print(int2dez(a, 3) + " ");       // zeige Daten Byte
      
      if ( (adr + 1) % 8 == 0)
        Serial.println();                     // wenn Zeile mit Byte komplett
      
      /*
      // Hexadezimal
      a = leseEEprom(AT24C32, adr);
      if ( (adr == 0) || (adr % 8 == 0) )
        Serial.print(int2hex(adr, 4) + ": ");  // zeige Speicheradresse
        
      Serial.print(int2hex(a, 3) + " ");       // zeige Daten Byte
      
      if ( (adr + 1) % 8 == 0)
        Serial.println();                      // Zeilenvorschub wenn Zeile mit Byte komplett
      */  
    }  
}

void loop()
{
  
}


// int > dez Konvertierung mit Stellenanzahl
String int2dez(int wert, int stellen)
{
  String temp = String(wert);
  String prae = "";
  int len = temp.length();
  int diff = stellen - len;
  for (int i = 0; i < diff; i++)
    prae = prae + "0";
  return prae + temp;
}  


// int > hex Konvertierung mit Stellenanzahl
String int2hex(int wert, int stellen)
{
  String temp = String(wert, HEX);
  String prae = "";
  int len = temp.length();
  int diff = stellen - len;
  for (int i = 0; i < diff; i++)
    prae = prae + "0";
  return prae + temp;
}  



byte leseEEprom(int I2C_Adresse, unsigned int speicherAdresse)
{
  byte data = 0xFF;
  Wire.beginTransmission(I2C_Adresse);           // Connect
  Wire.write( (byte)(speicherAdresse >> 8)   );  // MSB
  Wire.write( (byte)(speicherAdresse & 0xFF) );  // LSB
  Wire.endTransmission();                        // Disconnect
  Wire.requestFrom(I2C_Adresse, 1);              // Daten vom Slave anfordern
  if (Wire.available()) data = Wire.read();      // Daten vorhanden?
  return data;
}  
  

void schreibeEEprom(int I2C_Adresse, unsigned int speicherAdresse, byte data)
{
  Wire.beginTransmission(I2C_Adresse);          // Connect
  Wire.write( (byte)(speicherAdresse >> 8)   ); // MSB
  Wire.write( (byte)(speicherAdresse & 0xFF) ); // LSB
  Wire.write(data);                             // data Byte zum speichern senden
  Wire.endTransmission();                       // Disconnect
  delay(5);
}  
  

  
  
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

#18
Jan 05, 2016, 12:37 pm Last Edit: Jan 05, 2016, 12:44 pm by combie
Deine Funktionen nutzen das 2 Byte Adressenverfahren.
Das tuts bei einem 24C32, aber nicht bei einem 24C08.

Der 24C08 verteilt seine 256Byte "Blöcke" auf mehrere Geräte Adressen.

Mit einem I2C Scanner solltest du das auch sehen können.
Ein 24C32 belegt 1 Adresse, ein 24C08 eine ganze Hand voll.



Quote
Mein Mega2560  hat genau die 4k.
Das interne EEProm funktioniert ganz anders, nicht über I2C.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

http://forum.arduino.cc/index.php?topic=197360
mit dem Bus Scanner bekomme ich 4 Adressen angezeigt.
0x50 ... 0x53. Es ist nur der 24C08 am Bus angeschlossen.

Ich verliere langsam den Überblick. Ganz ehrlich.
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

#20
Jan 05, 2016, 01:14 pm Last Edit: Jan 05, 2016, 07:43 pm by combie
Quote
mit dem Bus Scanner bekomme ich 4 Adressen angezeigt.
0x50 ... 0x53. Es ist nur der 24C08 am Bus angeschlossen.
Richtig!
der  24C08 belegt 4 Adressen mit je 256 Byte Speicher dahinter.
Macht zusammen 1 KiloByte.
Oder eben 8 KiloBit



Quote
Ich verliere langsam den Überblick. Ganz ehrlich.
Das ist normal, geht mir dauernd so .....
 :o
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

okay soweit. Demnach ist das kleine Ding etwas schwieriger anzusprechen als andere EEproms mit nur einer Device Adresse. Noch eine Frage. Woher weist du das die Deviceadresse 0x50 ist? Ich lese das aus dem Datenblatt nicht heraus. Lese immer nur von 1010 MSB. 0x50 sind aber 0101.0000

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

#22
Jan 05, 2016, 02:31 pm Last Edit: Jan 05, 2016, 02:48 pm by combie
Quote
Lese immer nur von 1010 MSB. 0x50 sind aber 0101.0000
0b01010XXX
Wobei die XXX den A2,A1,A0 Eingängen vieler EEproms entsprechen.
Bei deinem 24C08 ist E der A2 Eingang

Also gilt für dein EEPROM
Startadresse: 0b01010000 mit E auf GND
Startadresse: 0b01010100 mit E auf Vcc

Gegenprobe:
Löte E auf Vcc, dann beginnen die Adressen mit 0x54


Ach ja: (was auch noch zur Verwirrung beiträgt)
Wire schiebt die GeräteAddresse um einen nach links, und klebt das r/w Bit an Position Null.
Das r/w Bit bleibt uns Arduino Usern verborgen.


PS:
Ich finde diesen s*heiß Fehler in meiner Lib nicht!

Ich glaube, ich muss stark umbauen und unmengen Debug Kommandos einbauen....
Mal schauen, wie ich das in den Griff bekomme...




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

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

Tatsache. E auf (+) und 0x54 ... 0x57.  Wahnsinn. Ich tue mich da echt schwer mit dem Datenblatt.
Hauptsache du blickst durch für deine Lib.  :)

Ich habe nur ein Problem. Auf Seite 3 steht.
7 ............................. 0
1 0 1 0 E A9 A8 RW

Du schreibst immer von 0 1 0 1 ....  was scheinbar stimmt. Nur warum ist die Bitfolge anders?
Ist das Datenblatt aus Post #4  das falsche?


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

#24
Jan 05, 2016, 02:55 pm Last Edit: Jan 05, 2016, 02:55 pm by Doc_Arduino
Hallo,

das verschobene RW Bit hat mich letztens bei meinem Datalogger Projekt auch zur Verzweiflung gebracht. Als mir das egal war und ich es nicht mehr beachtet habe, funktionierte dennoch alles. Also habe ich mich nicht weiter darum gekümmert. Das EEprom vom 3231 RTC Modul kam zum Einsatz.

Deine Lib funktioniert bei all deinen EEproms nur nicht bei meinem süßen kleinen? Nur zum Verständnis für mich.

Wenn ich irgendwas testen soll, nur zu. Das Ding ist schnell verkabelt.

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

#25
Jan 05, 2016, 03:09 pm Last Edit: Jan 05, 2016, 03:15 pm by combie
Quote
Deine Lib funktioniert bei all deinen EEproms nur nicht bei meinem süßen kleinen? Nur zum Verständnis für mich.
Ich habe hier nur einige EEProms mit 2 Byte Addressmodus.
Z.B. das AT24C32 auf der RTC
Die funktionieren. (kannst gerne mal testen)

Wichtig ist mir, den 1 Byte Addressmodus zu testen.
Und genau die Chance bietest du mir mit deinem kleinen EEProm ;-)


Quote
Du schreibst immer von 0 1 0 1 ....  was scheinbar stimmt. Nur warum ist die Bitfolge anders?
Wire schiebt die von mir angegebene Adresse um 1 Bit nach links, um Platz für das r/w Bit zu bekommen.
Und damit stimmt das Resultat dann mit dem Datenblatt überein.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

#26
Jan 05, 2016, 03:34 pm Last Edit: Jan 05, 2016, 03:37 pm by Doc_Arduino
Hallo,

okay. Mit dem Bit verschieben ist wirklich verwirrend.
Das zeigt der I2C Scanner auch die verschobene Arduinische Adresse an?
Außerhalb der Arduino IDE fliegt man damit auf die Schnauze?

Das Bsp. CharArray mit meinem RTC3231 Modul
AT24C32<0x57> eep; // Das EEProm auf der china üblichen RTC, default Adresse 0x50 (80)

Vielleicht solltest du den Kommentar ändern. Oder hat das einfachere RTC 1307 Modul 0x50?

bringt:

Quote
EE Prom lenth: 4096
EE Prom ist bereit!
eep.get()  70160
fastBlockRead 27124
Dieses ist ein total langer Teststring. Eigentlich muesste hier ein ganzer Roman stehen.
paßt alles.  :)
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

#27
Jan 05, 2016, 03:47 pm Last Edit: Jan 05, 2016, 03:51 pm by Doc_Arduino
Hallo,

wegen dem Fehler für den ST24C08. Vielleicht haste was übersehen? Die AT24C08 und ST24C08 unterscheiden sich vielleicht nochmehr als nur in der Device Adressierung.  ???
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
paßt alles.
Fein!
Danke.


Quote
Oder hat das einfachere RTC 1307 Modul 0x50?
Ja! (zumindest meine)
Vielleicht sollte ich den Kommentar konkretisieren.
;-)

Quote
Außerhalb der Arduino IDE fliegt man damit auf die Schnauze?
Alle mir bekannten Libs, auf allen mir bekannten Systemen, arbeiten mit der 0x50 o.ä.

Erst wenn man selber an den Registern fummelt, seine eigenen I2C Routinen schreibt, kommt man mit der "Wahrheit", mit der verschobenen Addresse incl. r/w, in Berührung.

8)  Wire schützt uns davor, das Datenblatt zu verstehen!  8)


Quote
Die AT24C08 und ST24C08 unterscheiden sich vielleicht nochmehr als nur in der Device Adressierung.
Das habe ich schon mehrfach gemacht, werde ich aber nochmal tun.
Sie unterscheiden sich etwas in den Pins, und ihrer Nutzung, auch in den Wartezeiten nach dem Schreiben.
Aber Softwaretechnisch sollten sie sich identisch ansprechen lassen.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie

#29
Jan 05, 2016, 06:19 pm Last Edit: Jan 05, 2016, 06:21 pm by combie
So!
Wieder ein wichtiger Schritt!

Es gibt jetzt ein Beispiel Debug, welches viele Ausgaben macht.
Dieses schreibt an die EEProm Adresse 250 usw um den Blockwechsel zu testen.


Habe einen fetten Bock in der Lib gefunden:
! Auch das Template-Switch-Case Konstrukt bedarf eines break; !
Grrr .... (tausend mal drüber geschaut, immer übersehen)


Die frische Zip liegt auf dem Server.
Jetzt hoffe ich mal, dass die Lib läuft!


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

Quelle: Joseph Joubert

Go Up