Wieder einmal DCF77 und Timer1

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

    • Wieder einmal DCF77 und Timer1

      Hallo zusammen
      Die Tage werden kürzer, die Nächte länger und die Gartenarbeiten sind erledigt. Also die Zeit sich den Basteleien wieder zuzuwenden.
      Ich arbeite nun wieder an meiner zentralen Steuerung. Diese soll die Zeit mithilfe eines DCF77-Empfängers erhalten. Die zugehörige Lib verwendet ausschliesslich den Timer 1.
      Nun möchte ich den Timer 1 jedoch für andere Aufgaben einsetzen da er seinen Eingang herausgeführt hat. Da ich den Mega1284 verwende kann ich über 2 8-Bit-Timer (0 und 2) und 2 16-Bit-Timer (1 und 3) verfügen. Also hatte ich die Idee anstelle des Timers 1 den Timer 3 zu verwenden. Nur. wie könnte ich das anstellen? Kann man irgendwo in einer Lib etwas ändern? Irgendwo muss doch der Timer 1 initialisiert werden.
      Hat sich schon mal jemand mit dieser Möglichkeit befasst? Ich weiss es gibt einige andere Lösungswege für das DCF77-Problem aber die Verwendung des Timer 3 wäre um einiges eleganter.

      Vielen Dank für eure Ideen.
      jepe
    • jepe wrote:

      ... die Verwendung des Timer 3 wäre um einiges eleganter.
      Du meinst eleganter, nur weil du nicht einen anderen Pin nehmen musst?

      Die Lib zu ändern würde ich mir sehr genau überlegen. Schon mit der nächsten Version von Bascom könnte das nicht mehr funktionieren. Außerdem müsstest du jedesmal die Lib speziell für dieses Programm ändern. Für ein anderes Programm mit DCF willst du vielleicht wieder den normalen Timer1 nehmen.

      Den Umweg von Pluto kann ich verstehen, wenn man dadurch weg vom mächtigen Timer1 hin zu einem der einfachen 8-bit Timer kommt. Abe nur um nicht einen anderen Pin zu verwenden würde ich im Programm nicht solche Klimmzüge machen.
    • @Pluto
      vielen Dank für den Tip. Der Compiler hat nicht reklamiert und ich kann den Timer 1 separat verwenden. Ob die Decodierung des DCF-Signals richtig stattfindet kann ich momentan nicht feststellen. Der Empfang hier ist miserabel, der Empfänger liefert leider nur erratisch Impulse. Auch andere Geräte mit DCF-Empfang gehen nicht richtig. Sie zeigen immer noch Sommerzeit :(

      @Franz
      Leider ist nur der Timer 1 auf einen Pin herausgeführt; der Timer 3 nicht. Ich brauche jedoch den Timer 1 als Zähler für externe Impulse. Ausserdem ist es meiner Meinung nach eigentlich logisch dass man den Timer 3 ebenfalls verwenden könnte. Schlussendlich ist in der Config DCF77 der Timer explizit aufgeführt (obwohl dann steht nur Timer 1 ist unterstützt). In dem Falle müsste der Timer ja gar nicht erwähnt werden (na ja man weiss dann wenigstens das der Timer verbraten ist). Darum fand ich es eleganter wenn man in der Config DCF77 den Timer wählen könnte.
    • Was ist denn das für ein Modul, wo nur der Timer1 herausgeführt ist? Wie programmierst du den denn? Beim 1284 sind die Timerausgänge doch auf MISO und SCK.

      Natürlich wäre es eleganter, wenn die Lib auch die anderen 16-bit Timer verwenden könnte. Da solltest du vielleicht mal MCS ansprechen, ob die das nicht so erweitern könnten. Sollte doch eigentlich nicht so aufwendig sein.
      Bist du eigentlich sicher, dass es nicht funktioniert mit dem Timer3? Kompilieren tut er es nämlich, wenn man einen Controller auswählt, der den hat, ansonsten nicht.

      Edit: Zumindest kann man nicht einfach nur Timer=3 schreiben, dann werden die Register vom Timer3 nicht gesetzt. Die ISR hat er allerdings definiert, aber ich habe noch nicht geschaut, was dort drin steht. Vielleicht musst du nur die Register vom Timer3 genau so setzen, wie sie für den Timer1 vom Compiler gesetzt würden.

      The post was edited 5 times, last by Franz ().

    • Tatsächlich gibt es noch den Eingang T3 :) ; habe ich bisher noch gar nicht bemerkt :( weil ich bei meinen Projekten immer die seriellen Schnittstellen brauche und die Pins damit belegt sind. Mir stehen als externe Eingänge T0 (8Bit-Counter) und T1 (16Bit-Counter) zur Verfügung.

      @tschoeatsch: Ja, danke, dies ist auch eine Möglichkeit.

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

    • jepe wrote:

      Der Empfang hier ist miserabel,
      Ich schaue mir die Pulse mit nem Scope an da sieht man gut ob die Antenne falsch liegt oder ein Netzteil Ärger macht.Selbst die Wechselrichter in 10m Endfernung machen es schwerer. Nachts 2-10 min, tagsüber bis 4Stunden ;(
      So weit ich das verstehe ist der Auswertung egal wer den Int auslöst, Die Timerauswahl wird vermutlich in den nächsten Versionen implementiert. Mit einem 8 bit Timer wird es recht ungenau falls er schlecht empfängt (oder es hängt ein passender Quarz dran 10.485.760Hz) :D
    • Wegen DCF Test, vielleicht hilft das weiter

      Source Code

      1. 'Testprogramm für DCF77 Programme
      2. 'stellt ein DCF77-Signal an PortD.1 zur Verfügung
      3. 'Dieser Quelltext steht unter der CC-Lizenz
      4. 'Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter gleichen Bedingungen
      5. 'http://creativecommons.org/licenses/by-nc-sa/3.0/de/
      6. 'Michael Kinz
      7. $regfile = "M8def.dat"
      8. $crystal = 16000000
      9. $hwstack = 64
      10. $swstack = 32
      11. $framesize = 40
      12. Enable Interrupts
      13. Config Timer1 = Timer , Prescale = 256
      14. On Timer1 T1_isr
      15. Enable Timer1
      16. Start Timer1
      17. Timer1 = 3036
      18. Ddrd = 2 'an PortD.1 liegt das DCF77 Signal
      19. Dim Temp As Byte
      20. Dim Temp_s As Byte
      21. Dim Parity As Bit
      22. Dim L2 As Long
      23. Dim Sec_alt As Byte
      24. Dim _sec As Byte
      25. Dim _min As Byte
      26. Dim _hour As Byte
      27. Dim _day As Byte
      28. Dim _month As Byte
      29. Dim _year As Byte
      30. _sec = 57
      31. _min = 5
      32. _hour = 15
      33. _day = 31
      34. _month = 8
      35. _year = 9
      36. Do
      37. If _sec <> Sec_alt Then
      38. If _min > 59 Then
      39. Incr _hour
      40. _min = 0
      41. End If
      42. Gosub Sectic
      43. Sec_alt = _sec
      44. End If
      45. Loop
      46. End
      47. '---------------------------
      48. Sectic:
      49. If _sec < 18 Then 'bis zur 17.Sekunde "unwichtige" Daten
      50. Gosub Null
      51. End If
      52. If _sec = 18 Then 'Sekunde 18 = MEZ
      53. Gosub Eins
      54. End If
      55. If _sec = 19 Then 'Schaltsekunde ankündigen
      56. Gosub Null
      57. End If
      58. If _sec = 20 Then 'Beginn der Zeitinfo, immer 1
      59. Gosub Eins
      60. Parity = 0
      61. End If
      62. Temp = Makebcd(_min)
      63. If _sec < 28 Then 'Minutenausgabe
      64. If _sec > 20 Then
      65. Temp_s = _sec - 21
      66. If Temp.temp_s = 0 Then
      67. Gosub Null
      68. Else
      69. Gosub Eins
      70. Toggle Parity
      71. End If
      72. End If
      73. End If
      74. If _sec = 28 Then 'Parität Minuten
      75. If Parity = 0 Then
      76. Gosub Null
      77. Else
      78. Gosub Eins
      79. End If
      80. Parity = 0
      81. End If
      82. Temp = Makebcd(_hour)
      83. If _sec < 35 Then 'Stundenausgabe
      84. If _sec > 28 Then
      85. Temp_s = _sec - 29
      86. If Temp.temp_s = 0 Then
      87. Gosub Null
      88. Else
      89. Gosub Eins
      90. Toggle Parity
      91. End If
      92. End If
      93. End If
      94. If _sec = 35 Then 'Parität Stunden
      95. If Parity = 0 Then
      96. Gosub Null
      97. Else
      98. Gosub Eins
      99. End If
      100. Parity = 0
      101. End If
      102. Temp = Makebcd(_day)
      103. If _sec > 35 Then 'Ausgabe Tag
      104. If _sec < 42 Then
      105. Temp_s = _sec - 36
      106. If Temp.temp_s = 0 Then
      107. Gosub Null
      108. Else
      109. Gosub Eins
      110. Toggle Parity
      111. End If
      112. End If
      113. End If
      114. If _sec > 41 Then 'Wochentag
      115. If _sec < 45 Then
      116. Gosub Null
      117. End If
      118. End If
      119. Temp = Makebcd(_month)
      120. If _sec > 44 Then 'Ausgabe Monat
      121. If _sec < 50 Then
      122. Temp_s = _sec - 45
      123. If Temp.temp_s = 0 Then
      124. Gosub Null
      125. Else
      126. Gosub Eins
      127. Toggle Parity
      128. End If
      129. End If
      130. End If
      131. Temp = Makebcd(_year)
      132. If _sec > 49 Then 'Ausgabe Jahr
      133. If _sec < 58 Then
      134. Temp_s = _sec - 50
      135. If Temp.temp_s = 0 Then
      136. Gosub Null
      137. Else
      138. Gosub Eins
      139. Toggle Parity
      140. End If
      141. End If
      142. End If
      143. If _sec = 58 Then 'Parität Datum
      144. If Parity = 0 Then
      145. Gosub Null
      146. Else
      147. Gosub Eins
      148. End If
      149. Parity = 0
      150. End If
      151. 'Print "sectic"
      152. Return
      153. Null:
      154. Portd.1 = 1
      155. Waitms 100
      156. Portd.1 = 0
      157. Return
      158. Eins:
      159. Portd.1 = 1
      160. Waitms 200
      161. Portd.1 = 0
      162. Return
      163. T1_isr:
      164. Timer1 = 3036
      165. Incr _sec
      166. If _sec > 59 Then
      167. _sec = 0
      168. Incr _min
      169. End If
      170. Return
      Display All
    • @daja: Danke, werde ich morgen ausprobieren.

      Noch eine weitere Frage: Kann man den Timer3 ebenfalls mit Config Timer3 konfigurieren?

      BASCOM Source Code

      1. Config Timer3 = Timer , Prescale = 256 'bei 20MHz
      2. Const Timer3_preload_30 = 63192 'ergibt 30 ms
      3. Const Timer3_preload_300 = 42098 'ergibt 300 ms
      4. On Timer3 Zeitinterrupt 'Interruptroutine
      5. Enable Timer3
      6. Stop Timer3
      Resultat: der Timer3 macht nichts.
      Interessant ist dass bei Config Timer3 = Timer das Wort Timer ebenfalls fett blau dargestellt ist; bei den Timer0,1 und 2 ist das nicht der Fall.
      Sehe gerade dass der Quellcode nicht wie bei mir dargestellt wird.
    • weil ich ihn nur für Zeitmessungen brauche; er wird dort gestartet. Allerdings habe ich gerade ein Programmproblem gefunden, der Timer3 führt einen Interrupt aus aber es kann auch an einem anderen Ort klemmen; ich war wohl zu lange dran || .
      Ich glaube ich lege jetzt besser eine Pause ein.
    • Hallo zusammen, ich brauche nochmals euer Wissen.
      Ich bin immer noch mit dem DCF77 beschäftigt und habe mittlerweile festgestellt dass mein Prozessor oder das Netzteil der Verursacher der Störungen ist. Der Empfänger muss mehr als 2 m von den Teilen entfernt sein um ein vernünftiges Signal zu erhalten. ich habe es mir dem Pollin-Modul und mit dem ELV-Modul versucht.
      Meine Frage nun ist: Ich habe das Beispielprogramm das in der Config DCF77-Erklärung unten aufgeführt ist verwendet. Das Beispiel druckt 2 Variable aus; dcf_status und dcf_bits. Leider ist nirgends erwähnt was die dcf_bits bedeuten. Lediglich dcf_status ist beschrieben.
      Die dcf_Minute wechselt immer bei 28 zu 29 Sekunden (= Ende der Minutenanzeige). Diese Zeit sollte dann doch beim nächsten Sekundenwechsel (59 -> 0 ) nach Time$ übernommen werden. Allerdings wird Bit 7 von dcf_status nicht gesetzt (auch nicht nach einer Stunde) obwohl die Zeit in Time(dcf_sec) und Datum in Date(dcf_day) korrekt ist. Darum wird wohl auch das Empfangsresultat nicht nach Time$ übernommen.
      Kann man eventuell etwas aus den Bits von dcf_bits herauslesen?
    • jepe wrote:

      Die dcf_Minute wechselt immer bei 28 zu 29 Sekunden
      Ohne das die Sekunde auch 0 wird? Da stimmt irgend was nicht - eigene SetTime Routine? Oder Direktbearbeitung von _sec ?

      jepe wrote:

      Kann man eventuell etwas aus den Bits von dcf_bits herauslesen?

      In der Bascom Hilfe: Bit 7 wird gesetzt wenn die Zeit übernommen wurde. Bit 2 zeigt ob der Empfang ok war. (Nur während der 59.Sekunde)