Roberto
04.12.2006, 11:10
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!!
$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
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!!
$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