Hallo Leute
Habe wieder so ein blödes Problem, wo ich schon eine ganze Woche dabei sitze und einfach nicht den Fehler finde![]()
Im Prinzip geht es um eine Speicherung in einem 24C256er EEprom (I2C)
Ich schreibe da Daten ab Adresse 192 rein und nach ein paar Einträgen löscht es mir den Wert in Adresse 192
Irgendwie muss es wohl mit der Adresse zusammenhängen, den es schein sich ab Adresse 255 zu verändern.
Ein Datenblock = 26 Byte lang und besteht aus Long und Byte Variablen.
Nach dem dritten Datenblock, habe ich in Adresse 192, keine 31 mehr drinnen, sondern nur mehr ein 0 !![]()
Wenn ich z.B. 50 Datenblöcke reinschreibe, werden auch an anderen Stellen, Daten verändert.
Z.B. dann in Block: 8,18,23,28,33,35,40,50 u.s.w.
Das Muster bleibt so ca. gleich, wo die Daten verändert wurden..
Habe den Code von 12Kb mal geschrumpft:
Ab der dritten Schleife, löscht es mir die daten in Adresse 192!!
Code:$regfile = "m32def.dat" $crystal = 10000000 $hwstack = 250 $swstack = 250 $framesize = 250 '##################### Config für Grafik-LCD #################################################### ' (Config LCD muss vor Config Portb stehen , sonst blockiert er das Port!) Config Graphlcd = 240 * 128 , Dataport = Portc , Controlport = Portb , Ce = 6 , Cd = 7 , Wr = 4 , Rd = 5 , Reset = 3 , Fs = 2 , Mode = 8 Cursor Off Cls '############################ Config I2C Bus ################################### Config Scl = Portb.2 ' I2C-Port festlegen Config Sda = Portb.1 ' I2C-Port festlegen '################## Config Port's ############################################## '-----config Port A Config Porta = Input '-----config Port B Config Portb = &B11111001 '-----config Port D 'Pin 3-7 Ausgabe (Takt/Richtungen 'Pin 2 Int0 (Auf Eingabe) 'Pin 1 Ausgabe (TXD) 'Pin 0 Eingabe und Pin2 Interrupt Eingang Config Portd = &B11111010 Portd.2 = 1 'Auf Pull up '################## Variablen ################################################## ' '------------ EEprom lesen/schreiben ----------- ' Adessen Dim Adresse As Word At $101 ' EEprom Adresse (Long) Dim Low_adresse As Byte At $101 Overlay Dim High_adresse As Byte At $102 Overlay 'Byte-EEprom-Wert Dim B_wert As Byte 'Byte-Wert zum Daten lesen vom EEprom 'Word-EEprom-Wert Dim W_wert As Word At $111 'Word-Wert zum Daten lesen vom EEprom Dim W_wert1 As Byte At $111 Overlay 'Teil1 der Word Variable (Byte) Dim W_wert2 As Byte At $112 Overlay 'Teil2 der Word Variable (Byte) 'Long-EEprom-Wert Dim L_wert As Long At $123 'Long-Wert zum Daten lesen vom EEprom Dim L_wert1 As Byte At $123 Overlay 'Teil1 der Long Variable (Byte) Dim L_wert2 As Byte At $124 Overlay 'Teil2 der Long Variable (Byte) Dim L_wert3 As Byte At $125 Overlay 'Teil3 der Long Variable (Byte) Dim L_wert4 As Byte At $126 Overlay 'Teil4 der Long Variable (Byte) '---------I2C -------------------------------- Dim I2c_wert As Byte 'I2C Wert schreiben/lesen Dim Int0_schalter As Byte ' Schalter für INT0 Auslösung Dim Datenblock_anfang As Word 'Adresse vom Anfang vom Datenblock (bei Datensatz) '------------ 'Sonstiges Dim X As Word ' zum rechnen Dim I As Word Cls Do Datenblock_anfang = 192 For X = 1 To 4 Locate 2 , 1 : Lcd "Anfangsadresse =" ; Datenblock_anfang '-- Daten für Achse 1 schreiben -- Adresse = Datenblock_anfang L_wert = 31 Gosub Eeprom_long_schreiben Adresse = Datenblock_anfang + 4 B_wert = 91 Gosub Eeprom_byte_schreiben '----- '-- Daten für Achse 2 schreiben -- Adresse = Datenblock_anfang + 5 L_wert = 32 Gosub Eeprom_long_schreiben Adresse = Datenblock_anfang + 9 B_wert = 92 Gosub Eeprom_byte_schreiben '--- '-- Daten für Achse 3 schreiben -- Adresse = Datenblock_anfang + 10 L_wert = 33 Gosub Eeprom_long_schreiben Adresse = Datenblock_anfang + 14 B_wert = 93 Gosub Eeprom_byte_schreiben '--- '-- Daten für Achse 4 schreiben -- Adresse = Datenblock_anfang + 15 L_wert = 34 Gosub Eeprom_long_schreiben Adresse = Datenblock_anfang + 19 B_wert = 94 Gosub Eeprom_byte_schreiben '--- '-- Daten für Achse 5 schreiben -- Adresse = Datenblock_anfang + 20 L_wert = 35 Gosub Eeprom_long_schreiben Adresse = Datenblock_anfang + 24 B_wert = 95 Gosub Eeprom_byte_schreiben '--- '-- Daten: Ausgang schreiben -- Adresse = Datenblock_anfang + 25 B_wert = 96 Gosub Eeprom_byte_schreiben '--- 'Datensatzstück bis hier = 26 Byte!!!! Datenblock_anfang = Datenblock_anfang + 26 Locate 4 , 1 For I = 192 To 260 Adresse = I Gosub Eeprom_byte_lesen Lcd B_wert; Next I Locate 14 , 1 : Lcd "Durchgang =" ; X Wait 1 Next X Loop End '========== Speicherstruktur vom EEprom ======================== ' '-------------------------------- 'erste Datensatznummer (1) 1 Byte 'Bezeichnung 11 Byte 'Anfangsadresse von dem Datensatz 2 Byte (Word) 'Endadresse vom Datensatz 2 Byte (Word) ' 'zweite Datensatznummer(2) ' ' ' (max 12 Datensatz Einträge) '----------------------------- ' ' '----------------------------- '==Datensatzanfang! (= 192) 'Schritt n 26Byte | ' |Achse1 Koordinate 4 Byte (Long) ' |Achse1 Geschwindigkeit 1 Byte ' ' |Achse2 Koordinate 4 Byte (Long) ' |Achse2 Geschwindigkeit 1 Byte' ' ' |Achse3 Koordinate 4 Byte (Long) ' |Achse3 Geschwindigkeit 1 Byte' ' ' |Achse4 Koordinate 4 Byte (Long) ' |Achse4 Geschwindigkeit 1 Byte' ' ' |Achse5 Koordinate 4 Byte (Long) ' |Achse5 Geschwindigkeit 1 Byte' ' | ' | Ausgang 1 Byte '----------------------------- 'Schritt n+1 (26 Byte) 'Schritt n+1 (26 Byte) '. '==Datensatzende! '------------------------------- '================= EEprom Byte schreiben ======================================= Eeprom_byte_schreiben: Disable Interrupts 'Adresse ist die Variable die dann in High_adress und Low_adresse per Overlay geteilt wird (für EEprom) I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse LOW I2cwbyte B_wert 'Sende Wert I2cstop 'stop Waitms 20 Enable Interrupts Return '------------------------------------------------------------------------------- '================= EEprom Byte lesen =========================================== Eeprom_byte_lesen: Disable Interrupts I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse Low I2cstart 'Start I2cwbyte &B10100001 'Sende Slavadresse +1 für Schreiben I2crbyte B_wert , Nack 'Lese Adresse vom EEprom I2cstop Enable Interrupts Return '------------------------------------------------------------------------------- '================= EEprom Word schreiben ======================================= Eeprom_word_schreiben: Disable Interrupts ' Adresse ist die Variable die dann in High_adress und Low_adresse per Overlay geteilt wird (für EEprom) I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse LOW I2cwbyte W_wert1 'Sende Wert I2cwbyte W_wert2 'Sende Wert I2cstop 'stop Waitms 20 Enable Interrupts Return '------------------------------------------------------------------------------- '================= EEprom Word lesen =========================================== Eeprom_word_lesen: Disable Interrupts '---lesen---- I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse Low I2cstart 'Start I2cwbyte &B10100001 'Sende Slavadresse +1 für Schreiben I2crbyte W_wert1 , Ack 'Lese Adresse vom EEprom I2crbyte W_wert2 , Nack 'Lese Adresse vom EEprom I2cstop 'Stop Enable Interrupts Return '------------------------------------------------------------------------------- '================= EEprom Long schreiben ======================================= Eeprom_long_schreiben: Disable Interrupts ' Adresse ist die Variable die dann in High_adress und Low_adresse per Overlay geteilt wird (für EEprom) I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse LOW I2cwbyte L_wert1 'Sende Wert I2cwbyte L_wert2 'Sende Wert I2cwbyte L_wert3 'Sende Wert I2cwbyte L_wert4 'Sende Wert I2cstop 'stop Waitms 20 Enable Interrupts Return '------------------------------------------------------------------------------- '================= EEprom Long lesen =========================================== Eeprom_long_lesen: Disable Interrupts '---lesen---- I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse Low I2cstart 'Start I2cwbyte &B10100001 'Sende Slavadresse +1 für Schreiben I2crbyte L_wert1 , Ack 'Lese Adresse vom EEprom I2crbyte L_wert2 , Ack 'Lese Adresse vom EEprom I2crbyte L_wert3 , Ack 'Lese Adresse vom EEprom I2crbyte L_wert4 , Nack 'Lese Adresse vom EEprom I2cstop 'Stop Enable Interrupts Return '------------------------------------------------------------------------------- '================= I2C Bus schreiben =========================================== I2c_bus_schreiben: Disable Interrupts I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse LOW I2cwbyte I2c_wert 'Sende I2c_wert I2cstop Waitms 20 Enable Interrupts Return '------------------------------------------------------------------------------- '================= I2C Bus lesen =============================================== I2c_bus_lesen: Disable Interrupts I2cstart 'Start I2cwbyte &B10100000 'Sende Slavadresse I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte Low_adresse 'Sende Speicheradresse Low I2cstart 'Start I2cwbyte &B10100001 'Sende Slavadresse +1 für Schreiben I2crbyte I2c_wert , Nack 'Lese I2C_wert I2cstop Enable Interrupts Return '-------------------------------------------------------------------------------
Hat jemand einen Tipp, was das sein könnte ?
Habe schon EEprom getausch, Overlaw-Adressen geändert u.s.w...
Hiiilllfffeeee ..
l.G. Roberto







Zitieren

Lesezeichen