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.
1. Schau dir mal die Adressierung im Datenblatt an!! 2. Schau mal deinen Schreibvorgang an!! Bring 1 und 2 in Deckung.
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
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
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ß!
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 ----------------------------------------------------
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.