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.
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
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
>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.
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
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