Datenlogger auf ARDUINO- Basis

    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!

    • Hallo Ulrich,
      in dem Moment, wo du das Label Version_mode anspringst, ist der UART Interrupt schon aktiviert.
      Da auch die globalen Ints schon aktiv sind, wird beim Empfang eines Zeichens die ISR Open_log_Uart angesprungen.
      Dort wird der UDR ausgelesen. Damit ist das Zeichen nicht mehr im UDR, wenn du es in der Sub Version_mode lesen willst.
      Ändere doch dort mal die Zeile
      Buf(uart_cnt) = Udr
      in
      Buf(uart_cnt) = B_udr
      ab. Denn in der Variable B_udr ist das Zeichen ja schon drin.
    • Hallo Franz,

      vielen Dank für diesen Hinweis, habe die Anpassungen der Variablen durchgeführt. Es hat sich jedoch nichts geändert, alle möglichen Byte-Werte um die 118 herum, wie 116 und 117 und noch viele andere, sind vorhanden, aber weder 118 noch irgendwelche Zahlen, die für die Versionsangabe stehen sollten.

      Ich fürchte fast, dass die Art so wie in Github beschrieben (war vor 6-8 Jahren) nicht mehr passt.

      github.com/sparkfun/OpenLog/bl…/OpenLog_Benchmarking.ino

      Dort das Beispiel GetVersionNumber

      Habe es bei drei verschiedenen OpenLog-Modulen ausprobiert, alle zeigen das gleiche Bild.

      Das Abspeichern auf SD-Card funktioniert ja perfekt, die Versionsnummer wäre schon noch ein i-Tüpfelchen.
    • Ich denke das liegt an deiner Versions_Mode Routine.

      BASCOM Source Code

      1. Version_mode: '200 Zeichen einlesen, nach Github-Arduino- Beispiel
      2. Print #1,
      3. Print #1 , "-----Versionsabfrage ---"
      4. Print "? " 'Help Aufruf laut Github Arduino Programm
      5. Waitms 100
      6. Do
      7. Print "read " 'Daten von SD-Card einlesen
      8. Do
      9. nop
      10. Loop Until Zeichen_ist_da = 1 'Merker: Uart hat Zeichen empfangen
      11. Zeichen_ist_da = 0 ' 'Merker zurücksetzen
      12. Incr Uart_cnt 'zählen der Zeichen
      13. Buf(uart_cnt) = Udr 'speichern in Buffer, Auslesen im Hauptprogramm
      14. Loop Until Uart_cnt > 200
      15. B_udr = ""
      16. Return
      Display All
      Bei Zeile 9 - 11 wartest du auf ein Zeichen.
      Wenn eins da ist, wird es in Zeile 15 im Buffer abgelegt. Hier solltest du B_Udr verwenden und nicht UDR. Das Zeichen wurde ja schon ausgelesen.
      Und wenn jetzt noch nicht genug Zeichen empfangen wurden, beginnt das wieder bei Zeile 7.

      Und jetzt wird "read " ausgegeben mit 9600 Baud über Soft-Uart. Das sind 7 Zeichen (incl. CRLF).
      Und alles was in der Zeit empfangen wird (auch mit 9600 Baud), bis auf das letzte Byte, wird im UDR-Register überschrieben.


      Ich denke das gesuchte "v" ist nicht im Buffer, oder vielleicht nur ab und zu, dann passen aber die Daten nicht dazu.

      Remme mal Zeile 8 und ändere die Zeile 15, so wie es auch Franz schon angemerkt hat.

      Besser wäre SerialIn Buffer zu verwenden. Kannst auch Bytemach verwendet auf "v".
    • @Franz
      @Mitch64

      Der Hinweis, die Zeile 8 mal zu remmen, hat sehr geholfen, im Programm unten ist es Zeile 13. Dadurch konnten die Zeichen des zuvor mit Print "? " in der Sub Version_mode aufgerufenen Help-files in Verbindung mit der Anweisung von Franz bzgl. UDR/B_udr dargestellt werden.

      Dabei viel mir bei den einzelnen Zeichen des Help-files auf, dass diese ja nicht von Anfang an dargestellt wurden. Entsprechend des Github-Examples "GetVersionNumber" hatte ich nach dem Aufruf von Print "? " 100ms wait eingebaut.

      Nachdem ich dieses Wait auf 1ms verkürzt hatte, waren "urplötzlich" a_28_2c02f089 die Zeichen des Help-Files von Anfang an zu lesen, (Bild) und siehe da a_14_3ef964b0 , es fand sich auch das "v" darunter mit der Nummer 4.0.

      Habe einige Variablen zur besseren Übersicht angepasst.

      Also nochmal ganz herzlichen Dank für eure Hilfe. Frage am Rande: bedeutet Delay(100) im Arduino Code 100ms?

      BASCOM Source Code: V2 Ausschnitt

      1. Open_log_uart:
      2. Uart_byte = Udr
      3. Zeichen_ist_da = 1
      4. Return
      5. Version_mode: '200 Zeichen einlesen, nach Github-Arduino- Beispiel
      6. Print #1,
      7. Print #1 , "-----Versionsabfrage ---"
      8. Print "? " 'Help Aufruf laut Github Arduino Programm
      9. Waitms 1 'von 100ms auf 1ms reduziert
      10. Do
      11. 'Print "read " 'Daten von SD-Card einlesen
      12. Do
      13. nop
      14. Loop Until Zeichen_ist_da = 1 'Merker: Uart hat Zeichen empfangen
      15. Zeichen_ist_da = 0 ' 'Merker zurücksetzen
      16. Incr Uart_cnt 'zählen der Zeichen
      17. Buf(uart_cnt) = Uart_byte 'speichern in Buffer, Auslesen im Hauptprogramm
      18. Loop Until Uart_cnt > 330
      19. Uart_byte = 0
      20. Return
      Display All
    • Hallo OpenLog User,

      nach den hilfreichen Hinweisen von Franz und Mitch64 hier das aktuelle Test-Programm um Daten auf SD-Card zu loggen. Die Abfrage der OpenLog-Modul Firmware-Version kann bei Bedarf in Zeile 42 ein- oder ausgeschaltet werden. Als Testdaten für die SD-Card werden Zeit und Datum verwendet.

      BASCOM Source Code: OpenLog Testprogramm

      1. 'Datum: 27.11.2024 /17:10
      2. 'Test fürs Daten-Logging auf SD-Card mit Open-Log Modul
      3. 'Verwendung von Gosubs für die einzelnen Vorbereitungs-Schritte
      4. 'Hardware-Basis: Arduino UNO
      5. $regfile = "m328pdef.dat"
      6. $crystal = 16000000
      7. $hwstack = 64
      8. $swstack = 54
      9. $framesize = 64
      10. $baud = 9600
      11. Dim Time_over As Byte
      12. Dim Naked_date As String * 6
      13. Dim Weekday As Byte
      14. Dim Got_time As String * 8
      15. Dim Got_date As String * 8
      16. Dim Newfilename As String * 12
      17. Dim Filenumber As Byte
      18. Dim A As Byte
      19. Dim F_name As String * 50
      20. Dim F_date As String * 25
      21. Dim F_datum As String * 10
      22. Dim F_time As String * 8
      23. Dim S As String * 1
      24. Dim Sekunde As Byte
      25. Dim I As Word
      26. Dim B_udr As String * 1
      27. Dim Uart_cnt As Byte
      28. Dim Zeichen_ist_da As Byte
      29. Dim Buf(100) As Byte
      30. Dim Uart_byte As Byte 'von UDR an Uart_byte übergeben
      31. Dim Uart_zeichen As String * 3 'Uart Zeichen als string
      32. Dim Log_ver As String * 3 'Versionsdaten
      33. Dim Dist As Byte 'Beginn der Versionszeichen im Helpfile
      34. Dim Zeichen_cnt As Byte 'Anzahl Zeichen aus Helpfile
      35. '******************************************************************
      36. 'Open a Soft-Uart channel for output to Hterm
      37. Open "comd.6:9600,8,n,1" For Output As #1 'zusätzlicher UART-Ausgang
      38. Const Openlog_version = 1 'wenn Versionsüberprüfung dann: 1
      39. Config Portc.0 = Output 'an GRN=kapazitver Input von OpenLog => Reset,
      40. Extra_reset Alias Portc.0
      41. Set Extra_reset
      42. Config Timer1 = Timer , Prescale = 1024
      43. On Timer1 Tim1_isr
      44. Enable Timer1
      45. Stop Timer1
      46. On Urxc Open_log_uart ' UART Interrupt
      47. Enable Urxc ' Enable UART-Interrupt
      48. Enable Interrupts
      49. $lib "i2c_twi.lbx"
      50. '-------------I2C Parameter /Uhrbaustein = DS3231---------------------------
      51. Config Scl = Portd.0 '
      52. Config Sda = Portd.1 '
      53. Config Twi = 100000 ' Taktrate 100KHz
      54. Const Ds3231w = &HD0 ' RTCadresse fuers schreiben
      55. Const Ds3231r = &HD1 ' RTCadresse fuers lesen
      56. Config Clock = User
      57. ''setze 32,768kHz (1Hz) Takt-Ausgang
      58. I2cstart
      59. I2cwbyte Ds3231w
      60. I2cwbyte 7
      61. ''I2cwbyte &B10010000 ' Control-Byte für 1Hz Testausgang/32kHz
      62. I2cwbyte &B00010011 ' Control-Byte für 32,768kHz
      63. I2cstop
      64. Config Date = Dmy , Separator = Minus 'Datumsformat TT-MM-JJ
      65. '----------------------------------------------------------------------
      66. ''Zum Stellen der Uhr / Date und Time einmal aktualisieren und aktivieren
      67. 'Date$ = "23-11-24" '
      68. 'Time$ = "11:56:00" '
      69. '-----------------------------------------------------------------------
      70. F_name = Version(3)
      71. F_date = Version(1)
      72. F_datum = Left(f_date , 10)
      73. F_time = Right(f_date , 8)
      74. Print #1 , F_name
      75. Print #1 , F_datum
      76. Print #1 , F_time
      77. Time_over = 0 '
      78. 'Power-Up Delay für OpenLog Modul
      79. Wait 3
      80. Uart_cnt = 0 'Uart Empfangs-Zeichen-Zähler, bei Versionscheck
      81. Zeichen_cnt = 100 'Anzahl zu lesender Zeichen, bei Versionscheck
      82. Gosub Openlog_reset 'Reset OpenLog Modul an GRN
      83. Wait 1
      84. Gosub Check_if_ready 'Ist Modul Alive?; ==> "<"
      85. Print #1,
      86. Print #1 , "OpenLog is alive "
      87. Print #1,
      88. Wait 1
      89. Gosub Command_mode 'Prepare for Receiving Commands; ==> ">"
      90. Print #1 , "OpenLog in Command-Mode"
      91. '***************************************************************
      92. #if Openlog_version = 1
      93. 'Versonsdaten lesen, hier max. zeichen_cnt aus Buf für Help-file-zeichen
      94. 'Kann übersprungen werden
      95. Gosub Version_mode 'hole OpenLog Version
      96. For Uart_cnt = 1 To Zeichen_cnt
      97. Uart_zeichen = Chr(buf(uart_cnt))
      98. If Buf(uart_cnt) = 118 Then ' ==> "v"
      99. Dist = Uart_cnt + 4 'ab hier (Dist) 4 Zeichen holen
      100. Print #1 , "OpenLog-Modul Version = ";
      101. Do
      102. Log_ver = Chr(buf(uart_cnt))
      103. Print #1 , Log_ver;
      104. Incr Uart_cnt
      105. Loop Until Uart_cnt > Dist
      106. Print #1 ,
      107. Print #1 ,
      108. Exit For
      109. End If
      110. Next
      111. #endif
      112. Print #1,
      113. '*****************************************************************
      114. 'Leerzeile
      115. Filenumber = 1 'Vorgabe einer Nummer, (0 - 9 max.?
      116. Gosub Make_filename 'Bilde Filename
      117. Print #1 , "Neuer Dateiname: " ; Newfilename
      118. Print #1,
      119. Gosub Prep_for_writing 'from Command-Mode to Record-Mode; ==> "<"
      120. Print #1 , "OpenLog is ready for writing"
      121. Print #1,
      122. Print #1 , "Sende nun einige Testdaten"
      123. Gosub Write_data 'Daten auf SD-Card
      124. Print #1 , "Fertig!"
      125. End
      126. ''****************************************************************************
      127. Open_log_uart:
      128. Uart_byte = Udr
      129. Zeichen_ist_da = 1
      130. Return
      131. Version_mode: '200 Zeichen einlesen, nach Github-Arduino- Beispiel
      132. Print #1,
      133. Print "? " 'Help-file Aufruf, laut Github Arduino Programm
      134. Waitms 1 'von 100ms auf 1ms?? reduziert (9600Bd)
      135. 'wait kann eventuell entfallen
      136. Do
      137. Do
      138. nop
      139. Loop Until Zeichen_ist_da = 1 'Merker: Uart hat Zeichen empfangen
      140. Zeichen_ist_da = 0 ' 'Merker zurücksetzen
      141. Incr Uart_cnt 'zählen der Zeichen
      142. Buf(uart_cnt) = Uart_byte 'store in Buffer, lesen im Hauptprogramm
      143. Loop Until Uart_cnt > Zeichen_cnt
      144. Uart_byte = 0
      145. Return
      146. Openlog_reset:
      147. Reset Extra_reset
      148. Waitms 10
      149. Set Extra_reset
      150. Return
      151. Check_if_ready:
      152. Time_over = 0
      153. Timer1 = 30000
      154. Start Timer1
      155. Do
      156. If Time_over = 0 Then
      157. If Uart_byte = "<" Then 'wenn der eingelesene Befehl
      158. Exit Do 'dann verlasse die DO-LOOP Schleife
      159. End If
      160. Else
      161. Print #1 , "--SD-CARD vorhanden ???--"
      162. Print #1 , " Program gestoppt"
      163. Print #1 ,
      164. Stop
      165. End If
      166. Loop
      167. Stop Timer1
      168. Uart_byte = 0 ' Empfangszeichen löschen
      169. Return
      170. Command_mode:
      171. Print "{026}{026}{026}"; ' in Command-Modus wechseln
      172. Do ' warte auf Zeichen von OpenLog
      173. If Uart_byte = ">" Then '
      174. Exit Do '
      175. End If
      176. Loop
      177. Uart_byte = 0 '
      178. Return
      179. Make_filename:
      180. Got_date = Date$
      181. Naked_date = Got_date
      182. Delchars Naked_date , "-" 'nur 6 Stellen erlaubt
      183. S = Str(filenumber)
      184. Newfilename = Naked_date + "-" + S + ".csv" ' Erweiterung wichtig 8.3
      185. ' ich will eigene Dateinamen und keine *.LOG Dateien auf der Karte, deshalb
      186. Return
      187. Prep_for_writing:
      188. Print #1 , "Lösche alle LOG Dateien"
      189. Print #1,
      190. Print "rm LOG*.TXT"
      191. Wait 2
      192. Print "append " ; Newfilename '...und erstelle neues File
      193. Do ' warten auf Zeichen von OpenLog
      194. If Uart_byte = "<" Then '
      195. Exit Do '
      196. End If
      197. Loop
      198. Return
      199. Tim1_isr:
      200. Time_over = 1
      201. Timer1 = 0 '
      202. Return
      203. Write_data: 'Beispiel: Schreiben auf SD-Card in OpenLog Modul
      204. Print #1 , "Prepare ready/OK" 'Vorbereitung war ok
      205. Got_time = Time$ 'Beispiel Time$ als Daten
      206. Got_date = Date$ 'Beispiel Date$ als Daten
      207. For A = 1 To 10 'beliebige Anzahl Daten, hier Beispiel:10 Satz
      208. Print A ; " Zeit: " ; Got_date ; " " ; Got_time '
      209. Waitms 50
      210. Next
      211. Return
      212. '------------------------------------------------------
      213. Getdatetime:
      214. I2cstart
      215. I2cwbyte Ds3231w
      216. I2cwbyte 0
      217. I2cstart
      218. I2cwbyte Ds3231r
      219. I2crbyte _sec , Ack
      220. I2crbyte _min , Ack
      221. I2crbyte _hour , Ack
      222. I2crbyte Weekday , Ack
      223. I2crbyte _day , Ack
      224. I2crbyte _month , Ack
      225. I2crbyte _year , Nack
      226. I2cstop
      227. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      228. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
      229. Return
      230. '*******************************************************************************
      231. Setdate:
      232. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      233. I2cstart
      234. I2cwbyte Ds3231w
      235. I2cwbyte 4
      236. I2cwbyte _day
      237. I2cwbyte _month
      238. I2cwbyte _year
      239. I2cstop
      240. Return
      241. '*******************************************************************************
      242. Settime:
      243. _sec = Sekunde 'Hier wird die Sekundenvariable mit dem gestellten Wert ersetzt.
      244. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      245. I2cstart
      246. I2cwbyte Ds3231w
      247. I2cwbyte 0
      248. I2cwbyte _sec
      249. I2cwbyte _min
      250. I2cwbyte _hour
      251. I2cstop
      252. Return
      253. '**************************
      Display All