Ausgabefehler über UART bei Echtzeituhr

    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!

    • Ausgabefehler über UART bei Echtzeituhr

      Hallo,
      ich habe ein Ausgabeproblem über die serielle Schnittstelle. Ich verwende einen Arduino-Mega-Clone und eine DS1307W Echtzeituhr. Das auslesen über I2C funktioniert ohne Probleme, alle Werte in Ordnung. Nur beim Print-Befehl "Print Time$" wird die Zeit nicht korrekt ausgegeben. Der Code selber könnte ursprünglich von Michael sein. Die Sekunden werden vollständig ignoriert. Kennt jemand das Problem? Für meine Uhr wird diese Ausgabe zwar nicht benutzt, macht mich aber trotzdem fuchsig wenn es nicht gehen will. :(

      Ausgabebeispiel Monitor:
      Datum Uhrzeit: 09.04.18 00:21:55
      21 : 55 : 58
      Datum Uhrzeit: 09.04.18 00:21:55
      21 : 55 : 59

      Gruß Udo

      BASCOM-Quellcode: Echtzeituhr

      1. '$sim
      2. $regfile = "m2560def.dat"
      3. $crystal = 16000000
      4. $hwstack = 80
      5. $swstack = 80
      6. $framesize = 100
      7. $baud = 38400
      8. $lib "mcsbyte.lbx" ' for smaller code
      9. $lib "ds1307clock_ger.lib"
      10. $lib "i2c_twi.lbx" ' Für Hardware TWI
      11. Config Twi = 100000 'I2C clock
      12. Twcr = &B00000100 'I2C einschalten
      13. Config Twi = 100000 ' Init TWBR und TWSR
      14. 'address of ds1307
      15. Const Ds1307w = &HD0 ' Addressen Ds1307
      16. Const Ds1307r = &HD1
      17. Config Clock = User
      18. Dim Weekday As Byte
      19. Print "DS1307"
      20. Waitms 100
      21. ' Zeit stellen
      22. 'Time$ = "22:10:00" ' Uhrzeit
      23. 'Date$ = "08-04-18" ' 08 Aprill 2018
      24. Do
      25. Print "Datum Uhrzeit: " ; Date$ ; " " ; Time$
      26. Print _hour ; " : " ; _min ; " : " ; _sec
      27. Waitms 500
      28. Loop
      29. End
      30. 'called from ds1307clock.lib
      31. Getdatetime:
      32. I2cstart ' Generate start code
      33. I2cwbyte Ds1307w ' send address
      34. I2cwbyte 0 ' start address in 1307
      35. I2cstart ' Generate start code
      36. I2cwbyte Ds1307r ' send address
      37. I2crbyte _sec , Ack
      38. I2crbyte _min , Ack ' MINUTES
      39. I2crbyte _hour , Ack ' Hours
      40. I2crbyte Weekday , Ack ' Day of Week
      41. I2crbyte _day , Ack ' Day of Month
      42. I2crbyte _month , Ack ' Month of Year
      43. I2crbyte _year , Nack ' Year
      44. I2cstop
      45. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      46. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
      47. Return
      48. Setdate:
      49. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      50. I2cstart ' Generate start code
      51. I2cwbyte Ds1307w ' send address
      52. I2cwbyte 4 ' starting address in 1307
      53. I2cwbyte _day ' Send Data to SECONDS
      54. I2cwbyte _month ' MINUTES
      55. I2cwbyte _year ' Hours
      56. I2cstop
      57. Return
      58. Settime:
      59. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      60. I2cstart ' Generate start code
      61. I2cwbyte Ds1307w ' send address
      62. I2cwbyte 0 ' starting address in 1307
      63. I2cwbyte _sec ' Send Data to SECONDS
      64. I2cwbyte _min ' MINUTES
      65. I2cwbyte _hour ' Hours
      66. I2cstop
      67. Return
      Alles anzeigen
    • Deine Ausgabe des Datums, Punkte als Trenner, passt nicht mit deinem date$ zusammen. Schau dir mal config date an und bau mal die Zeile in deinen code ein.
      Was ich auch immer komisch finde, es werden aus den Systemvariablen beim Beschreiben der Rtc dieselbigen mit makebcd konvertiert. Dann haben sie andere Werte und dann wird mit diesen in der softclock weiter gearbeitet. Ich vermeide das in verwende extra Variablen und lass die Systemvariablen, wie sie sind.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ich bin jetzt auf die Sekundenbirnenausführung gespannt. Ich hatte das ja mal mit Auf- und Abdimmen einer Birne gebaut (Zeitzeige).
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Udo01 schrieb:

      die Änderungen haben ebenfalls keinerlei Auswirkung auf die Ausgabe mit Time$. Ich schiebs einfach einmal auf den Mega2560 und werde das noch einmal mit einem m328 testen.
      Ich hab' mit dem arduino mega den gleichen Effekt und bekomm's auch nicht hin. Auf einem arduino uno hatte ich mit hw I2C die gleiche komische Ausgabe mit sw I2C hat's geklappt. Dieses Programm wieder auf den mega übertragen hat dann aber auch die Ausgabe von time$ nicht geschafft.
      Raum für Notizen

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

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

      Ich hatte das ja mal mit Auf- und Abdimmen einer Birne gebaut (Zeitzeige).
      Vielleicht hilf mein code als Anregung. Der ist aber ohne RTC dafür mit DCF77

      BASCOM-Quellcode

      1. 'atomgesteuerte Uhr mit Drehspulanzeigen
      2. 'Platine Tschoeatch_Zeitzeiger0.11_1
      3. $regfile = "attiny2313.dat"
      4. $crystal = 20000000
      5. $hwstack = 32
      6. $swstack = 8
      7. $framesize = 24
      8. 'Ports konfigurieren
      9. Pin_stunde Alias Portd.0
      10. Config Pin_stunde = Output 'Stundenanzeige
      11. Pin_zminute Alias Portd.1
      12. Config Pin_zminute = Output 'Zehnerminuten
      13. Pin_eminute Alias Portd.2
      14. Config Pin_eminute = Output 'Einerminuten
      15. Sec_led Alias Portd.3
      16. Config Sec_led = Output 'Sekunden-Licht
      17. Test Alias Pinb.3
      18. Config Test = Input 'Testeingang, 0= "voller Ausschlag" aller Instrumente für Abgleich
      19. Set Portb.3
      20. Config Portb.4 = Input 'Daten von DCF-Empfänger
      21. Set Portb.4
      22. 'Variablen dimensionieren
      23. Dim Stunde As Byte 'Vergleichswert bei der PWM
      24. Dim Zminute As Byte
      25. Dim Eminute As Byte
      26. Dim S As Byte 'Zähler bei der PWM
      27. Dim Z As Byte
      28. Dim E As Byte
      29. Dim N As Word
      30. Dim L As Word
      31. Dim Delta_l As Integer 'wechselt zwischen 1 und -1 zum Dimmen der Sek-Led
      32. Dim Sync_ok As Word 'Zähler seit Atomzeit empfangen
      33. Dim Sync As Byte 'Zwischenwert
      34. Dim Temp_sec As Byte
      35. Const An = 0
      36. Const Aus = 1
      37. 'DCF77 einrichten
      38. Config Dcf77 = Pinb.4 , Timer = 1 , Update = 0 , Inverted = 1 , Check = 1 , Timer1sec = 0 , Gosub = Sectic
      39. 'Interrupt configurieren
      40. Const Timer0reload = 15
      41. Config Timer0 = Timer , Prescale = 64
      42. Load Timer0 , Timer0reload
      43. On Ovf0 Timer0_isr
      44. Enable Ovf0
      45. Start Timer0
      46. Enable Interrupts
      47. 'Initialisieren
      48. Reset Dcf_status.7
      49. Sync = 0
      50. _hour = 0
      51. _min = 0
      52. _sec = 0
      53. Delta_l = 1
      54. Sec_led = An 'Led-Test
      55. Wait 1
      56. 'hauptschleife
      57. Do
      58. If Sync = 1 Then Sync_ok = 900 'für 15min
      59. If _sec < 30 Then Sync = Dcf_status.7
      60. If _sec > 40 Then Reset Dcf_status.7
      61. If Test = Aus Then 'Testtaste nicht gedrückt
      62. If _hour < 12 Then Stunde = _hour Else Stunde = _hour -12 'Stunden auf 0 bis 11 reduzieren
      63. Zminute = _min / 10 'Wert zwischen 0 und 5 erzeugen
      64. Eminute = _min Mod 10 'Wert zwischen 0 und 9 erzeugen
      65. Else 'Testtaste gedrückt
      66. Stunde = 11 'Instrumente mit Trimmer auf Vollausschag einstellen
      67. Zminute = 5
      68. Eminute = 9
      69. End If
      70. Temp_sec = _sec Mod 2
      71. If Temp_sec = 0 Then Delta_l = 1 Else Delta_l = -1
      72. If L < 1 Then L = 1
      73. L = L + Delta_l
      74. If L > 40 Then L = 40 'es gibt 40 Dimm-Stufen
      75. Waitms 15 'do..loop muß innerhalb 1 sec L bis 40 hochzählen können
      76. Loop
      77. End
      78. Sectic:
      79. If Sync_ok > 0 Then Sync_ok = Sync_ok - 1
      80. Return
      81. Timer0_isr:
      82. Load Timer0 , Timer0reload
      83. If S > 10 Then S = 0
      84. If Stunde > S Then Pin_stunde = An Else Pin_stunde = Aus 'PWM für die Instrumente
      85. If Z > 4 Then Z = 0
      86. If Zminute > Z Then Pin_zminute = An Else Pin_zminute = Aus
      87. If E > 8 Then E = 0
      88. If Eminute > E Then Pin_eminute = An Else Pin_eminute = Aus
      89. Incr S
      90. Incr Z
      91. Incr E
      92. If N > 40 Then N = 0
      93. ' If L > N Then Sec_led = An Else Sec_led = Aus 'Sekunden-Led dimmt im Sek-Takt auf und ab
      94. If L > N And Sync_ok > 0 Then Sec_led = An Else Sec_led = Aus 'Sekunden-Led dimmt im Sek-Takt auf und ab
      95. Incr N 'nur wenn vor weniger als 15 min synchronisiert wurde
      96. Return
      Alles anzeigen
      Raum für Notizen

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

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

      Vielleicht hilf mein code als Anregung. Der ist aber ohne RTC dafür mit DCF77
      Genau, als Auf- und Abdimmen im Sekundentakt hab ich mir das gedacht. Dein Code brint mich da schon einmal ein Stück weiter. Ein DCF77 ist auch vorgesehen, Synchronisierung einmal am Tag. Das muß ich allerding erst einmal testen, hab bei mir leider sehr schlechten Empfang. Evtl. Ausweichen auf UKW RDS vom Ortssender. Dann kommt noch Datums- + Temperaturanzeige dazu und ein mech. Gong. Sind also noch paar Baustellen. Danke!Gruß Udo
    • Mein Testcode noch ohne Funktionen in der Haupschleife.

      BASCOM-Quellcode: Testcode

      1. '(
      2. *******************
      3. * Udo Lorenz *
      4. * 10.04.2018 *
      5. * *
      6. *******************
      7. ')
      8. '$sim
      9. $regfile = "m2560def.dat"
      10. $crystal = 16000000
      11. $hwstack = 80
      12. $swstack = 80
      13. $framesize = 100
      14. $baud = 38400
      15. '$lib "mcsbyte.lbx" ' for smaller code
      16. $lib "ds1307clock_ger.lib"
      17. $lib "i2c_twi.lbx" ' Für Hardware TWI
      18. Config Twi = 100000 ' I2C clock
      19. Twcr = &B00000100 ' I2C einschalten
      20. 'configure the scl and sda pins ' bei Software I2C
      21. 'Config Sda = Portd.1
      22. 'Config Scl = Portd.0
      23. 'Subrutinen
      24. Declare Sub Ausgabe ' Anzeige Uhrzeit
      25. Declare Sub Testlauf ' Testlauf
      26. Declare Sub Datum ' Anzeige Temperatur
      27. Declare Sub Temperatur ' Temperatur DS18S20
      28. Declare Sub Gong ' Gong mech. über Servo
      29. Declare Sub Licht ' Dimmer über Außenbeleuchtung,"Aus" per Zeit und Wochentag
      30. Declare Sub Zeitholen ' DCF777 Synchronisierung 03:00
      31. Declare Sub Sqw_ein ' einmalig, Einschalten Sekundentakt
      32. '(PWM PINs Timer 3 + 4
      33. Ocr3al = Pe3
      34. Ocr3bl = Pe4
      35. Ocr3cl = Pe5
      36. OCR4AL = PH3
      37. OCR4BL = PH4
      38. OCR4CL = PH5
      39. ')
      40. Config Timer3 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up '10h, 1h, 10m
      41. Config Timer4 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up '1m, Helligkeit Messwerke, Helligkeit Lampen ' ') ')
      42. Const Ds1307w = &HD0 ' Addressen Ds1307k
      43. Const Ds1307r = &HD1
      44. Config Date = Dmy , Separator = / ' ANSI-Format
      45. Config Clock = User ' this will dim the bytes automatic
      46. Dim Stunden10 As Byte , Stunden1 As Byte , Minuten10 As Byte , Minuten1 As Byte
      47. Dim Monat As Byte , Tag As Byte , Tag1 As Byte , Tag10 As Byte , Monat1 As Byte , Monat10 As Byte
      48. Dim Weekday As Byte , Minuten As Byte , Stunden As Byte
      49. Dim Z1 As Byte
      50. Dim H10 As Byte , H1 As Byte , M10 As Byte , M1 As Byte
      51. Restore Stunden10_pwm : Restore Stunden1_pwm
      52. Restore Minuten10_pwm : Restore Minuten1_pwm
      53. Restore Testdaten_h : Restore Testdaten_m
      54. Waitms 3000
      55. 'Uhr stellen
      56. 'Date$ = "09/04/18" ' 05.04.2018
      57. 'Time$ = "20:55:00" ' Zeit
      58. Waitms 200
      59. Call Testlauf
      60. 'Call Sqw_ein 'Sekundentackt ein
      61. Do
      62. Call Ausgabe
      63. 'Call Testlauf
      64. Call Temperatur
      65. Call Datum
      66. Call Licht
      67. Call Gong
      68. Call Zeitholen
      69. Waitms 500
      70. Loop
      71. End
      72. 'Subroutinen
      73. Sub Ausgabe
      74. 'Gosub Getdatetime
      75. Print "Date Time : " ; Date$ ; " " ; Time$
      76. Print _hour ; ":" ; _min ; ":" ; _sec
      77. Print Stunden10 ; Stunden1 ; ":" ; Minuten10 ; Minuten1
      78. Minuten = _min
      79. Stunden = _hour
      80. Tag = _day
      81. Monat = _month
      82. Minuten1 = Minuten Mod 10
      83. Minuten10 = Minuten / 10
      84. M10 = Lookup(minuten10 , Minuten10_pwm)
      85. Pwm3c = M10
      86. M1 = Lookup(minuten1 , Minuten1_pwm)
      87. Pwm4a = M1
      88. Stunden1 = Stunden Mod 10
      89. Stunden10 = Stunden / 10
      90. H10 = Lookup(stunden10 , Stunden10_pwm)
      91. Pwm3a = H10
      92. H1 = Lookup(stunden1 , Stunden1_pwm)
      93. Pwm3b = H1
      94. End Sub
      95. Sub Testlauf
      96. For Z1 = 0 To 9
      97. Minuten = Lookup(z1 , Testdaten_m)
      98. Stunden = Lookup(z1 , Testdaten_h)
      99. Minuten1 = Minuten Mod 10
      100. Minuten10 = Minuten / 10
      101. M10 = Lookup(minuten10 , Minuten10_pwm)
      102. Pwm3c = M10
      103. M1 = Lookup(minuten1 , Minuten1_pwm)
      104. Pwm4a = M1
      105. Stunden1 = Stunden Mod 10
      106. Stunden10 = Stunden / 10
      107. H10 = Lookup(stunden10 , Stunden10_pwm)
      108. Pwm3a = H10
      109. H1 = Lookup(stunden1 , Stunden1_pwm)
      110. Pwm3b = H1
      111. Wait 2
      112. Next
      113. End Sub
      114. Sub Datum
      115. !nop
      116. End Sub
      117. Sub Temperatur
      118. !nop
      119. End Sub
      120. Sub Licht
      121. !nop
      122. End Sub
      123. Sub Gong
      124. !nop
      125. End Sub
      126. Sub Zeitholen
      127. !nop
      128. End Sub
      129. Sub Sqw_ein
      130. I2cstart
      131. I2cwbyte &HD0
      132. I2cwbyte 7
      133. I2cwbyte &B00010000
      134. I2cstop
      135. End Sub
      136. 'called from ds1307clock.lib
      137. Getdatetime:
      138. I2cstart ' Generate start code
      139. I2cwbyte Ds1307w ' send address
      140. I2cwbyte 0 ' start address in 1307
      141. I2cstart ' Generate start code
      142. I2cwbyte Ds1307r ' send address
      143. I2crbyte _sec , Ack ' Sekunden
      144. I2crbyte _min , Ack ' MINUTES
      145. I2crbyte _hour , Ack ' Hours
      146. I2crbyte Weekday , Ack ' Day of Week
      147. I2crbyte _day , Ack ' Day of Month
      148. I2crbyte _month , Ack ' Month of Year
      149. I2crbyte _year , Nack ' Year
      150. I2cstop
      151. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      152. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
      153. Return
      154. Setdate:
      155. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      156. I2cstart ' Generate start code
      157. I2cwbyte Ds1307w ' send address
      158. I2cwbyte 4 ' starting address in 1307
      159. I2cwbyte _day ' Send Data to SECONDS
      160. I2cwbyte _month ' MINUTES
      161. I2cwbyte _year ' Hours
      162. I2cstop
      163. Return
      164. Settime:
      165. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      166. I2cstart ' Generate start code
      167. I2cwbyte Ds1307w ' send address
      168. I2cwbyte 0 ' starting address in 1307
      169. I2cwbyte _sec ' Send Data to SECONDS
      170. I2cwbyte _min ' MINUTES
      171. I2cwbyte _hour ' Hours
      172. I2cstop
      173. Return
      174. End
      175. 'Data Zeilen
      176. Stunden10_pwm:
      177. '0 , 1 , 2
      178. Data 0 , 114 , 235
      179. Stunden1_pwm:
      180. '0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
      181. Data 0 , 22 , 44 , 65 , 86 , 107 , 129 , 151 , 173 , 198
      182. Minuten10_pwm:
      183. '0 , 1 , 2 , 3 , 4 , 5
      184. Data 0 , 40 , 80 , 119 , 159 , 204
      185. Minuten1_pwm:
      186. '0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
      187. Data 0 , 22 , 45 , 66 , 89 , 110 , 132 , 155 , 177 , 203
      188. ' Testdaten
      189. Testdaten_h:
      190. Data 00 , 11 , 22 , 23 , 14 , 15 , 16 , 17 , 18 , 19
      191. Testdaten_m:
      192. Data 00 , 11 , 22 , 33 , 44 , 55 , 56 , 57 , 58 , 59
      Alles anzeigen
    • Wenn du Dcf verwenden willst, dann bau gleich das config dcf ein. Die hiermit installierte clock läuft ja auch ohne den Empfänger, braucht aber timer1. Den fetten Kontroller verwendest du nur wegen den vielen hw-Pwms? Für die nötige eher grobe Auflösung geht es gut mit soft-pwm, wo du nur einen timer brauchst und auch gleich das Dimmen machen kannst. Allerdings hab' ich dann noch einen Trimmer an den Instrumenten gebraucht, um den Vollausschlag bei 100%Pwm zu justieren. Du machst das ja mit Tabellen.
      Hast du deine Instrumente nachträglich beleuchtet? Wie signalisiertst du die Temperaturanzeige (noch ein Instrument)?
      Raum für Notizen

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

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

      Den fetten Kontroller verwendest du nur wegen den vielen hw-Pwms?
      Ja, wollte erst ein Bord mit m328 nehmen, aber dann würden mir langsam und Sicher die Pins und die Timer ausgehen. Ich wollte erst ein paar Sachen auf einen 2. Bord auslagen, mit dem Mega sollte ich hinkommen. Ich brauch jetzt noch ein PWM extra, da nehm ich Timer2. So hab ich die anderen Standardtimer erst mal noch unbelegt.
      Temperatur will ich mit den zwei rechten Instrumenten und der oberen Lampe als ° anzeigen. Die Beleuchtung der linken wird dabei abgeblendet.
      Die Instrumente haben 3 V, Anschluß über 1k und parallel 1µF als Filter. Reicht also eine Ansteuerung nur über Ausgabepinn. Eingebaut hab ich je zwei gelbe LED mit 20 mA.
    • Noch was zu dem mechanischen Gong. Versuche auf jeden fall einen 'federnden' Klöppel zum Anschlagen zu verwenden. Bei meiner NullA3KlaSch (null Anzeige, 3-Klang Schlagwerk) hab' ich meine Klangstäbe direkt mit dem Anker eines E-Magneten angeschlagen. Der lässt nicht schnell genug los, sodass der Klöppel zu lange auf dem Klangstab auf liegt und somit dämpft. Schau dir mal die Schlagwerke aus Kaminuhren an. Der Klöppel erreicht den Klangstab nur durch 'hinfedern'.
      Raum für Notizen

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

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