mikrocontroller.net

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


Autor: kurtzz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Schau dir mal die Adressierung im Datenblatt an!!

2. Schau mal deinen Schreibvorgang an!!

Bring 1 und 2 in Deckung.

Autor: kurtzz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Terry Th. (pixelkaoz)
Datum:

Bewertung
0 lesenswert
nicht 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ß!

Autor: kurtzz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
----------------------------------------------------

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.