Forum: Mikrocontroller und Digitale Elektronik I2C Eeprom 24C16 - Speicherproblem


von kurtzz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo die Herren!
Ich habe ien Verständnisproblem zum Speicherplatz in seriellen Eeproms. 
Laut Datenblatt sollte in einen 24C16-Eeprom 16kBit also 2048-Byte 
reinpassen. So weit so gut - tun sie aber nicht ?:-|
Im Beispielprogramm werden 2000 Byte geschrieben, immer 8x die gleiche 
Zahl hintereinander dann wird ein hochgezählt, also von 
0,0,0,0,0,0,0,0,1,1,1... ...1,2,2,2... bis 250 = 2000 Werte.
Es werden jedoch nur 256 unterschiedliche Werte gelesen, wie im Anhang 
zu erkennen ist. Ab da an wird nicht mehr richtig gelesen bzw. ist nicht 
richtig geschrieben worden oder passen gar nur 256 Werte, als 256 Byte 
rein ??

Kann mir jemand auf die Sprünge helfen und zeigen, wo ich ein Brett vorm 
Kopf habe? Bitte !!!

Vielen Dank
kurtzz

Umfeld:
Ich will eine Temperatur-, Feuchte- und Lüftungssteuerung mit 
Datenlogger für eine Woche für ein Gewächshaus bauen. Es funktioniert 
soweit alles mit den Sensoren usw. für die Entwicklung habe ich ein 
Pollin-Board mit ATMega16 und einen 24C16 Eeprom drauf.

von hans (Gast)


Lesenswert?

1. Schau dir mal die Adressierung im Datenblatt an!!

2. Schau mal deinen Schreibvorgang an!!

Bring 1 und 2 in Deckung.

von kurtzz (Gast)


Lesenswert?

Hallo Hans!
Ich gehe schon davon aus, dass der Fehler bei mir liegt. Aber seit 3 
Tagen bastel ich an diesem Problem rum und sehe inzwischen den Wald vor 
Bären nicht mehr.
Kannst du mir bitte etwas genauer sagen, wo der Fehler liegt?

Gruß aussm Wald
kurtzz

von hans (Gast)


Lesenswert?

Das EEProm hat Seiten mit 256 Byte, die sprichst du mit dem
Adressbyte (2 Byte bei Übertragung) an.
Um 2048 Byte zu speichern sind 8 Seiten nötig.
Du verwendest jedoch nur eine davon (aber das funktioniert richtig!)!

Fehler: die Slaveadresse ist nicht A0 wie du programmiert hast
sondern 1010 als Slave nnn als Seitenadresse und R/W lt.I²C

du must also in die Slaveadresse die Seitenangabe einarbeiten.

sadr=0xa0 + (Speicherstelle/256)*2 + R/W

gruß hans

von Terry T. (pixelkaoz)


Lesenswert?

Hi,
also ich würd an deiner Stelle mal schauen, ob das mit der Umschaltung 
zwischen den Pages richtig funktioniert. Also wenn ich es recht in 
Erinnerung habe, dann ist das EEPROM in 8 Pages mit jeweils 256 Byte 
organisiert und das würde sich dann so in etwas auch mit dem ergebnis 
deiner Ausgabe decken...

So mal als spontane Idee...

Gruß!

von kurtzz (Gast)


Lesenswert?

Super.
Der Wald hat sich gelichtet. Vielen Dank den Holzhackrburn ;-)

Ab Adresse 257 spricht man sowohl beim lesen als ach beim schreiben den 
Adressbereich 1010 001 0 = 162 an, ab 513 dann Adressbereich 1010 010 0 
= 164 usw.
---------------------------------------------
Für andere Waldmenschen:
Fürs Schreiben:
  For A = 0 To 255
     I = A / 8
     V = Int(i)
     Print "WRITE: A: " ; A ; " - V:" ; V
     I2cstart
     I2cwbyte 160                                           '160 = Page0
     I2cwbyte A                                             'Adresse
     I2cwbyte V                                             'Schreibe 
Wert
     I2cstop
     Waitms 10
  Next A
  For A = 256 To 511
     I = A / 8
     V = Int(i)
     Print "WRITE: A: " ; A ; " - V:" ; V
     I2cstart
     I2cwbyte 162                                           '162 = Page1
     I2cwbyte A                                             'Adresse
     I2cwbyte V                                             'Schreibe 
Wert
     I2cstop
     Waitms 10
  Next A
  For A = 512 To 767
     I = A / 8
     V = Int(i)
     Print "WRITE: A: " ; A ; " - V:" ; V
     I2cstart
     I2cwbyte 160                                           '164 = Page2
     I2cwbyte A                                             'Adresse
     I2cwbyte V                                             'Schreibe 
Wert
     I2cstop
     Waitms 10
  Next A
------------------------------------------------------
Für das Lesen entsprechend:
  For A = 0 To 255
     I2cstart
     I2cwbyte 160                                           '160 = Page0
     I2cwbyte A                                             'Adresse
     I2cstart
     I2cwbyte 161
     I2crbyte V , Nack                                      'lesen
     I2cstop
     Waitms 10
     Print "READ: A: " ; A ; " - V:" ; V
  Next A
  For A = 256 To 511
     I2cstart
     I2cwbyte 162                                           '162 = Page1
     I2cwbyte A                                             'Adresse
     I2cstart
     I2cwbyte 161
     I2crbyte V , Nack                                      'lesen
     I2cstop
     Waitms 10
     Print "READ: A: " ; A ; " - V:" ; V
  Next A
  For A = 512 To 767
     I2cstart
     I2cwbyte 164                                           '164 = Page2
     I2cwbyte A                                             'Adresse
     I2cstart
     I2cwbyte 161
     I2crbyte V , Nack                                      'Lesen
     I2cstop
     Waitms 10
     Print "READ: A: " ; A ; " - V:" ; V
  Next A
----------------------------------------------------

von hans (Gast)


Lesenswert?

Genau!!
Und jetzt noch die ganze sache mit Rechnen statt IF.

Das 24C16 besteht eigentlich aus 8 x 24C02 (mit je 256 Byte).
Diese konten über die Adresspins kodiert werden auf
8 unterschiedliche Adressen. Beim 24C16 sitzen diese 8 C02
jetzt in einem Gehäuse, die Art der Adressierung wurde beibehalten.
Größere Ausführungen haben dann 2 Byte für die Adressierung und
sind daher meist leichter zu beherschen.

Dank für die Rückmeldung

hans

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.