EEPROM 24FC1025

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • EEPROM 24FC1025

      BASCOM-Quellcode: R_W EEPROM 24Cxx

      1. '--------------------------------------------------------------------
      2. 'Aufgabe : TWI EEPROM Serie 24Cxx beschreiben (ein Byte)
      3. ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
      4. 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
      5. ' Pos = Stelle an der ein Byte gespeichert wird
      6. ' Value = der Bytewert der gespeichert werden soll
      7. 'Syntax : Call W_EE24Cxx(24C32_0, Pos, Wert)
      8. 'LeÄnd : 13.01.2021
      9. Sub W_EE24Cxx(ICAdr as Byte, Pos as Word, Value as Byte)
      10. Local Temp as Word
      11. Temp = High(Pos) ' In Temp steht das MSB von Pos
      12. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      13. ICAdr = ICAdr OR &B0 ' Bit0=Read(&B1)/Write(&B0)
      14. I2cstart ' Erzeugt eine I2C Start Bedingung
      15. I2cwbyte ICAdr ' sende Schreibadresse
      16. I2cwbyte Temp ' Startaddresse des EEProm
      17. I2cwbyte Pos ' Position anwählen
      18. I2cwbyte Value ' Wert eintragen
      19. I2cstop ' Ende der TWI Übertragung
      20. Waitus 5 ' Moment abwarten
      21. End Sub
      22. ' -----------------------------------------------------------------------------
      23. 'Aufgabe : TWI EEPROM Serie 24Cxx auslesen (jeweils ein Byte)
      24. ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
      25. 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
      26. ' Pos = liest ein Byte von der Position aus.
      27. 'Syntax : Wert = R_EE24Cxx (24C32_0, Pos)
      28. 'LeÄnd : 13.01.2021
      29. Function R_EE24Cxx (ICAdr as Byte, Byval Pos As Word) As Byte
      30. Local Temp as Word
      31. Temp = High(Pos) ' In Temp steht das MSB von Pos
      32. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      33. ICAdr = ICAdr OR &B0 ' Bit0=Read(&B1)/Write(&B0)
      34. I2cstart ' Erzeugt eine I2C Start Bedingung
      35. I2cwbyte ICAdr ' sende Schreibadresse
      36. I2cwbyte Temp ' Startaddresse des EEProm
      37. I2cwbyte Pos ' Position anwählen
      38. ICAdr = ICAdr OR &B1 ' Bit0=Read(&B1)/Write(&B0)
      39. I2cstart ' erneut Start
      40. I2cwbyte ICAdr ' sende Leseadresse
      41. I2crbyte R_EE24Cxx , Nack ' Byte-Wert in die Function Variable
      42. I2cstop
      43. End Function
      Alles anzeigen
      Hallo Freunde,

      mit meiner Function und meinem Sub kann ich wunderbar jede Zelle meiner TWI EEPROMS von der 24Cxx Reihe bis zum 24C512 auslesen und beschreiben.
      Aber der 24FC1025, der bekanntlich 128125 Zellen hat, an dem kommt mein Quellcode an seine Grenze. Mir ist klar, dass dies mit meiner Word Variable zusammen hängt.
      Leider habe ich die Syntax für das MSB und das LSB noch nicht verstanden und ebenso unklar ist mir das Datenblatt des 24FC1025 an dem ich nicht erkennen kann wie man die Zellen oberhalb von 65535 ansprechen kann.
      Kann man mir mal ein Experte auf die Sprünge helfen?
      VY73 Dieter
    • Hallo Dieter,

      ich habe mit so großen Speichern zwar noch nie rumgespielt, der entscheidende Hinweis findet sich aber auf Seite 8 des Datenblatts:

      This device has an internal addressing boundary limitation that is divided into two segments of 512K bits. Block select bit ‘B0’ to control access to each segment.


      Mit dem 5. Bit des Start-Bytes kannst Du also festlegen, ob Du den oberen oder den unteren 512k-Block ansprechen willst. Und innerhalb dieser beiden Blocks reichen ja zwei Adress-Bytes aus um alle Zellen zu adressieren, diese werden dann als Byte 2 und 3 übertragen.
    • Dieter schrieb:

      Ich werde die "Pos" Variable zu einer Single Variable machen und dann bei >65635 die Umschaltung vor nehmen.
      Single ist eine Fließkommazahl

      Einzeller schrieb:

      Wenn "Pos" ein Single ist das die Position enthält, entspricht Bit Nr. 16 dem Block-Select-Bit.
      das glaube ich nicht.

      Wenn es eine Adress-Variable >16 Bit sein soll, dann Long oder Dword.
    • danke für die Klarstellung.
      Die Variable DWord habe ich bisher noch nicht kennen gelernt. Peinlich, denn ich programmiere schon über 15 Jahre mit Bascom. ;)
      Steht auch nicht in Marius Meissners Buch der AVR-Befehle.

      Ich gestehe dass ich heute noch mit den binären Manipulationen erhebliche Schwierigkeiten habe und über If-Then oder Select-Case nicht wirklich hinaus gewachsen bin.

      Wie würdest du im Steuerbyte das Blockauswahlbit (B0) manipulieren wenn die Zellenposition über 16Bit hinaus geht. Dann muss ja schließlich das Blockauswahlbit (B0) auf High schalten und die Zellenposition mit Zellenposition - hFFFF weiter machen.

      VY73 Dieter
    • Dieter schrieb:

      Wie würdest du im Steuerbyte das Blockauswahlbit (B0) manipulieren wenn die Zellenposition über 16Bit hinaus geht.
      In Zeile 43 abhängig von deinem gewünschten Block
      Icadr.4 = 1 ( oder 0)

      In Zeile 48 fehlt ein I2cstop, dann kann eine kleine Pause nicht schaden.
      In Zeile

      Zwischen Zeile 52 und 53 fehlt ein I2crepstart

      Dieter schrieb:

      Dann muss ja schließlich das Blockauswahlbit (B0) auf High schalten und die Zellenposition mit Zellenposition - hFFFF weiter machen.
      nein, in deiner 32Bit(4 Byte) Adresse ist das Blockauswahlbit das 17.Bit, also das erste Bit vom 3.Byte. Die unteren 16 Bit musst du da nicht abziehen, die laufen ja normal weiter.
    • danke liebe OMs,
      ist echt großartig, unser Forum.
      Ich arbeite Eure Hinweise erst mal ein und dann stelle ich die neue Version wieder vor.
      Der Hinweis, die unteren 16Bit müsse ich nicht abziehen, die würden normal weiter laufen, ist das weil der EEProm sowieso über MSB und LSB über 46 + 47 angesteuert wird?
      Welche Vorteile hat denn der I2Crepstart gegenüber dem I2CStart, ist der schneller?
      VY73 de Dieter (db8pr)
    • Hallo Pluto,
      leider hatte ich meine Antwort schon gesendet bevor ich deinen Hinweis gelesen habe.
      Wenn ich mehrere EEPROMS einsetze, dann haben sie jeweils eine andere Adresse. Dadurch kann ich mit dem gleichen Sub oder Function mühelos die anderen EEPROMS aufrufen. Ich bin schon reichlich gespannt was ich mit den 4MBit dann so anstellen kann. (Hi)
      Momentan entwerfe ich gerade so eine kleine Datenbank- Platine die ich dann auf mein Board aufstecken kann.
      VY73 de Dieter (db8pr)
    • Dieter schrieb:

      Der Hinweis, die unteren 16Bit müsse ich nicht abziehen, die würden normal weiter laufen, ist das weil der EEProm sowieso über MSB und LSB über 46 + 47 angesteuert wird?
      Das bezog sich auf deine Annahme, man müsste HexFFFF abziehen, was falsch ist.

      Dieter schrieb:

      Welche Vorteile hat denn der I2Crepstart gegenüber dem I2CStart, ist der schneller?
      I2C repeatet start ist Vorschrift laut Datenblatt (und I2C spec)

      Dieter schrieb:

      Wenn ich mehrere EEPROMS einsetze, dann haben sie jeweils eine andere Adresse
      Bring erstmal einen zum laufen ;)
    • Hallo Freunde, hier bin ich wieder.
      Drei Tage, insgesamt mindestens 20 Stunden habe ich geforscht aber noch immer funktioniert das Schreiben und Lesen ab dem 2.Block des EEPROMs 24CFC1025 nicht.
      Eure Tipps habe ich eingepflegt, vielen Dank dafür.
      Ein angehängtes Bild zeigt deutlich die daten mit denen das IC angesteuert wird.
      Das Datenblatt (teilweise in deutsch übersetzt) liegt auch bei.
      Dateien
    • sorry, der Code muss wohl verloren gegangen sein.

      BASCOM-Quellcode: R_W EEPROM 24FC1025 (Fehlerhaft)

      1. '--------------------------------------------------------------------
      2. 'Aufgabe : TWI EEPROM Serie 24Cxx beschreiben (ein Byte)
      3. ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
      4. 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
      5. ' Pos = Stelle an der ein Byte gespeichert wird
      6. ' Value = der Bytewert der gespeichert werden soll
      7. 'Syntax : Call W_EE24Cxx(24C_0, Pos, Wert)
      8. 'LeÄnd : 19.01.2021-21.01.2021
      9. Sub W_EE24Cxx(ICAdr as Byte, Pos as DWord, Value as Byte)
      10. Local HiPos as Word
      11. Local LsPos as Word
      12. HiPos = HighW(Pos) ' höchstwertiges Wort aus DWord filtern.
      13. LsPos = LowW (pos) ' unterwertiges Wort aus DWord filtern.
      14. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      15. ICAdr = ICAdr OR &B0 ' Bit0=Read(&B1)/Write(&B0)
      16. ICAdr.3 = Pos.16 ' 16tes Bit in BlockSelectBit übertragen
      17. I2cstart ' Erzeugt eine I2C Start Bedingung
      18. I2cwbyte ICAdr ' Control Byte + Schreibadresse
      19. I2cwbyte HiPos ' Hi-Word Variable, Speicheradresse
      20. I2cwbyte LsPos ' Low-Word Variable,Speicheradresse
      21. I2cwbyte Value ' Wert eintragen
      22. I2cstop ' Ende der TWI Übertragung
      23. Waitus 5 ' Moment abwarten
      24. End Sub
      25. ' ----------------------------------------------------------------------
      26. 'Aufgabe : TWI EEPROM Serie 24Cxx auslesen (jeweils ein Byte)
      27. ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
      28. 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
      29. ' Pos = liest ein Byte von der Position aus.
      30. 'Syntax : Wert = R_EE24Cxx (24C_0, Pos)
      31. 'LeÄnd : 19.01.2021-21.01.2021
      32. Function R_EE24Cxx (ICAdr as Byte, Byval Pos As DWord) As Byte
      33. Local HiPos as Word
      34. Local LsPos as Word
      35. HiPos = HighW(Pos) ' höchstwertiges Wort aus DWord filtern.
      36. LsPos = LowW (pos) ' unterwertiges Wort aus DWord filtern.
      37. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      38. ICAdr = ICAdr OR &B0 ' Bit0=Read(&B1)/Write(&B0)
      39. ICAdr.3 = Pos.16 ' 16te Bit in BlockSelectBit übertragen
      40. I2cstart ' Erzeugt eine I2C Start Bedingung
      41. I2cwbyte ICAdr ' Adresse des EEProm +Schreibbefehl
      42. I2cwbyte HiPos ' Hi-Word Variable, Speicheradresse
      43. I2cwbyte LsPos ' Low-Word Variable,Speicheradresse
      44. I2cstop
      45. ICAdr = ICAdr OR &B1 ' Bit0=Read(&B1)/Write(&B0)
      46. I2crepstart ' wiederholte I2C-Startbedingung
      47. I2cwbyte ICAdr ' Adresse des EEProm + Leseadresse (B0)
      48. I2crbyte R_EE24Cxx , Nack ' Byte-Wert in die Function Variable
      49. I2cstop
      50. End Function
      Alles anzeigen
    • Der Code ist sehr unvollständig. Was ist Pos? Long?Double?Single?
      1. Local HiPos as Word
      2. Local LsPos as Word
      Das müssen Bytes sein . Es erwachtet eine 16Bit adresse nicht 32bit
      Es würde ihm ein Haufen Arbeit und Stak sparen wenn mit Overlay gearbeitet würde:
      Dim Pos as dword
      Dim LsPos as byte at pos Overlay
      Dim HIPos as Byte at pos+1 Overlay
      Pos16 alias Pos.16

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()