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!

    • Dieter schrieb:

      Sub W_EE24Cxx(ICAdr as Byte, Pos as DWord, Value as Byte)
      Hallo Pluto, danke für die Antwort.
      Pos ist in der Zeile 10 eindeutig deklariert. Das ist ein 32bit Wert. Ich habe alle DWord Variable auch in Long getestet aber keinen Unterschied festgestellt.

      Pluto25 schrieb:

      Das müssen Bytes sein . Es erwachtet eine 16Bit Adresse nicht 32bit
      Da ist eindeutig mein Denkfehler. Das werde ich gleich morgen früh verbessern.
      Danke auch für den Hinweis mit Overlay- da muss ich mich aber erst mal Schlau machen, damit habe ich noch nie gearbeitet.

      VY73 de Dieter
    • Michael und Pluto, nochmal bedankend habe ich meinen Quellcode verbessert. Jetzt wird der IC Tatsächlich Byte-Weise angesteuert,
      aber der obere Speicherblock kann immer noch nicht gespeichert oder gelesen werden.

      BASCOM-Quellcode: R/W_EEProm 24FC1025

      1. '---------------------------------------------------------------------
      2. 'Projekt :TWI 24C1025 EEProm V2.BAS für AVR KIT16
      3. '
      4. 'Hardware :Platine TWI Speicherbank Lo:2090 und AVRKit
      5. '
      6. 'Aufgabe :Nach dem Beispiel "TWI 24C32 EEProm V1.BAS" wird nun die
      7. ' Software für den 24C1025 erweitert.
      8. ' Diese EEPROM's sind in zwei Speicher Blocks
      9. ' aufgeteilt weil die Zellenanzahl 1025kBit/8=128125 beträgt.
      10. ' Die beiden 512kB Blocks werden mit dem Block Select
      11. ' Bit (B0) umgeschaltet. Es steht im Steuerbyte an 4.Stelle
      12. ' von rechts nach links. Bit3 weil man von 0 ab zählt.
      13. ' Die erweiterte Software sollte rückwärts kompatibel sein
      14. '
      15. 'Bedienung:Taste [S] speichert neuen Wert auf eine bestimmte Position.
      16. ' Taste [R] liest Wert aus der gleichen Position wieder aus.
      17. ' Taste [2] liest Wert aus einer aufsteigenden Position.
      18. ' Taste [3] liest Wert aus einer absteigenden Position.
      19. '
      20. 'Hinweis :Platine TWI Speicherbank auf ADC-Port vom AVRKit stecken.
      21. '
      22. '<db>19-11-2012/12.01.2021/16.01.2021/22.1.21
      23. '------------------------------------------------------------------
      24. $regfile = "M16DEF.DAT"
      25. $crystal = 14745600
      26. $hwstack = 48
      27. $swstack = 32
      28. $framesize = 48
      29. $baud = 38400 ' gewünschte Baudrate vorgeben
      30. S1 Alias Pind.5 : DDRD.5=0: PortD.5=1 ' Taste [S] (Eingang)
      31. S2 Alias Pind.2 : DDRD.2=0: PortD.2=1 ' Taste [2] (Eingang)
      32. S3 Alias Pind.3 : DDRD.3=0: PortD.3=1 ' Taste [3] (Eingang)
      33. S4 Alias Pind.4 : DDRD.4=0: PortD.4=1 ' Taste [R] (Eingang)
      34. V7 Alias Portb.4: DDRB.4=1: PortB.4=1 ' 4. LED von links nach rechts
      35. V6 Alias Portb.5: DDRB.5=1: PortB.5=1 ' 2. LED
      36. V5 Alias Portb.6: DDRB.6=1: PortB.6=1 ' 3. LED
      37. V4 Alias Portb.7: DDRB.7=1: PortB.7=1 ' 1. LED
      38. B1 Alias PortB.3: DDRB.3=1: PortB.3=0 ' Beep (Piezo)
      39. Const LED_An = 0
      40. Const LED_Aus = 1
      41. Dim Txt as String * 40 ' nur für Testzwecke
      42. Dim XPos as DWord ' XPos = Speicherzellen Adresse
      43. 'Dim XICAd as Byte ' nur zur Darstellung
      44. Dim ICAdr as Byte
      45. Dim Wert as Byte ' der Bytwert zum speichern
      46. Dim HiPos as Byte ' IC Address High Byte
      47. Dim LsPos as Byte ' IC Address Low Byte
      48. Dim PosWd as Word ' konvertiert DWord in Word
      49. Config Sda = PortA.1 ' Pins für TWI konfigurieren
      50. Config Scl = PortA.0
      51. Const 24C_0 = &B1010_000 ' Control Byte (!7-Bit!)
      52. Const 24C_1 = &B1010_001 ' weiter.C.B.IC-Pin1/2 codiert.
      53. ICAdr = 24C_1
      54. Declare Sub W_EE24Cxx(BYRef ICAdr as Byte, Byval Pos As DWord, _
      55. Byval Value As Byte)
      56. Declare Function R_EE24Cxx (BYRef ICAdr as Byte, _
      57. Byval Pos As DWord) As Byte
      58. Print "EEPROM 24C1025" : Print
      59. Wert = 64 ' nur testweise ein Bytewert
      60. XPos = 65533 ' nur testweise die Speicher-
      61. ' Adresse bestimmen. Mit
      62. ' Taste 2/3 wird Pos INCR/DECR
      63. Do
      64. Debounce S1 , 0 , Tast1 , Sub ' S1 ["S"]
      65. Debounce S2 , 0 , Tast2 , Sub ' S2 ["2"]
      66. Debounce S3 , 0 , Tast3 , Sub ' S3 ["3"]
      67. Debounce S4 , 0 , Tast4 , Sub ' S4 ["R"]
      68. Loop
      69. '--------------------Tastenroutine-----------------------------------
      70. Tast1: '[S] Taste
      71. V5 = LED_An
      72. Sound B1,150,500
      73. Txt = "sende Pos: "
      74. INCR XPos ' XPos ist die Adresse der
      75. INCR Wert ' Speicherzelle die jeweils
      76. If Wert < 65 Then Wert = 65 ' mit einem anderen Zeichen
      77. IF Wert > 122 Then Wert = 65 ' belegt wird
      78. Print Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert) ' Ausgabe über UART
      79. ICAdr = 24C_1
      80. Call W_EE24Cxx(ICAdr, XPos, Wert) ' im EEPROM speichern
      81. Print "ICAdr: ";Bin(ICAdr);"(Dez:";ICAdr;")"
      82. Print "HiPos: ";Bin(HiPos);"(Dez:";HiPos;")"
      83. Print "LsPos: ";Bin(LsPos);"(Dez:";LsPos;")"
      84. Print
      85. V5 = LED_Aus
      86. Return
      87. Tast2: ' [2] Tastensteuerung
      88. V4 = LED_An
      89. Sound B1,150,500
      90. Txt="lese Pos :"
      91. ICAdr = 24C_1
      92. Wert = R_EE24Cxx (ICAdr, XPos) ' gespeicherter Wert ermitteln
      93. Print Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert)
      94. Print "ICAdr: ";Bin(ICAdr);"(Dez:";ICAdr;")"
      95. Print "HiPos: ";Bin(HiPos);"(Dez:";HiPos;")"
      96. Print "LsPos: ";Bin(LsPos);"(Dez:";LsPos;")"
      97. Print
      98. INCR XPos ' erhöht die Abfrageposition
      99. V4 = LED_An
      100. Return
      101. Tast3: ' [3] Tastensteuerung
      102. V7 = LED_An
      103. Sound B1,150,500
      104. Txt="lese Pos :"
      105. ICAdr = 24C_1
      106. Wert = R_EE24Cxx (ICAdr, XPos)
      107. Print "S3: ";Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert)
      108. Print "ICAdr: ";Bin(ICAdr);"(Dez:";ICAdr;")"
      109. Print "HiPos: ";Bin(HiPos);"(Dez:";HiPos;")"
      110. Print "LsPos: ";Bin(LsPos);"(Dez:";LsPos;")"
      111. Print
      112. DECR XPos
      113. V7 = LED_Aus
      114. Return
      115. Tast4: ' [R] Tastensteuerung. Damit
      116. ' soll der aktuell gespeicher-
      117. V6 = LED_An ' ter Wert gelesen werden und
      118. Sound B1,150,500 ' dann die untersten Speicher-
      119. Txt="lese Pos :" ' zellen. 0-2
      120. ICAdr = 24C_1
      121. Wert = R_EE24Cxx (ICAdr, XPos) ' auslesen
      122. Print "S4: ";Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert)
      123. ICAdr = 24C_1
      124. Wert = R_EE24Cxx (ICAdr, 0) ' auslesen
      125. Print "S41 ";Txt;0;" Wert: ";Wert;" = ";CHR(Wert)
      126. ICAdr = 24C_1
      127. Wert = R_EE24Cxx (ICAdr, 1) ' auslesen
      128. Print "S42 ";Txt;1;" Wert: ";Wert;" = ";CHR(Wert)
      129. ICAdr = 24C_1
      130. Wert = R_EE24Cxx (ICAdr, 2) ' auslesen
      131. Print "S42 ";Txt;2;" Wert: ";Wert;" = ";CHR(Wert)
      132. V6 = LED_Aus
      133. Return
      134. '--------------------------------------------------------------------
      135. 'Aufgabe : TWI EEPROM Serie 24Cxx beschreiben (ein Byte)
      136. ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
      137. 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
      138. ' Pos = Stelle an der ein Byte gespeichert wird
      139. ' Value = der Bytewert der gespeichert werden soll
      140. 'Syntax : Call W_EE24Cxx(24C_0, Pos, Wert)
      141. 'LeÄnd : 19.01.2021-21.01.2021-22.01.nach Micha+Pluto
      142. Sub W_EE24Cxx(ICAdr as Byte, Pos as DWord, Value as Byte)
      143. PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
      144. LsPos = Low (posWd) ' LSByte ermitteln
      145. HiPos = High(PosWd) ' HSByte ermitteln
      146. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      147. ICAdr = ICAdr OR &B0 ' Bit0 (Read=&B1/Write=&B0)
      148. ICAdr.3 = Pos.16 ' 16tes Bit in BlockSelectBit
      149. I2cstart ' Erzeugt I2C Start Bedingung
      150. I2cwbyte ICAdr ' Control Byte + Schreibadresse
      151. I2cwbyte HiPos ' MSByte, Speicheradresse
      152. I2cwbyte LsPos ' LSByte, Speicheradresse
      153. I2cwbyte Value ' Byte Wert speichern
      154. I2cstop ' Ende der TWI Übertragung
      155. Waitus 5 ' Moment abwarten
      156. End Sub
      157. ' -----------------------------------------------------------------
      158. 'Aufgabe : TWI EEPROM Serie 24Cxx auslesen (jeweils ein Byte)
      159. ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
      160. 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
      161. ' Pos = liest ein Byte von der Position aus.
      162. 'Syntax : Wert = R_EE24Cxx (24C_0, Pos)
      163. 'LeÄnd : 19.01.2021-21.01.2021-22.01.nach Micha+Pluto
      164. Function R_EE24Cxx (ICAdr as Byte, Byval Pos As DWord) As Byte
      165. PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
      166. LsPos = Low (posWd) ' LSByte ermitteln
      167. HiPos = High(PosWd) ' HSByte ermitteln
      168. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      169. ICAdr = ICAdr OR &B0 ' Bit0(Read=&B1/Write=&B0)hinzu
      170. ICAdr.3 = Pos.16 ' 16te Bit in BlockSelectBit
      171. I2cstart ' Erzeugt I2C Start Bedingung
      172. I2cwbyte ICAdr ' Control Byte + Schreibbefehl
      173. I2cwbyte HiPos ' Hi-Byte Speicheradresse
      174. I2cwbyte LsPos ' Low-Byte Speicheradresse
      175. I2cstop
      176. ICAdr = ICAdr OR &B1 ' Bit0=Read(&B1)/Write(&B0)
      177. I2crepstart ' wiederholt I2C-Startbedingung
      178. I2cwbyte ICAdr ' Control Byte + Lesebefehl
      179. I2crbyte R_EE24Cxx , Nack ' Byte-Wert direkt in R_EE24Cxx
      180. I2cstop ' eintragen und ausgeben.
      181. End Function
      Alles anzeigen
      BinDarst.PNG
    • Hallo Michael, ich finde dass man an der Grafik wunderbar erkennen kann, dass der IC bis 65535 wunderbar beschrieben und auch gelesen werden kann. Man sieht das BlockBit3 (in ICAdr) wie es auf High geht wenn Pos 65536 Bits enthält und die HiPos und LsPos dann den Wert 0 hat, das ist die erste Speicherzelle vom zweiten Block.
      Wenn dann die Leseoperation kommt, sieht man das Read Steuerbit, es ist jetzt High. HiPos und LsPos ist gesetzt, also müsste der Speicherinhalt nun den Wert 79, ein "O" anzeigen. Im Steuerblock 0 macht er das ja auch.
      Die Ansteuerung funktioniert im unteren Block auch mit kleineren EEProms einwandfrei. Deshalb kann es auch nicht an WP liegen, der ist auf Masse gelegt.
      Ich werde jetzt mal geschwind die Pause auf 10mS (das kommt mir übrigens ziemlich lange vor) setzen und nochmals testen.
      Aber ich fürchte der Haken sitzt woanders. Wie so oft ist das in den englischen Texten im Datenblatt so gut versteckt, dass man daran verzweifeln kann....
    • A2 und A0 liegen auf Vcc? Und WP und A1 auf Gnd?
      Lass mal das Stop In Zeile 222 weg und ersetze das Repstart in Zeile 226 gegen Start (Datenblatt)
      Nach jedem Stop erwachtet er für 5µS nicht angesprochen zu werden.
      Eine Err Abfrage wäre auch nicht schlecht. Die 255 kommen auch raus wenn keiner da ist.

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

    • Noch vor Plutos Änderungen habe ich doch kein Überschreiben der unteren Speicherzellen feststellen können.
      An der Grafik kann man schön erkennen, dass auch nach mehrmaligen Überschreibungen der oberen Speicherzellen keine Überschreibung stattfindet. Leider haben die empfohlenen Änderung das Ergebnis nicht verändert. Um Klarheit zu schaffen, werden die oberen Zeilen mit kleinen Zeichen gespeichert und die Unteren mit großen Zeichen. Später würde ich dann gerne noch eine ERR Abfrage einbauen.
      Grafik kommt noch

      BASCOM-Quellcode: EEPROM 24FC1025

      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-22.01.nach Micha+Pluto
      9. Sub W_EE24Cxx(ICAdr as Byte, Pos as DWord, Value as Byte)
      10. PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
      11. LsPos = Low (posWd) ' LSByte ermitteln
      12. HiPos = High(PosWd) ' HSByte ermitteln
      13. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      14. ICAdr = ICAdr OR &B0 ' Bit0 (Read=&B1/Write=&B0)
      15. ICAdr.3 = Pos.16 ' 16tes Bit in BlockSelectBit
      16. I2cstart ' Erzeugt I2C Start Bedingung
      17. I2cwbyte ICAdr ' Control Byte + Schreibadresse
      18. I2cwbyte HiPos ' MSByte, Speicheradresse
      19. I2cwbyte LsPos ' LSByte, Speicheradresse
      20. I2cwbyte Value ' Byte Wert speichern
      21. I2cstop ' Ende der TWI Übertragung
      22. Waitms 5 ' Moment abwarten
      23. End Sub
      24. ' -----------------------------------------------------------------
      25. 'Aufgabe : TWI EEPROM Serie 24Cxx auslesen (jeweils ein Byte)
      26. ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
      27. 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
      28. ' Pos = liest ein Byte von der Position aus.
      29. 'Syntax : Wert = R_EE24Cxx (24C_0, Pos)
      30. 'LeÄnd : 19.01.2021-21.01.2021-22.01.nach Micha+Pluto
      31. Function R_EE24Cxx (ICAdr as Byte, Byval Pos As DWord) As Byte
      32. PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
      33. LsPos = Low (posWd) ' LSByte ermitteln
      34. HiPos = High(PosWd) ' HSByte ermitteln
      35. Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
      36. ICAdr = ICAdr OR &B0 ' Bit0(Read=&B1/Write=&B0)hinzu
      37. ICAdr.3 = Pos.16 ' 16te Bit in BlockSelectBit
      38. I2cstart ' Erzeugt I2C Start Bedingung
      39. I2cwbyte ICAdr ' Control Byte + Schreibbefehl
      40. I2cwbyte HiPos ' Hi-Byte Speicheradresse
      41. I2cwbyte LsPos ' Low-Byte Speicheradresse
      42. 'I2cstop
      43. Waitms 5
      44. ICAdr = ICAdr OR &B1 ' Bit0=Read(&B1)/Write(&B0)
      45. I2CStart
      46. 'I2crepstart ' wiederholt I2C-Startbedingung
      47. I2cwbyte ICAdr ' Control Byte + Lesebefehl
      48. I2crbyte R_EE24Cxx , Nack ' Byte-Wert direkt in R_EE24Cxx
      49. I2cstop ' eintragen und ausgeben.
      50. End Function
      Alles anzeigen
    • Pluto und Michael-- Ihr seid wahre Könner :) :P :thumbup:

      Es lag tatsächlich einzig und alleine daran, Pin3 vom IC muss natürlich auf VCC stehen. So stehts ja auch im Datenblatt.
      Zu meiner Entschuldigung kann ich nur sagen, dass ich dieses kleine Board vor Jahren mal für den 24C32 gemacht habe und an der Serie war der Pin NC..
      Und außerdem ist es eine Gemeinheit vom Hersteller, dass der EEProm im unteren Block, also bis 512KBit einwandfrei funktioniert wenn Pin3(A2) auf Masse liegt.
      Alles gut, nun werde ich den Quellcode noch optimieren und dann den Quellcode erweitern zu einer Datenbank für 3MBit

      Pluto, du sprachst die ERR Abfrage an- hast du dafür ein Beispiel?

      VY73 de Dieter
    • If Err = 0 then Print "Alles Ok"
      If Err = 1 then Print "Error"
      Das passiert immer wenn irgendwas nicht gut ist. Z.B ein Ack fehlt, Datenkollision, ein Pin kommt nicht mehr hoch, etc

      Dieter schrieb:

      dieser Pin3 (A2) lediglich das Lesen verhindert
      da wäre ich vorsichtig. Wenn etwas außerhalb des Datenblattes betrieben wird könnte es bei der nächsten Serie anders sein oder sich aus nicht nachvollziehbaren Gründen "plötzlich" ändern.