SD-Card mit Long oder Single

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    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!

    • SD-Card mit Long oder Single

      Hallo liebe Community,



      vielleicht ist es ja ein alter Hut, aber ich habe keine Idee, wie man Long-Variable oder Single-Variable mit AVR-Dos auf die SD-Card schreiben kann.

      Es landen immer nur String-Variable auf der SD-Card, jedoch sollen die Werte mit Excel auch sofort berechnet werden können, und nicht erst umgewandelt werden müssen.



      Anbei meine verwendeten Subs für AVR-Dos



      Search_filename: zum Suchen des nächsten freien Platzes auf der SD-Card



      Open_new:file: mit dem im Searchfile definierten Filenamen



      Store_to_SD: SD-Card beschreiben mit einer Long Variablen


      Hat jemand einen Hinweis, woran das liegen könnte?


      Gruß
      Ulrich


      BASCOM Source Code

      1. Search_filename:
      2. Got_date = Date$
      3. Naked_date = Got_date
      4. Delchars Naked_date , "-" 'Binde-Striche zwischen den Uhr-Ziffern entfernen
      5. '...da das AVR-DOS nicht soviele Zeichen erlaubt
      6. For Filename = 1 To 99999
      7. Search_file_name = Str(filename)
      8. Search_file_name = Naked_date + "-" + Search_file_name + ".CSV"
      9. Check_for_file = Dir(search_file_name)
      10. If Len(check_for_file) = 0 Then
      11. File_name = Search_file_name
      12. Exit For
      13. Else
      14. File_name = ""
      15. End If
      16. Next
      17. Return
      18. '*******************************************************************************
      19. 'Routine neues File eröffnen
      20. Open_new_file:
      21. If File_name <> "" Then
      22. Search_file_name = Dir(file_name)
      23. 'Open File_name For Output As #100
      24. Open File_name For Binary As #100
      25. 'Kopfzeilen auf SD-Card schreiben
      26. Print #100,
      27. Print #100 , "Datum: " ; Got_date ; " / " ; Time$ ; " Version: " ; F_name ; " " ; F_date
      28. Print #100 , "Date, Time"
      29. 'Flush #100
      30. End If
      31. Return
      32. '*******************************************************************************
      33. 'F_hz ist als Single Dimensioniert
      34. Store_to_sd:
      35. Long_fhz = F_hz * 1000000 'Single in Long wandeln
      36. Print #100 , Got_date ; "," ; Got_time ; "," ; Long_fhz
      37. Return
      38. '*******************************************************************************
      Display All
    • New

      @Pluto25

      Pluto25 wrote:

      dim fhzb(4) as byte at Long_fhz overlay
      Print Chr(fhzb(0));Chr(fhzb(1));Chr(fhzb(2));Chr(fhzb(3))

      Mein Problem ist es, ein Longwort als numerische Variable auf der SD-Card zu speichern.

      Wenn ich den obigen Vorschlag richtig verstehe, bedeutet das, dass die einzelnen Bytes fhzb 1-4) im Overlay Longwort abgelegt werden.
      Sehe ich das so richtig?


      Jedoch liegt das Longwort als solches aus der Umwandlung von Single in Long ja schon vor. Oder bin ich da auf dem falschen Weg?


      In der AVR-DOS Hilfe (siehe Bild) gibt es dieses Beispiel für Xtiny, demnach müsste es wohl möglich sein? Konnte ich aber noch nicht testen.



      Gruß
      Ulrich
      Files
    • New

      Ulrich wrote:

      vielleicht ist es ja ein alter Hut, aber ich habe keine Idee, wie man Long-Variable oder Single-Variable mit AVR-Dos auf die SD-Card schreiben kann.

      Es landen immer nur String-Variable auf der SD-Card, jedoch sollen die Werte mit Excel auch sofort berechnet werden können, und nicht erst umgewandelt werden müssen.
      Wenn du binär speichern willst, die Variablen-Typen wie Long oder Single aber nicht unterstützt werden, dann musst du die Bytes einzeln ablegen, z.B. so, wie es Pluto beschrieben hat.

      Stichwort Array-Overlay auf die Long oder Single legen und dann in einer Schleife mit Put #2,.. ablegen:

      BASCOM Source Code

      1. Config Base=0 ' Arrays 0-Basiert
      2. Dim myLong as Long ' deine Long-Variable
      3. Dim OverlayArray(4) as myLong Overlay
      4. For ByteNr = 0 to 3
      5. Put #2, OverlayArray(ByteNr) ' Byteweise ablegen
      6. Next ByteNr
      Du schreibst, dass das für Excel ist.
      Soweit ich weis, liest Excel aber Text-Format ein (z.B. CSV). Oder versuchst du das binäre Excelformat direkt zu schreiben?

      The post was edited 1 time, last by Mitch64 ().

    • New

      @Mitch64

      Im Prozedere mit der Put-Anweisung müsste es da nicht heißen:

      Dim OverlayArray(4) as byte at myLong Overlay

      Wenn ich das Put durch Print ersetze und im Simulator laufen lasse, dann haben die 4 Bytes Null als Wert. Wo liegt mein Betrachtungsfehler?

      BASCOM Source Code

      1. $regfile = "m2560def.dat"
      2. $crystal = 16000000
      3. $hwstack = 200
      4. $swstack = 400
      5. $framesize = 400
      6. $sim
      7. Disable Jtag
      8. Dim A As Byte
      9. Dim F_hz As Single
      10. Dim Bytenr As Byte
      11. Dim Mylong As Long
      12. Dim Overlayarray(4) As Byte At Mylong Overlay
      13. '------------------------------------------------------
      14. Config Base = 0
      15. F_hz = 60.12345
      16. Mylong = F_hz * 1000000 'Single in Long wandeln
      17. Print "Long=" ; Mylong
      18. ' Arrays 0-Basiert
      19. For Bytenr = 0 To 3
      20. A = Overlayarray(bytenr)
      21. Print , A
      22. 'Put #2 , Overlayarray(bytenr) ' Byteweise ablegen
      23. Next Bytenr
      24. End
      Display All


      Ich verwende den Flow CSV Viewer zur Darstellung der Loggerkurven Da bin ich noch nicht ganz schlau geworden dieser erwartet ein *.csv Format, mit numerischen Variablen. Mit String-Variablen funktioniert das leider nicht.

      Die Logger-Werte in Excel erst umzuwandeln, ist mühselig.
    • New

      Wenn du ein CSV-Format brauchst, dann ist das Textbasiert und nicht binär.
      Von daher macht es keinen Sinn einen Long binär zu speichern.

      Ein typisches CSV-Format trennt die Werte/Texte/Strings, die in die Spalten aufgeteilt wird, durch ein TAB oder ein ; (semicolon)

      Zahlen stehen also wie Text da.
      Siehe Wikipedia.

      Dort steht zwar Komma-Getrennt, meistens findet man aber ; als Trennzeichen oder das Tab (Chr(9)). Das sind auch die ersten 2 Vorgaben bei Excel-Import.

      Wenn du also als Beispiel schreibst:

      BASCOM Source Code

      1. Print "Zeile 1:" ; ";" ; "MyLong:" ; ";" ; myLong
      2. Print "Zeile 2:" ; ";" ; "MyLong:" ; ";" ; myLong
      bekommt du beim Importieren 2 Zeilen.
      Spalte A den Text "Zeile x:", dann Spalte B den Text "myLong" und dann in Spalte C die Zahl als Ascii-Wert von dem Long.
    • New

      Ulrich wrote:

      Im Prozedere mit der Put-Anweisung müsste es da nicht heißen:

      Dim OverlayArray(4) as byte at myLong Overlay
      Das habe ich so auch nicht geschrieben.

      Bei Put #2 xxx

      musst du dich auf das OverlayArray mit dem korrekten Index beziehen.
      Das Dim für das Array ist davor nötig, damit du überhaupt ein Overlay-Array bekommst.

      Aber ich denke, das hat sich sowieso erledigt.
    • New

      @Mitch64 @Pluto25

      vielen Dank für eure intensive Unterstützung, jedoch habe ich auch noch weitere Versuche mit den unter Post#1 vorgestellten originalen Sub Store_to_Sd getestet.

      Offenbar hatte ich den CSV-Viewer noch nicht richtig verstanden, denn wenn man den Long_fhz Wert zu Beginn nach der Print #100 Ausgabe setzt, dann wird dieser Wert vom Viewer auch wie gewünscht als Integer angezeigt und dargestellt.

      Wenn jedoch zuvor Datum und Uhrzeit ausgegeben werden und erst danach Long_fhz, dann interpretiert der Viewer diesen Wert auch noch als String. Und nur als Integer-Wert liefert den Viewer auch die zugehörigen darstellbaren Kurven.

      z.B.: Print #100 , Long_fhz; "," ; Got_date ; "," ; Got_time liefert die gewünschte Anzeige im Viewer,

      wogegen hier Print #100 , Got_date ; "," ; Got_time ; "," ; Long_fhz die Long_fhz Variable als String gewertet wird.


      Das werde ich noch mal im Viewer-Forum ansprechen.

      Gruß
      Ulrich
    • New

      Für alle die mit dem Flow CSV Viewer arbeiten bzw. arbeiten wollen, hier die Antwort aus dem Flow CSV Viewer Forum

      Hallo nochmal Ulrich,

      ich brauche ein paar mehr Informationen, um herauszufinden, was hier los ist. Kannst du mir bitte die 4 ersten Zeilen jeder Datei schicken, damit ich genau sehen kann, wie sie formatiert sind?


      Im Allgemeinen bestimmt der Viewer die Variablentypen, indem er das Format der Daten in den Spalten betrachtet. Wenn für eine bestimmte Spalte nur eine Zeile ein nicht-numerisches Zeichen enthält, wird diese Spalte als String-Spalte betrachtet. Die Reihenfolge der Spalten hat keinen Einfluss auf die Erkennung des Typs. Wenn der Viewer jedoch feststellt, dass die erste Zeile eine Kopfzeile mit Variablennamen ist, hat diese Zeile natürlich keinen Einfluss auf den Typ. An dieser Stelle kann es etwas unvorhersehbar werden, da der Algorithmus zur automatischen Erkennung von Kopfzeilen recht kompliziert ist. Deshalb würde ich gerne sowohl die erste Zeile als auch einige Datenzeilen für beide Dateien sehen.


      In den Voreinstellungen auf der Registerkarte CSV-Import können Sie die verschiedenen Einstellungen von "Automatisch erkennen" auf die Einstellung ändern, die zu Ihren CSV-Dateien passt. Das sollte den Import stabiler machen.



      Mit freundlichen Grüßen,
      Gustaf
    • New

      Für alle die mit dem Flow CSV Viewer arbeiten wollen.

      Mein Problem zuvor war, dass single- oder integer-Werte nicht vom Viewer erkannt wurden und nur als Strings eingetragen wurden. Dazu bat ich unsere Forums-Schwarmintelligenz um eine Lösung, weil ich annahm, dass dafür eine Abspeichern von numerischen Werten auf eine SD-Card erforderlich sei. Das ist jedoch nicht eforderlich, da das "Problem" mit dem Viewer selbst gelöst werden kann, indem man das Autodetct (im csv import menue) abschaltet und das zeichen "#" einsetzt.


      Hier noch eine weitere Antwort des Supports diesbezüglich:

      OK, I think I understand! I'm glad you found a solution. However, note that Ignore rows starting with #
      only has effect if you have rows in your CSV file that start with #. If
      I understand the situation correctly, I think the problem is the first
      row:

      Datum: 18-09-23 / 11:30:54 Version V30-50Hz vom 17-09-2023 17:18:51

      If possible, you should prepend this with a #, like this:


      # Datum: 18-09-23 / 11:30:54 Version V30-50Hz vom 17-09-2023 17:18:51


      Although there is no official CSV format standard, it's very common to

      use # as a line comment character in CSV files, allowing for adding
      extra information like this line. This way, you adhere to the
      "unofficial CSV standard". If you do that (and ensure Ignore rows starting with # is still checked), you can probably go back to Auto Detect on all the other settings, and now your variable names will also be displayed correctly in Flow.



      Hope this helps!