Hallo,ich habe das eeprom 24C04 hier im Einsatz.Verbindung klappt,lesen und speichern auch.MeinProblem ist,wenn ich an eine bestimmte Speicherstelle speichern oder lesen will. Ich starte also die Verbindung,sende Adresse und Schreibenbit. Danach sende ich z.b. eine 3 um Page 3 auszuwählen. Danach sende ich z.b. eine 9 um die 9 Speicheradresse auzuwählen. Danach sende ich z.b. den Wert 45. Der Wert wird aber auf Page 3 in speicherzelle 0 gespeichert. Das gleiche beim lesen.Ich schicke z.b.Page 5 Adresse 12 und gelesen wird Page 5 Adresse 0. Wenn ich mehrere Werte hintereinander sende oder lese,werden diese auch immer ab Adresse 0 gespeichert/gelesen.Programmiert wird in assembler. Wäre schön,wenn mir jemand helfen könnte. gruss andy
in deinem Assemblerprogramm in Zeile 43 wurde der falsche Rotate-Befehl verwendet. Außerdem ist in deiner zugehörigen Schaltung das Portbit 4 falsch angeklemmt, es muß ein 1.2 KOhm Widerstand zum Kondensator 3 geschaltet werden.
@ wegstabenverbuchsler >in deinem Assemblerprogramm in Zeile 43 wurde der falsche Rotate-Befehl >verwendet. Es ist Zeile 42.
Hallo,kann es sein das in deinem Hirn auch etwas falsch angeschlossen ist?:-) Es klappt ja eigentlich,es kann ja nur an der Adressierung der Speicherstelle liegen.Warum sollte ich also den ganzen Code oder Schaltplan anhängen?Adresse der Page nimmt er ja an nur nicht die Adresse der Speicherstelle,die aber genauso gesendet wird wie die Adresse der Page. Muss man bei der Adresse der Speicherstelle auf einer Page noch etwas zusätzlich senden. gruss andy
>Es klappt ja eigentlich,
Dieses "eigentlich" ist ein Unwort. Denn es klappt ja
eigentlich nicht, sonst würde es eigentlich funktionieren.
Hallo,müssen wir jetzt zu dieser späten Stunde über Rhetorik diskutieren? Wäre schön,wenn mir nur jemand sagen könnte,ob die Speicheradressen auf einer Page genauso gesendet wird wie die Pageadresse oder ob da noch ein Bit gesetzt werden muss. gruss andy
Das steht alles im Datenblatt. Wenn du Hilfe willst, poste deinen Code. Oder such alleine weiter.
>Wäre schön,wenn mir nur jemand sagen könnte,ob die Speicheradressen auf >einer Page genauso gesendet wird wie die Pageadresse oder ob da noch ein >Bit gesetzt werden muss. Bahnhof? Sagen wirs mal so: Du hast eine Pageadresse und einen Offset zu deinem Byte in deiner Page. Beim schreiben sowie auch beim lesen müssen Pageadresse und Offset zum Byte in der natürlich gleich sein.
der eeprom keinnt eigentlich nur eine lineare addrssierung und keine pages/adress kombinationen übertragen wird : Adresse dann Datenbyte bei pagewrite adresse datenbyte datenbyte datenbyte datenbyte datenbyte datenbyte in welcher page es liegt ist nur wichtig wenn man daten mit pagewrite über die pagegrößen schreibt ... ansonst ist das wurst byte by byte kannste lesen& schreiben wie du willst
und ansonsten: 24C04!=24C04 Es wäre schön, wenn du auch noch sagst, welches Eeprom genau. Es gibt da z.T.erhebliche Unterschiede.
>und ansonsten: 24C04!=24C04 >Es wäre schön, wenn du auch noch sagst, welches Eeprom genau. Es gibt da >z.T.erhebliche Unterschiede. Genau, zum Bleistift bei den Schreibzeiten. Wenn der OP die Schreibzeit nicht abwartet bevor er liest oder noch ein Byte schreibt dann kann das schon mal zu Murks führen. Da kein Code zur Verfügung steht schlage ich vor ihn einfach verhungern zu lassen und diesen Thread zu beenden.
Hallo,danke für die antworten. Ich möcht mir eine Tabelle im 24C04 abspeichern und muss hinterher auf bestimmte stellen zugreifen,also muss ich z.b auf Page 5 Stelle 11 zugreifen.Wie gesagt,Page 5 wird angenommen,Stelle 11 die mit der gleichen Routine gesendet wird aber nicht,geliefert wird der wert von Page5 Stelle 0.Hat jemand vielleicht ein Programm,das funktioniert,damit ich ausschliessen kann,ob der 24C04 defekt ist.Kann im Moment keine genaueren Angaben zum 24C04 machen oder Code schicken,da ich auf der Arbeit bin. gruss andy
> Warum denke ich gerade, dass der Andy nicht unbedingt ein > Assemblerprogramm für nen PIC sucht? Er hat nach einem funktionierenden Programm gefagt, dieses Prgramm funktioniert. Er hat nicht gesagt, ob er das für Mercedes, Opel oder Toyota will ...
Der 24C04 braucht ne 9Bit-Adresse. Das Adreßbit 8 wird mit in die I2C-Adresse verwurstet. Nach der I2C-Adresse+Bit8+Schreiben werden dann Adreßbit 7..0 gesendet. Und dann kommen die Daten. Oder ein Repeat-Start, I2C-Adresse+Bit8+Lesen und dann lesen. Im Datenblatt stehts nochmal ganz ausführlich. Peter
Hallo Peter danke für die antwort.Mit dem Datenblatt habe ich es ja soweit hinbekommen,bis auf die Speicheradressierung. Im Netz findet man einige Beispiele in Form von: Start Schreibadresse des EEPROMs high byte der adresse low Byte der adresse Mit high byte ist die Page Nummer gemeint,mit low byte die adresse auf der Page.Und genau das klappt nicht bei mir. Wenn ich zum beispiel die Speicherstelle 330 im 24C04 beschreiben will,was muss ich dann als Adresse senden? Ich sende zuerst 10100000,also eepromadresse und schreiben. Laut beispiel müsste ich jetzt eine 20 senden (high teil der adresse ,Page 20 fängt bei 321 an) und eine 10 als Adresse auf der Page (low teil der adresse. Oder habe ich das falsch verstanden. gruss andy
Ich würde sagen, das hast du komplett falsch verstanden. Das EEPROM erwartet Ein Adressbyte, bestehend aus Type Identifier, Device Adresse und einem Teil der gewünschten EEPROM Adresse, danach folgt ein Byte mit dem Rest der EEPROM Adresse und dann die Daten. In dem Datenblatt von ST, das ich mir gerade rausgesucht habe, findest dich das ab Seite 6. Die Pages sind nur dann interressant, wenn du mehr als 1 Byte in einem Druchgang schreiben willst. Dann mußt du darauf achten, das alle Adresse in der gleichen Page liegen, aber senden mußt du die Pageadresse nie.
Hallo,ich habe mich an den Code von Sprut.de versucht: ;**Schreibe Wert 5 auf Speicher-Adresse 3 in 24C04************* call i2c_on ; Bus aktiv movlw H'A0' ; 1010 0000 call i2c_tx ; 24C04 zum Schreiben adressieren movlw 0x00 ; high Teil der Adresse (Page) call i2c_tx movlw 0x03 ; low Teil der Adresse call i2c_tx movlw 0x05 ; Wert der auf Adresse 3 soll call i2c_tx Hier schickt er ja die Page adresse und dann die Speicheradresse. Könnte nicht jemand ein beispiel schreiben,was ich schicken muss um z.b. auf Speicherstelle 410 zu schreiben.Mein Englisch ist nicht so gut.Mit dem Datenblatt habe ich jetzt schon einige Tage gekämpft und es ja auch soweit hinbekommen,nur diese Adressierung kapier ich nicht. gruss andy
Hallo,es handelt sich hier um ein Atmel 24C04 und nicht um ein St 24C04.Ich verzweifel langsam daran. gruss andy
Beispiel mit Byte d'330' = 0x014A Das High-Bit (01) kommt in P0 der device-adress (Atmel 24C04 Dateblatt S.11) 1 0 1 0 A2 A1 P0 RW Wenn die Pins A2 und A1 beide 0 sind dann gilt:
1 | ;*** Byte write auf Speicher-Adresse 330 in 24C04 |
2 | |
3 | call i2c_on ; Bus aktiv |
4 | |
5 | movlw 0xA2 ; 1010 0010 device adress |
6 | call i2c_tx ; 24C04 zum Schreiben adressieren |
7 | |
8 | movlw 0x4A ; low Teil der Adresse |
9 | call i2c_tx |
10 | |
11 | movlw d'17' ; Wert der auf Adresse 330 soll, hier 17 |
12 | call i2c_tx |
Probier das mal, das geht bei mir (PIC und AT24C04)
Hallo,danke usuru,das wars.Das hab ich im Datenblatt nicht verstanden. Frage mich nur,was auf Sprut.de steht.Der sendet ja die Deviceadresse und dann noch 2 Adressen.Vielen Dank mein Problem ist gelöst und ich habs verstanden. gruss andy
Wenn Du mit PICs arbeitest, findest Du oben i2c.asm (allerdings mit 16-Bit Adressierung). Da musst Du für das 24C04 halt das Hi-Byte rausschmeissen und das 9. Bit in die Device-Adress reinbauen. Für andere Prozessoren ist der Programm-Ablauf absolut identisch, nur musst Du die Assembler-Befehle anpassen.
andy schrieb: > Der sendet ja die Deviceadresse > und dann noch 2 Adressen. Dann nimmt er mit Sicherheit einen größeren EEPROM. z.B. 24C32. Das mit den Bits in der I2C-Adresse geht nämlich nur bis zum 24C16. Peter
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.