Fliesskommavariablenarry( Single ) in externem EEProm speichern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Fliesskommavariablenarry( Single ) in externem EEProm speichern

    Hallo,

    in einem Projekt möchte ich Luftdruckdaten, die als Fliesskommazahlen vorliegen, in einem 24er Array jede volle Stunde in einem externen EEProm, 24c65, speichern.

    Das EEProm nimmt pro Speicherplatz 1 Byte, 8 Bit, auf.

    Also müsste die Fliesskommazahl in 4 Bytes zerlegt werden, jedes Byte in einer separaten Adresse abgelegt und beim Einlesen

    wieder zusammengesetzt werden.

    Ich dacht an so etwas wie eine Schiebeoperation um jeweils 8 Bit herauszuschieben und dann abzuspeichern.

    Aber mir fehlt da echt ein Ansatz.

    Habt ihr eine Idee? a_56_df238249
  • Überleg mal, das mit overlay zu machen. Dann wird deine single in 4 bytes zerlegt und aus den gelesenen 4 bytes kannst du mit overlay auch ein single zusammen setzen.
    Raum für Notizen

    -----------------------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------------------
  • Hallo Hennesf

    Ich hätte hier mal drei Sub's für das schreiben,lesen und löschen eines EEproms 24C64. Wobei AX die Speicherstelle ist
    Netten Gruß Cable

    BASCOM-Quellcode

    1. Sub Read_eeprom
    2. Temp_single = Ax / 256 'Ermitteln der Fließkommazahl
    3. High_byte = Abs(temp_single) 'aus dem Fließkommzahl den ganzahligen Anteil (Highbyte)
    4. Temp_int = High_byte * 255 'Wert des Ganzahligen Anteils
    5. Low_byte = Ax - Temp_int
    6. I2cstart 'Start I2C
    7. I2cwbyte &HA0 'sende Slave Adresse
    8. I2cwbyte High_byte 'Sende Speicheradresse High
    9. I2cwbyte Low_byte 'Sende Speicheradresse LOW
    10. I2cstart 'Start I2C
    11. I2cwbyte &HA1 'sende Slave Adresse +1 für Eeprom_value
    12. I2crbyte Eeprom_value , Nack 'lese Wert vom EEprom
    13. I2cstop 'Stop I2C
    14. End Sub
    15. '***************************** Write EEprom ************************************
    16. Sub Write_eeprom
    17. Temp_single = Ax / 256 'Ermitteln der Fließkommazahl
    18. High_byte = Abs(temp_single) 'aus dem Fließkommzahl den ganzahligen Anteil (Highbyte)
    19. Temp_int = High_byte * 255 'Wert des Ganzahligen Anteils
    20. Low_byte = Ax - Temp_int
    21. I2cstart 'Start I2C
    22. I2cwbyte &HA0
    23. I2cwbyte High_byte 'Sende Speicheradresse High
    24. I2cwbyte Low_byte 'Sende Speicheradresse LOW
    25. I2cwbyte Eeprom_value 'Schreibe Wert
    26. I2cstop
    27. Waitms 5
    28. End Sub
    29. '****************************** EEprom löschen ******************************
    30. Sub Earse_eeprom
    31. Cls
    32. Locate 1 , 1 : Lcd "EEP-Formatierung"
    33. Temp_byte = 1
    34. For N = 1 To 4000 'Speicherstelle
    35. Temp_single = N / 40 : Temp_int = Abs(temp_single) 'Für LCD Ausgabe
    36. If Temp_byte = Temp_int Then
    37. Locate 2 , 1 : Lcd "==> " ; Temp_int ; " % "
    38. Incr Temp_byte
    39. End If
    40. Ax = N 'Speicherstelle
    41. Eeprom_value = &HFF 'mit Wert füllen
    42. Call Write_eeprom 'ins EEprom übertragen
    43. Next
    44. End Sub
    45. '**********
    Alles anzeigen
    Versuch macht klug !
  • Ich sehe kein Problem. Du hast ein array Messwert(24) as single, das braucht 96 bytes, die du dann zum eeprom überträgst. Die bekommst du durch ein overlay 'Einzelbytes(96) as byte at messwert(1) at overlay' (wenn ich mich jetzt mit der Syntax nicht vertan hab'.)
    Jetzt musst du nur noch die Einzelbytes(x) mit einer Schleife in's eeprom speichern.
    Raum für Notizen

    -----------------------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------------------
  • Cable schrieb:

    Ich hätte hier mal drei Sub's für das schreiben,lesen und löschen eines EEproms 24C64. Wobei AX die Speicherstelle ist
    Servus,
    leider kann ich deine Codes nicht verstehen. Beispiel:
    1. Sub Write_eeprom
      I2cwbyte Eeprom_value 'Schreibe Wert

      Hier wird ein Byte geschrieben, oder??

      Was ist aus dem 32 Bit Single geworden?

      Und wie kommt das Ergebnis dieser Operationen:
      1. Temp_single = Ax / 256 'Ermitteln der Fließkommazahl
      2. High_byte = Abs(temp_single) 'aus dem Fließkommzahl den ganzahligen Anteil (Highbyte)
      3. Temp_int = High_byte * 255 'Wert des Ganzahligen Anteils
      4. Low_byte = Ax - Temp_int
      nach Eeprom_value?

      Sorry, da steig ich nicht durch!
  • Durch ein overlay kannst du physikalischen Speicher 2 verschiedene Namen geben. Ein single belegt 4 bytes an Speicherplatz, diese 4 bytes kannst du durch ein overlay als byte1..byte4 bezeichnen und einzeln ansprechen.
    avrhelp.mcselec.com/dim.htm
    Raum für Notizen

    -----------------------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------------------
  • tschoeatsch schrieb:

    Durch ein overlay kannst du physikalischen Speicher 2 verschiedene Namen geben. Ein single belegt 4 bytes an Speicherplatz, diese 4 bytes kannst du durch ein overlay als byte1..byte4 bezeichnen und einzeln ansprechen.
    Hier der erste Codeschnipsel mit dem ich versuche die Single zu zerlegen:

    26 Dim Testsingle_write As Single At &H60

    Testsingle_write = 920.123

    30 Dim Byte1_w As Byte At &H60 Overlay
    31 Dim Byte2_w As Byte At &H61 Overlay
    32 Dim Byte3_w As Byte At &H62 Overlay
    33 Dim Byte4_w As Byte At &H63 Overlay

    gibt aber gleich ne Fehlermeldung:
    Error : 90 Line : 26 Address out of bounds [TESTSINGLE_WRITE] , in File : Def_dim_dec.inc
    Error : 90 Line : 30 Address out of bounds [BYTE1_W] , in File : Def_dim_dec.inc

    ????
  • Schreibe lieber nicht auf absolute Adressen (&H60) sondern lass den Compiler die Adressen verwalten.
    Dein Overlay machst du dann so:

    Dim Testsingle_write As Single
    Dim Byte1_w As Byte At Testsingle_write Overlay
    Dim Byte2_w As Byte At Testsingle_write + 1 Overlay
    Dim Byte3_w As Byte At Testsingle_write + 2 Overlay
    Dim Byte4_w As Byte At Testsingle_write + 3 Overlay

    Und einfacher geht es dann noch, wenn du das Array nimmst, was Tschoeatsch schon vorgeschlagen hat:
    Dim Testsingle_write As Single
    Dim Byte_w(4) As Byte At Testsingle_write Overlay
  • hero schrieb:

    Schreibe lieber nicht auf absolute Adressen (&H60) sondern lass den Compiler die Adressen verwalten.
    Dein Overlay machst du dann so:
    Servus,
    ohne deine Nachricht gelesen zu haben habe ich es genau so probiert und damit gab es keine Fehlermeldung mehr.

    Dim Testsingle_write As Single

    Testsingle_write = 920.125 'Testzahl

    Dim Byte1_w As Byte At Testsingle_write Overlay
    Dim Byte2_w As Byte At Testsingle_write + 1 Overlay
    Dim Byte3_w As Byte At Testsingle_write + 2 Overlay
    Dim Byte4_w As Byte At Testsingle_write + 3 Overlay

    Für mich ist das Problem nun gelöst.
    Ich danke für eure Unterstützung.

    Schönen Sonntag noch.
    PS: Muss dieser Thread jetzt irgendwie geschlossen werden?