Forum: Mikrocontroller und Digitale Elektronik lesen/speichern 24C04


von andy (Gast)


Lesenswert?

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

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

@ wegstabenverbuchsler
>in deinem Assemblerprogramm in Zeile 43 wurde der falsche  Rotate-Befehl
>verwendet.

Es ist Zeile 42.

von andy (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>Es klappt ja eigentlich,

Dieses "eigentlich" ist ein Unwort. Denn es klappt ja
eigentlich nicht, sonst würde es eigentlich funktionieren.

von andy (Gast)


Lesenswert?

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

von H.Joachim S. (crazyhorse)


Lesenswert?

Das steht alles im Datenblatt.
Wenn du Hilfe willst, poste deinen Code.
Oder such alleine weiter.

von holger (Gast)


Lesenswert?

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

von gfdsgfsfs (Gast)


Lesenswert?

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

von H.Joachim S. (crazyhorse)


Lesenswert?

und ansonsten: 24C04!=24C04
Es wäre schön, wenn du auch noch sagst, welches Eeprom genau. Es gibt da 
z.T.erhebliche Unterschiede.

von holger (Gast)


Lesenswert?

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

von andy (Gast)


Lesenswert?

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

von usuru (Gast)


Angehängte Dateien:

Lesenswert?

> Hat jemand vielleicht ein Programm,das funktioniert

Siehe Anlage ...

von H.Joachim S. (crazyhorse)


Lesenswert?

Warum denke ich gerade, dass der Andy nicht unbedingt ein 
Assemblerprogramm für nen PIC sucht?

von usuru (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von andy (Gast)


Lesenswert?

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

von Mike R. (thesealion)


Lesenswert?

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.

von andy (Gast)


Lesenswert?

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

von andy (Gast)


Lesenswert?

Hallo,es handelt sich hier um ein Atmel 24C04 und nicht um ein
St 24C04.Ich verzweifel langsam daran.

gruss
andy

von usuru (Gast)


Lesenswert?

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)

von andy (Gast)


Lesenswert?

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

von stephan_ (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.