Archiv verlassen und diese Seite im Standarddesign anzeigen : Long Variable in I2C-EEprom schreiben und wieder lesen ?
Hallo Leute
Habe da ein kleines Problem.
Ich möchte eine Long Variable in ein I2C EEprom schreiben und wieder lesen.
Leider mache ich da irgendwie eine Fehler.. :-k
Habe das bis jetzt nur mit Word-Variablen gemacht.
Jetzt kann die Zahl aber auch negativ sein.
Die zerlegung habe ich wieder mit Overlay gemacht:
Dim Koordinate As Long At $162
Dim Koordinate_teil1 As Byte At $162 Overlay
Dim Koordinate_teil2 As Byte At $163 Overlay
Dim Koordinate_teil3 As Byte At $164 Overlay
Dim Koordinate_teil4 As Byte At $165 Overlay
Es kommt aber nur Müll beim Lesen raus.(EEprom)
Darum habe ich mir mal Werte ohne EEprom auf das LCD schreiben lassen:
Wert: 45 = 45 , 000, 000 , 000
Wert 294= 38 , 001, 000 , 000
Also Ok
Wert -13 = 243, 255 , 255 , 255
Wert -313= 199, 254 , 255 , 255
Wie kriege ich da wieder eine Minus-Zahl raus ??
Andere Frage:
Ins EEprom schreibe ich normal so:
I2cstart 'Start
I2cwbyte &B10100010 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte Wert 'Sende Wert
I2cstop 'stop
Kann man das dann bei 4Byte hintereinander auch so schreiben: ?!
I2cstart 'Start
I2cwbyte &B10100010 'Sende Slavadresse (Adresse für A0=EIN)
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte Koordinate_teil1 'Sende Wert
I2cwbyte Koordinate_teil2 'Sende Wert
I2cwbyte Koordinate_teil3 'Sende Wert
I2cwbyte Koordinate_teil4 'Sende Wert
I2cstop 'stop
b.z.w. so lesen : ?
I2cstart 'Start
I2cwbyte &B10100010 'Sende Slavadresse (Adresse für A0=EIN)
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse Low
I2cstart 'Start
I2cwbyte &B10100011 'Sende Slavadresse +1 für Schreiben
I2crbyte Koordinate_teil1 'Lese Adresse vom EEprom
I2crbyte Koordinate_teil2 'Lese Adresse vom EEprom
I2crbyte Koordinate_teil3 'Lese Adresse vom EEprom
I2crbyte Koordinate_teil4 , Nack 'Lese Adresse vom EEprom
I2cstop
Bitte um Hilfe O:)
l.G. Roberto
Versuch mal:
Dim Koordbytes(4) As Byte
Dim Koordinate As Long At Koordbytes Overlay
Dim Ix As Byte
Dim Low_adresse As Byte
Dim High_adresse As Byte
Dim Eeram_adr As Word At Low_adresse Overlay
Eeram_adr = &H0000
Koordinate = 294
Gosub Print_out
Gosub Ee_out
Eeram_adr = Eeram_adr + 4
Koordinate = -313
Gosub Print_out
Gosub Ee_out
Eeram_adr = &H0000
Gosub Ee_inp
Print Str(koordinate)
Eeram_adr = Eeram_adr + 4
Gosub Ee_inp
Print Str(koordinate)
End
Print_out:
Print Str(koordinate) ; "-> ";
For Ix = 1 To 4
Print Str(koordbytes(ix)) ; " ";
Next
Print
Return
Ee_out:
I2cstart 'Start
I2cwbyte &B10100010 'Sende Slavadresse (Adresse für A0=EIN)
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte Koordbytes(1)
I2cwbyte Koordbytes(2)
I2cwbyte Koordbytes(3)
I2cwbyte Koordbytes(4)
I2cstop 'stop
Return
Ee_inp:
I2cstart 'Start
I2cwbyte &B10100010 'Sende Slavadresse (Adresse für A0=EIN)
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cstart 'Start
I2cwbyte &B10100011
I2crbyte Koordbytes(1) , Ack
I2crbyte Koordbytes(2) , Ack
I2crbyte Koordbytes(3) , Ack
I2crbyte Koordbytes(4) , Nack
I2cstop 'stop
Return
Eigentlich sollte das funzen (hoff ich :oops:)
Hallo Robert
Danke für die schnelle Antwort.
Werde mir das mal durchkauen :-)
l.G. Roberto
Hallo Robert
Habe jetzt den ganzen Tag probiert...
Komme auf keinen grünen Zweig.
Habe mal die Long mit dem zerlegt:
Dim Koordinate As Long At $113
Dim Koordinate_teil1 As Byte At $113 Overlay
Dim Koordinate_teil2 As Byte At $114 Overlay
Dim Koordinate_teil3 As Byte At $104 Overlay
Dim Koordinate_teil4 As Byte At $105 Overlay
und dann (ohne EEprom) wieder in so eine Struktur geschrieben:
Dim Koordinate1 As Long At $152
Dim Koordinate1_teil1 As Byte At $152 Overlay
Dim Koordinate1_teil2 As Byte At $153 Overlay
Dim Koordinate1_teil3 As Byte At $154 Overlay
Dim Koordinate1_teil4 As Byte At $155 Overlay
Also in jeweils "koordinate1_teil1" u.s.w. und es kam an der "Koordinate1"
auch wieder eine Long raus (auch mit negativen Werten)
Aber irgendwie geht es nicht über das EEprom ?!
Dann habe ich probiert mit Byte in das EEprom zu schreiben--> Geht!
Wenn ich mit Word probiere und ich schreibe z.B. 1 rein
(also 1 als Word und dann zerlegt in Byte als 1 und 0)
bekomme ich raus 1 und 1 und in Summe schreibt er mir dann 257 hin (als Word)
Bei 2 kommt 2 und 2 und zeigt 514 an ](*,)
Bei 3 kommt 3 und 3 und zeigt 771
Jetzt wollt eich deinen Code mal probieren (umsetzen) aber komme damit nicht ganz zurecht :-k
Wie muss man das z.B. verstehen:
Dim Koordbytes(4) As Byte
Dim Koordinate As Long At Koordbytes Overlay
Dim Ix As Byte
So wie ich das kenne, habe ich ja bei mir die Long-Variable und die reicht 4 Byte weit in den Speicher und mit Overlay greife ich die Byte's jeweils ein Stück weiter oben jeweils ab.
Kann ich die Werte vom EEprom nur mit einem Array auslesen ?
Ohne EEprom geht es ja so auch ?! :-k
(z.B. direkt in die Speicherstelle schreiben)
l.G. Roberto
Nein, array muß nicht sein. du kannst es auch mit "teil1-4" machen.
Wenn's ohne EEPROM richtig zu übertragen geht, muß es mit EEPROM auch gehen.
Schreib mal rein, lies es wieder, und berichte, was du genau zurückgekriegt hast.
(ev. + aktueller Sourcecode)
Wäre ja gelacht.
Hallo
Hier mal der Minimalcode:
$regfile = "m8def.dat"
$crystal = 10000000
$hwstack = 250
$swstack = 250
$framesize = 250
'################## Config Port's ##############################################
'-----config Port D
Config Portd = 255
'##################### Config für LCD ################################################## ##
Config Lcd = 40 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5
Config Lcdbus = 4
Config Lcdmode = Port
Cursor On
Cls
'############################ Config ADC #######################################
Config Adc = Single , Prescaler = Auto
Start Adc
'############################ Config I2C Bus ###################################
Config Scl = Portd.6 ' I2C-Port festlegen
Config Sda = Portd.7 ' I2C-Port festlegen
'################## Variablen ################################################## '
Dim I As Word ' zum rechnen
Dim X As Word
Dim Koordinate As Long At $113
Dim Koordinate_teil1 As Byte At $113 Overlay
Dim Koordinate_teil2 As Byte At $114 Overlay
Dim Koordinate_teil3 As Byte At $115 Overlay
Dim Koordinate_teil4 As Byte At $116 Overlay
Dim Adresse As Word At $100
Dim Low_adresse As Byte At $100 Overlay
Dim High_adresse As Byte At $101 Overlay
'---------------------------------------------
Do
For I = 1 To 10
Adresse = I
Koordinate = Koordinate + 10
Gosub Eeprom_schreiben
Locate 1 , 1
Lcd "I=" ; Adresse ; " "
Locate 1 , 5
Lcd "K=" ; Koordinate ; " "
Locate 1 , 14
Lcd "A=" ; Koordinate_teil1 ; " "
Locate 1 , 21
Lcd "B=" ; Koordinate_teil2 ; " "
Locate 1 , 28
Lcd "C=" ; Koordinate_teil3 ; " "
Locate 1 , 35
Lcd "D=" ; Koordinate_teil4 ; " "
Waitms 500
Next I
For I = 1 To 10
Adresse = I
Gosub Eeprom_lesen
Locate 2 , 1
Lcd "I=" ; Adresse ; " "
Locate 2 , 5
Lcd "K=" ; Koordinate ; " "
Locate 2 , 14
Lcd "A=" ; Koordinate_teil1 ; " "
Locate 2 , 21
Lcd "B=" ; Koordinate_teil2 ; " "
Locate 2 , 28
Lcd "C=" ; Koordinate_teil3 ; " "
Locate 2 , 35
Lcd "D=" ; Koordinate_teil4 ; " "
Waitms 500
Do
X = Getadc(3)
Waitms 100
Loop Until X > 600
Next I
Wait 2
Loop
End
Eeprom_schreiben:
'----schreiben----
I2cstart 'Start
I2cwbyte &B10100010 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse LOW
I2cwbyte Koordinate_teil1 'Sende Wert
I2cwbyte Koordinate_teil2 'Sende Wert
I2cwbyte Koordinate_teil3 'Sende Wert
I2cwbyte Koordinate_teil4 'Sende Wert
I2cstop 'stop
Waitms 10
Return
'--------------------------------
Eeprom_lesen:
'---lesen----
I2cstart 'Start
I2cwbyte &B10100010 'Sende Slavadresse
I2cwbyte High_adresse 'Sende Speicheradresse High
I2cwbyte Low_adresse 'Sende Speicheradresse Low
I2cstart 'Start
I2cwbyte &B10100011 'Sende Slavadresse +1 für Schreiben
I2crbyte Koordinate_teil1 , Ack 'Lese Adresse vom EEprom
I2crbyte Koordinate_teil2 , Ack 'Lese Adresse vom EEprom
I2crbyte Koordinate_teil3 , Ack 'Lese Adresse vom EEprom
I2crbyte Koordinate_teil4 , Nack 'Lese Adresse vom EEprom
I2cstop 'Stop
Return
'----------------------------------
Beim Auslesen kommt dann:
I=1 K=67305985.. A=10 B=20 C=30 D=40
I=2 K=84148994.. A=20 B=30 C=40 D=50
I=3 K=10099200... A=30 B=40 C=50 D=60
.
u.s.w.
:-k
Ps.:
Wenn ich bis 12 lese, kommen dann Bei B-D die Nullen nach.
Es scheint so, als würde er da nur immer ein Byte reinschreiben?!
(Statt 4 Byte hintereinader)
l.G.
Halt, Steirer, ein long brauch ja 4 Byte !
For I = 1 To 40 STEP 4
das mußt du nochmal probieren
Hallo Wiener
Ups.. genau, dass hatte ich übersehen...
Beim originalen Programm hatte ich eh +4 dabei nur da hab ich es jetzt vergessen..
Oft sieht man den Baum vor lauter Wald nicht mehr ;-)
Danke !!!!!!!!!!!!!!!!!!!!!!!!!!!
So geht es jetzt erstmal.
Jetzt muss ich es wieder in mein original Programm umstricken.
Mal schauen, ob es dann auch noch geht ;-)
Danke jedenfalls....!! :-)
Weist Du vielleicht auch noch, ob es da eine Routine gibt, die merkt wenn ein Fehler auf dem I2C-Bus ist ?
Und deinen Code von vorher...
Dim Koordbytes(4) As Byte
Dim Koordinate As Long At Koordbytes Overlay
Dim Ix As Byte
Kannst Du mir das bitte noch erklären ?!
Bei:
----------
DIM x as long
Dim xx(4) as byte x overlay
---------------------
(habe ich wo anders gesehen..)
Kann ich mir noch vorstellen, dass ich mit dem Array die Stellen vom X anspringe... (long)
Aber bei deinem weis ich nicht so recht ?! :-)
Schöne Grüsse nach Wien.. :-)
Schau,
ein Bytes(4) braucht vier byte
ein LONG braucht auch vier Byte
Wenn ich die addresse durch "OVERLAY" gleichsetze, liegen
BYTES(1)
BYTES(2)
BYTES(3)
BYTES(4)
genau auf den (4) einzelnen Bytes von "LONG"
dann kann ich die einzelnen Bytes von "LONG" mit "for 1 to 4" abarbeiten.
Hallo Robert
Das mit der LONG Länge und den Bytes ist mir schon klar aber:
Wenn ich so schreibe:
Dim X as long
Dim XX(4) as byte X overlay
ist XX der Zeiger auf einen Teil von X
Bei deiner Schreibweise ist das aber schneinbar verdreht..
Muss ich das dann bei dir so sehen, dass "Koordinate" der Zeiger ist
auf das Array "Koordbytes(4)"
von dem Beispiel
Dim Koordbytes(4) As Byte
Dim Koordinate As Long At Koordbytes Overlay
Dim Ix As Byte
Ps.:
Das EEprom funktioniert noch immer \:D/ \:D/
Bei diesem konkreten Beispiel is die Reihenfolge egal
Dim Koordbytes(4) As Byte
Dim Koordinate As Long At Koordbytes Overlay
Is das gleiche Ergebnis wie
Dim Koordinate As Long
Dim Koordbytes(4) As Byte At Koordinate Overlay
Bei einzelnen byte-dims geht es aber nur so
Dim Koordbyte_1 As Byte
Dim Koordbyte_2 As Byte
Dim Koordbyte_3 As Byte
Dim Koordbyte_4 As Byte
Dim Koordinate As Long At Koordbyte_1 Overlay
Deshalb hab ich mir angewöhnt, immer nachher das längere "DIM" drüberzuklatschen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.