I2C Eeprom 24C16 - Speicherproblem

Gast #1126399
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.
Angehängte Dateien:
Gast #1126426
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
Gast #1126440
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
#1126443
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ß!
Gast #1127810
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
----------------------------------------------------
Gast #1127814
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren