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)
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
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 schrieb:
Ohne Programm geht das leider nicht, da kann man nur raten.
gerne sende ich dann den kompletten Code. Durch Eure Hinweise sehe ich jetzt was ich eindeutig falsch gemacht habe.
Ich melde mich sobald als möglich wieder. Dann hoffentlich mit fertigem Ergebnis (hi)
VY73 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
- '---------------------------------------------------------------------
- 'Projekt :TWI 24C1025 EEProm V2.BAS für AVR KIT16
- '
- 'Hardware :Platine TWI Speicherbank Lo:2090 und AVRKit
- '
- 'Aufgabe :Nach dem Beispiel "TWI 24C32 EEProm V1.BAS" wird nun die
- ' Software für den 24C1025 erweitert.
- ' Diese EEPROM's sind in zwei Speicher Blocks
- ' aufgeteilt weil die Zellenanzahl 1025kBit/8=128125 beträgt.
- ' Die beiden 512kB Blocks werden mit dem Block Select
- ' Bit (B0) umgeschaltet. Es steht im Steuerbyte an 4.Stelle
- ' von rechts nach links. Bit3 weil man von 0 ab zählt.
- ' Die erweiterte Software sollte rückwärts kompatibel sein
- '
- 'Bedienung:Taste [S] speichert neuen Wert auf eine bestimmte Position.
- ' Taste [R] liest Wert aus der gleichen Position wieder aus.
- ' Taste [2] liest Wert aus einer aufsteigenden Position.
- ' Taste [3] liest Wert aus einer absteigenden Position.
- '
- 'Hinweis :Platine TWI Speicherbank auf ADC-Port vom AVRKit stecken.
- '
- '<db>19-11-2012/12.01.2021/16.01.2021/22.1.21
- '------------------------------------------------------------------
- $regfile = "M16DEF.DAT"
- $crystal = 14745600
- $hwstack = 48
- $swstack = 32
- $framesize = 48
- $baud = 38400 ' gewünschte Baudrate vorgeben
- S1 Alias Pind.5 : DDRD.5=0: PortD.5=1 ' Taste [S] (Eingang)
- S2 Alias Pind.2 : DDRD.2=0: PortD.2=1 ' Taste [2] (Eingang)
- S3 Alias Pind.3 : DDRD.3=0: PortD.3=1 ' Taste [3] (Eingang)
- S4 Alias Pind.4 : DDRD.4=0: PortD.4=1 ' Taste [R] (Eingang)
- V7 Alias Portb.4: DDRB.4=1: PortB.4=1 ' 4. LED von links nach rechts
- V6 Alias Portb.5: DDRB.5=1: PortB.5=1 ' 2. LED
- V5 Alias Portb.6: DDRB.6=1: PortB.6=1 ' 3. LED
- V4 Alias Portb.7: DDRB.7=1: PortB.7=1 ' 1. LED
- B1 Alias PortB.3: DDRB.3=1: PortB.3=0 ' Beep (Piezo)
- Const LED_An = 0
- Const LED_Aus = 1
- Dim Txt as String * 40 ' nur für Testzwecke
- Dim XPos as DWord ' XPos = Speicherzellen Adresse
- 'Dim XICAd as Byte ' nur zur Darstellung
- Dim ICAdr as Byte
- Dim Wert as Byte ' der Bytwert zum speichern
- Dim HiPos as Byte ' IC Address High Byte
- Dim LsPos as Byte ' IC Address Low Byte
- Dim PosWd as Word ' konvertiert DWord in Word
- Config Sda = PortA.1 ' Pins für TWI konfigurieren
- Config Scl = PortA.0
- Const 24C_0 = &B1010_000 ' Control Byte (!7-Bit!)
- Const 24C_1 = &B1010_001 ' weiter.C.B.IC-Pin1/2 codiert.
- ICAdr = 24C_1
- Declare Sub W_EE24Cxx(BYRef ICAdr as Byte, Byval Pos As DWord, _
- Byval Value As Byte)
- Declare Function R_EE24Cxx (BYRef ICAdr as Byte, _
- Byval Pos As DWord) As Byte
- Print "EEPROM 24C1025" : Print
- Wert = 64 ' nur testweise ein Bytewert
- XPos = 65533 ' nur testweise die Speicher-
- ' Adresse bestimmen. Mit
- ' Taste 2/3 wird Pos INCR/DECR
- Do
- Debounce S1 , 0 , Tast1 , Sub ' S1 ["S"]
- Debounce S2 , 0 , Tast2 , Sub ' S2 ["2"]
- Debounce S3 , 0 , Tast3 , Sub ' S3 ["3"]
- Debounce S4 , 0 , Tast4 , Sub ' S4 ["R"]
- Loop
- '--------------------Tastenroutine-----------------------------------
- Tast1: '[S] Taste
- V5 = LED_An
- Sound B1,150,500
- Txt = "sende Pos: "
- INCR XPos ' XPos ist die Adresse der
- INCR Wert ' Speicherzelle die jeweils
- If Wert < 65 Then Wert = 65 ' mit einem anderen Zeichen
- IF Wert > 122 Then Wert = 65 ' belegt wird
- Print Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert) ' Ausgabe über UART
- ICAdr = 24C_1
- Call W_EE24Cxx(ICAdr, XPos, Wert) ' im EEPROM speichern
- Print "ICAdr: ";Bin(ICAdr);"(Dez:";ICAdr;")"
- Print "HiPos: ";Bin(HiPos);"(Dez:";HiPos;")"
- Print "LsPos: ";Bin(LsPos);"(Dez:";LsPos;")"
- V5 = LED_Aus
- Return
- Tast2: ' [2] Tastensteuerung
- V4 = LED_An
- Sound B1,150,500
- Txt="lese Pos :"
- ICAdr = 24C_1
- Wert = R_EE24Cxx (ICAdr, XPos) ' gespeicherter Wert ermitteln
- Print Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert)
- Print "ICAdr: ";Bin(ICAdr);"(Dez:";ICAdr;")"
- Print "HiPos: ";Bin(HiPos);"(Dez:";HiPos;")"
- Print "LsPos: ";Bin(LsPos);"(Dez:";LsPos;")"
- INCR XPos ' erhöht die Abfrageposition
- V4 = LED_An
- Return
- Tast3: ' [3] Tastensteuerung
- V7 = LED_An
- Sound B1,150,500
- Txt="lese Pos :"
- ICAdr = 24C_1
- Wert = R_EE24Cxx (ICAdr, XPos)
- Print "S3: ";Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert)
- Print "ICAdr: ";Bin(ICAdr);"(Dez:";ICAdr;")"
- Print "HiPos: ";Bin(HiPos);"(Dez:";HiPos;")"
- Print "LsPos: ";Bin(LsPos);"(Dez:";LsPos;")"
- DECR XPos
- V7 = LED_Aus
- Return
- Tast4: ' [R] Tastensteuerung. Damit
- ' soll der aktuell gespeicher-
- V6 = LED_An ' ter Wert gelesen werden und
- Sound B1,150,500 ' dann die untersten Speicher-
- Txt="lese Pos :" ' zellen. 0-2
- ICAdr = 24C_1
- Wert = R_EE24Cxx (ICAdr, XPos) ' auslesen
- Print "S4: ";Txt;XPos;" Wert: ";Wert;" = ";CHR(Wert)
- ICAdr = 24C_1
- Wert = R_EE24Cxx (ICAdr, 0) ' auslesen
- Print "S41 ";Txt;0;" Wert: ";Wert;" = ";CHR(Wert)
- ICAdr = 24C_1
- Wert = R_EE24Cxx (ICAdr, 1) ' auslesen
- Print "S42 ";Txt;1;" Wert: ";Wert;" = ";CHR(Wert)
- ICAdr = 24C_1
- Wert = R_EE24Cxx (ICAdr, 2) ' auslesen
- Print "S42 ";Txt;2;" Wert: ";Wert;" = ";CHR(Wert)
- V6 = LED_Aus
- Return
- '--------------------------------------------------------------------
- 'Aufgabe : TWI EEPROM Serie 24Cxx beschreiben (ein Byte)
- ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
- 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
- ' Pos = Stelle an der ein Byte gespeichert wird
- ' Value = der Bytewert der gespeichert werden soll
- 'Syntax : Call W_EE24Cxx(24C_0, Pos, Wert)
- 'LeÄnd : 19.01.2021-21.01.2021-22.01.nach Micha+Pluto
- Sub W_EE24Cxx(ICAdr as Byte, Pos as DWord, Value as Byte)
- PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
- LsPos = Low (posWd) ' LSByte ermitteln
- HiPos = High(PosWd) ' HSByte ermitteln
- Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
- ICAdr = ICAdr OR &B0 ' Bit0 (Read=&B1/Write=&B0)
- ICAdr.3 = Pos.16 ' 16tes Bit in BlockSelectBit
- I2cstart ' Erzeugt I2C Start Bedingung
- I2cwbyte ICAdr ' Control Byte + Schreibadresse
- I2cwbyte HiPos ' MSByte, Speicheradresse
- I2cwbyte LsPos ' LSByte, Speicheradresse
- I2cwbyte Value ' Byte Wert speichern
- I2cstop ' Ende der TWI Übertragung
- Waitus 5 ' Moment abwarten
- End Sub
- ' -----------------------------------------------------------------
- 'Aufgabe : TWI EEPROM Serie 24Cxx auslesen (jeweils ein Byte)
- ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
- 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
- ' Pos = liest ein Byte von der Position aus.
- 'Syntax : Wert = R_EE24Cxx (24C_0, Pos)
- 'LeÄnd : 19.01.2021-21.01.2021-22.01.nach Micha+Pluto
- Function R_EE24Cxx (ICAdr as Byte, Byval Pos As DWord) As Byte
- PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
- LsPos = Low (posWd) ' LSByte ermitteln
- HiPos = High(PosWd) ' HSByte ermitteln
- Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
- ICAdr = ICAdr OR &B0 ' Bit0(Read=&B1/Write=&B0)hinzu
- ICAdr.3 = Pos.16 ' 16te Bit in BlockSelectBit
- I2cstart ' Erzeugt I2C Start Bedingung
- I2cwbyte ICAdr ' Control Byte + Schreibbefehl
- I2cwbyte HiPos ' Hi-Byte Speicheradresse
- I2cwbyte LsPos ' Low-Byte Speicheradresse
- I2cstop
- ICAdr = ICAdr OR &B1 ' Bit0=Read(&B1)/Write(&B0)
- I2crepstart ' wiederholt I2C-Startbedingung
- I2cwbyte ICAdr ' Control Byte + Lesebefehl
- I2crbyte R_EE24Cxx , Nack ' Byte-Wert direkt in R_EE24Cxx
- I2cstop ' eintragen und ausgeben.
- End Function
-
Jetzt kann auch ich die Grafik erkennen.
Warum eigentlich Grafik?
Kannst du mal Adresse 0 oder 1 beschreiben und danach Adresse 65536 bzw. 65537 lesen?
Wie ist Pin7 (WP) beschaltet?
Mit einer kleinen Pause nach I2Cstop meinte ich 10ms, das reicht, um einen Schreibvorgang abzuschließen. -
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.... -
auch 10mS Pause haben nicht geholfen. Den zweiten Block erreiche ich nicht.
Ich werde jetzt mal einen Fabrikneuen 1025 einsetzen. Habe meine Versuchsschaltung mit DIP8 gemacht. -
same in green- funzt nicht- ??
-
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 ()
-
10ms war immer die Standard-Wartezeit, dass der EEprom auch fertig geschrieben ist.
Die reale Zeit lliegt so zwoschen 2 und 5ms, da ist ein Puffer nicht verkehrt.
Das ist auch ein Thema für später, kann man ja pollen laut Datenblatt.
Kannst du mal Adresse 0 oder 1 beschreiben und danach Adresse 65536 bzw. 65537 lesen? -
Hallo zusammen,
es sieht so aus, dass er die unteren Zeilen 0-4 überschreibt, wenn ich über 65535 etwas speichere.
Demnach wird der BlocKSelect nicht umgeschaltet.
Die von Pluto vorgeschlagenen Änderungen pflege ich nachher ein, denn ich muss zum Abendbrot, sonst bekomme ich Schimpfe.. -
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
- '--------------------------------------------------------------------
- 'Aufgabe : TWI EEPROM Serie 24Cxx beschreiben (ein Byte)
- ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
- 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
- ' Pos = Stelle an der ein Byte gespeichert wird
- ' Value = der Bytewert der gespeichert werden soll
- 'Syntax : Call W_EE24Cxx(24C_0, Pos, Wert)
- 'LeÄnd : 19.01.2021-21.01.2021-22.01.nach Micha+Pluto
- Sub W_EE24Cxx(ICAdr as Byte, Pos as DWord, Value as Byte)
- PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
- LsPos = Low (posWd) ' LSByte ermitteln
- HiPos = High(PosWd) ' HSByte ermitteln
- Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
- ICAdr = ICAdr OR &B0 ' Bit0 (Read=&B1/Write=&B0)
- ICAdr.3 = Pos.16 ' 16tes Bit in BlockSelectBit
- I2cstart ' Erzeugt I2C Start Bedingung
- I2cwbyte ICAdr ' Control Byte + Schreibadresse
- I2cwbyte HiPos ' MSByte, Speicheradresse
- I2cwbyte LsPos ' LSByte, Speicheradresse
- I2cwbyte Value ' Byte Wert speichern
- I2cstop ' Ende der TWI Übertragung
- Waitms 5 ' Moment abwarten
- End Sub
- ' -----------------------------------------------------------------
- 'Aufgabe : TWI EEPROM Serie 24Cxx auslesen (jeweils ein Byte)
- ' Es können mehrere 24Cxx an einer TWI Leitung hängen.
- 'Parameter : ICAdr = als Byte (7 Bit Adresse gemäß Datenblatt)
- ' Pos = liest ein Byte von der Position aus.
- 'Syntax : Wert = R_EE24Cxx (24C_0, Pos)
- 'LeÄnd : 19.01.2021-21.01.2021-22.01.nach Micha+Pluto
- Function R_EE24Cxx (ICAdr as Byte, Byval Pos As DWord) As Byte
- PosWd = LowW (Pos) ' LSWord aus DWord ermitteln
- LsPos = Low (posWd) ' LSByte ermitteln
- HiPos = High(PosWd) ' HSByte ermitteln
- Shift ICAdr,Left,1 ' ICAdr höherwertig verschieben
- ICAdr = ICAdr OR &B0 ' Bit0(Read=&B1/Write=&B0)hinzu
- ICAdr.3 = Pos.16 ' 16te Bit in BlockSelectBit
- I2cstart ' Erzeugt I2C Start Bedingung
- I2cwbyte ICAdr ' Control Byte + Schreibbefehl
- I2cwbyte HiPos ' Hi-Byte Speicheradresse
- I2cwbyte LsPos ' Low-Byte Speicheradresse
- 'I2cstop
- Waitms 5
- ICAdr = ICAdr OR &B1 ' Bit0=Read(&B1)/Write(&B0)
- I2CStart
- 'I2crepstart ' wiederholt I2C-Startbedingung
- I2cwbyte ICAdr ' Control Byte + Lesebefehl
- I2crbyte R_EE24Cxx , Nack ' Byte-Wert direkt in R_EE24Cxx
- I2cstop ' eintragen und ausgeben.
- End Function
-
Die Grafik zeigt, die unteren Speicherzellen werden nicht überschrieben
-
Wie sieht denn deine Hardware aus?
(Pluto25s Frage aus #29) -
Meine Hardware besteht aus einem AVR-Board und einer kleinen Platine mit derzeit einem EEProm 24FC1025.
Über die ISP Leitung wird auch gleichzeitig UART via USB an den PC übertragen.
Im Anhang beide Schaltpläne AVRKit+EEPROM 1025.jpgStarterKit_AVR 16_8_SCH.PDFEEPROM 24C32 & PCF8583 Uhr_SCH.PDF -
Pluto25 schrieb:
A2 und A0 liegen auf Vcc? Und WP und A1 auf Gnd?
Das ändere ich sofort und komme dann hoffentlich mit einem positiven Bescheid.. -
Pluto und Michael-- Ihr seid wahre Könner
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 -
Habe gerade festgestellt, dass dieser Pin3 (A2) lediglich das Lesen verhindert wenn er auf Masse liegt. Das Schreiben in den oberen Block funktioniert immer. Die Entwickler solcher Schaltkreise sind schon Klever, denn dadurch hat man einige Möglichkeiten mehr.
-
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
-
Danke Pluto.
Kann ERR also überall im Code eingebaut werden?
Kann der auch schadlos öfter mal z.B. in einem Sub aufgerufen werden?
Pluto25 schrieb:
da wäre ich vorsichtig.
Schönes Wochenende