www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik lesen/speichern 24C04


Autor: andy (Gast)
Datum:

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

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

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

Autor: holger (Gast)
Datum:

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

Es ist Zeile 42.

Autor: andy (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es klappt ja eigentlich,

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

Autor: andy (Gast)
Datum:

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

Autor: H.Joachim Seifert (crazyhorse)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: gfdsgfsfs (Gast)
Datum:

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

Autor: H.Joachim Seifert (crazyhorse)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: andy (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
> Hat jemand vielleicht ein Programm,das funktioniert

Siehe Anlage ...

Autor: H.Joachim Seifert (crazyhorse)
Datum:

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

Autor: usuru (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: andy (Gast)
Datum:

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

Autor: Mike R. (thesealion)
Datum:

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

Autor: andy (Gast)
Datum:

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

Autor: andy (Gast)
Datum:

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

gruss
andy

Autor: usuru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
;*** Byte write auf Speicher-Adresse 330 in 24C04

    call    i2c_on          ; Bus aktiv

    movlw   0xA2            ; 1010 0010      device adress
    call    i2c_tx          ; 24C04 zum Schreiben adressieren

    movlw   0x4A            ; low Teil der  Adresse
    call    i2c_tx

    movlw   d'17'           ; Wert der auf Adresse 330 soll, hier 17
    call    i2c_tx

Probier das mal, das geht bei mir (PIC und AT24C04)

Autor: andy (Gast)
Datum:

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

Autor: stephan_ (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.