Hallo,

ich hab nen Source geschrieben, welcher mir als Subs erleichtern soll Variabeln in ein 24C64 zu speichern und zu lesen. Möglich sind bei mir damit auch word uns Singles zu verarveiten.
Jedoch tritt hier ein seltsamer Effekt auf. Wenn ich z.B. die Single 12.65 speichr möchte geschieht folgendes:
Die Single im Ram wird zu 12.649999....

Ok, kann ja sein, da es sich um Singles und nich um Doubles handelt....wäre für mich ok. Aber wenn ich diesen Wert wieder aus dem EEprom lese ist er 12.625!

Wie kommt das? Ich selbst kam dem rätsel noch nicht auf die Spur, aber vieleicht kann mmir von euch jemand sagen, was hier passiert.

Source auf Single-Variabeln gekürzt:
Code:
$lib "i2c.lib"
Config Scl = Portc.0                                        'PIN für I2C Bus
Config Sda = Portc.1
I2cinit


Config I2cdelay = 3

Dim Eesingle As Single
Dim Eeword(2) As Word At Eesingle Overlay
Dim Eebyte(6) As Byte At Eesingle Overlay
Dim Eebanz As Byte
Dim Ee_adresse As Word

Const 24c64w = &B10100000
Const 24c64r = &B10100001


'Definition der Funktionen ++++++++++++++++++++++++++++++++++++++++++++++++++++

Declare Function Loadsingle(byval Ee_adresse As Word) As Single

Declare Sub Savesingle(byval Ee_daten As Single , Byval Ee_adresse As Word )

Goto 001


Sub Savesingle(byval Ee_daten As Single , Byref Ee_adresse As Word )
Eesingle = Ee_daten
Ee_adresse = Ee_adresse
Eebanz = 4 : Gosub Write_ee
End Sub


Function Loadsingle(byref Ee_adresse As Word) As Single
Ee_adresse = Ee_adresse
Eebanz = 4 : Gosub Read_ee
Loadsingle = Eesingle
End Function






'Routine zum schreiben von Daten in das EEPROM ++++++++++++++++++++++++++++++++
Write_ee:
Eebanz = Eebanz + 2

    Eebyte(1) = High(ee_adresse)
    Eebyte(2) = Low(ee_adresse)
    I2csend 24c64w , Eebyte(1) , Eebanz
    Waitms 30
Return


'Routine zum lesen von Daten aus dem EEPROM ++++++++++++++++++++++++++++++++++++
Read_ee:

    Eebyte(1) = High(ee_adresse)
    Eebyte(2) = Low(ee_adresse)

    I2csend 24c64w , Eebyte(1) , 2
    Waitms 5
    I2creceive 24c64r , Eebyte(3) , 0 , Eebanz
    Waitms 25

Return
001:


Dim Ins As Single
Dim Inw As Word
Dim Inb As Byte


Do
Input "Single: " , Ins
Call Savesingle(ins , 100)
Print "gespeicherter Wert: ";ins
Ins = 0
Ins = Loadsingle(100)
Print "geladener Wert: " ; Ins

Loop