PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Long Variable in I2C-EEprom schreiben und wieder lesen ?



Roberto
30.10.2006, 16:48
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

PicNick
30.10.2006, 19:54
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:)

Roberto
31.10.2006, 01:36
Hallo Robert
Danke für die schnelle Antwort.
Werde mir das mal durchkauen :-)

l.G. Roberto

Roberto
31.10.2006, 14:26
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

PicNick
31.10.2006, 16:44
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.

Roberto
31.10.2006, 18:08
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.

PicNick
31.10.2006, 19:19
Halt, Steirer, ein long brauch ja 4 Byte !

For I = 1 To 40 STEP 4

das mußt du nochmal probieren

Roberto
31.10.2006, 19:38
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.. :-)

PicNick
31.10.2006, 19:52
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.

Roberto
31.10.2006, 22:49
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/

PicNick
01.11.2006, 09:52
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.