DCF-Empfang und softclock mit einem beliebigen timer realisieren

    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!

    • Um einige Sachen besser und sparsamer zu schreiben hatte ich vor Kurzem mir die Bascom - DCF77-Lib

      Comment = Dcf77 Library
      Libversion = 1.04
      Date = 27 April 2007

      mal auf den Tisch gezogen.

      Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 128
      4. $swstack = 128
      5. $framesize = 128
      6. $baud = 19200
      7. '########################
      8. Config Dcf77 = Pind.2 , Timer = 1 , Inverted = 1, Timer1sec = 1 , Check = 2 , update = 0 'spaeter update = 2
      9. Enable Interrupts
      10. Config Date = Dmy , Separator = .
      11. Dim I As Integer
      12. Dim Sec_old As Byte , Dcfsec_old As Byte
      13. Sec_old = 99
      14. Dcfsec_old = 99
      15. '########################
      16. Config Portd.2 = Input 'dcf77 Empfaenger
      17. Config Portd.1 = Output 'Display 20 x 1, UART Hardware
      18. Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 2 , Databits = 8
      19. Waitms 50
      20. Config PORTC.3 = Output ' LED
      21. Dim status_byte_old As Byte
      22. Dim status_byte_new As Byte
      23. '########################
      24. Dim Position As Byte
      25. Dim Zeichen As Byte
      26. Dim Text As String * 20
      27. Dim Text_20 As String * 20
      28. Dim Textarray(20) As Byte At Text_20 Overlay
      29. Dim Leertext As String * 20
      30. Leertext = " "
      31. Dim A As Byte
      32. Declare Sub Text_drucken(byval Text As String , Position As Byte )
      33. Declare Sub _cleardisplay()
      34. Declare Sub _startdisplay()
      35. _startdisplay
      36. _cleardisplay
      37. Open "com1:" For Binary As #1 'zum Display
      38. Waitms 20
      39. ' #######################
      40. Do
      41. For I = 1 To 78
      42. Waitms 10
      43. If Sec_old <> _sec Then
      44. Exit For
      45. End If
      46. If Dcfsec_old <> Dcf_sec Then
      47. Exit For
      48. End If
      49. Next
      50. Waitms 100
      51. Sec_old = _sec
      52. Dcfsec_old = Dcf_sec
      53. '-------------------------
      54. Text = Time$
      55. Position = 00
      56. Text_drucken Text , Position
      57. Text = Date$
      58. Position = 9
      59. Text_drucken Text , Position
      60. Text = " "
      61. Position = 18
      62. Text_drucken Text , Position
      63. '--------------------------
      64. if dcf_status.7 = 1 then
      65. else
      66. end if
      67. '----------------------------
      68. status_byte_new = dcf_status.2
      69. if dcf_status.2 = 0 then
      70. if status_byte_old <> status_byte_new then
      71. set PORTC.3 ' kurz blinken
      72. waitms 50 ' wenn das Telegramm fehlerfrei und plausibel war
      73. reset PORTC.3 ' und zum Stellen der Uhr genutzt wurde
      74. end if
      75. end if
      76. status_byte_old = status_byte_new
      77. '-----------------------------
      78. Loop
      79. Close #1 'zum Display
      80. ' #########################################################
      81. Sub Text_drucken(byval Text As String , Position As Byte )
      82. Text_20 = Text
      83. Printbin #1 , &H1B;
      84. Printbin #1 , &H48;
      85. Printbin #1 , Position;
      86. For A = 1 To Len(text_20)
      87. Zeichen = Textarray(a)
      88. Printbin #1 , Zeichen;
      89. Next A
      90. End Sub
      91. Sub _startdisplay()
      92. Printbin #1 , &H1B;
      93. Printbin #1 , &H4C;
      94. Printbin #1 , &H19;
      95. End Sub
      96. Sub _cleardisplay()
      97. Printbin #1 , &H00;
      98. Printbin #1 , &H0E;
      99. Printbin #1 , &H0C;
      100. End Sub
      101. ' #########################################################
      Alles anzeigen


      Überrascht wie schön und sauber das ging, wollte ich mich schon zurücklehnen.
      ... aber mit fehlt ja noch etwas.

      Wo finde ich den "Wochentag"?
      Noch etwas Platz auf dem Display wollte ich noch (Mo, Di, Mi, Do, Fr, Sa oder So) ans Ende hängen.
      Ich löse mir die Infos dazu gerne aus irgendeinem Byte.

      Dass es funktioniert, hatte ich schon zu Fuß erkundet vor Jahren.
      In den Ticks 42-44 werden sie ja mitgesendet.

      Danke für sachdienliche Hinweise :)

      gruß
      port
    • @Mitch64

      Danke Mitch64,
      das werde ich versuchen.

      Die "close-Zeile" schleppe ich schon ewig mit rum an der gleichen Stelle.
      Das gehört zu dem "UART" ( Display) und ich habe das auch des Öfteren zwischen "Loop" und "end" gesehen.
      ... hat immer so funktioniert - ich habe es schon aufgegeben, dabei eine Logik zu suchen/finden.

      Danke!

      MfG
      port
    • IMG_20230504_155636.jpg


      @Mitch64

      Dein Hinweis hat mich in die Hilfe von MCS geführt.
      (AN #181 - demonstrating the DCF77 and I2C)

      Dort konnte ich passende Teile dafür finden.

      Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 128
      4. $swstack = 128
      5. $framesize = 128
      6. $baud = 19200
      7. '########################
      8. Config Dcf77 = Pind.2 , Timer = 1 , Inverted = 1, Timer1sec = 1 , Check = 2 , update = 0 'spaeter update = 2
      9. Enable Interrupts
      10. Config Date = Dmy , Separator = .
      11. Dim I As Integer
      12. Dim Sec_old As Byte , Dcfsec_old As Byte
      13. Sec_old = 99
      14. Dcfsec_old = 99
      15. '########################
      16. Config Portd.2 = Input 'dcf77 Empfaenger
      17. Config Portd.1 = Output 'Display 20 x 1, UART Hardware
      18. Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 2 , Databits = 8
      19. Waitms 50
      20. Config PORTC.3 = Output ' LED
      21. Dim status_byte_old As Byte
      22. Dim status_byte_new As Byte
      23. Dim Strweekday As String * 2
      24. Dim Bweekday As Byte
      25. '########################
      26. Dim Position As Byte
      27. Dim Zeichen As Byte
      28. Dim Text As String * 20
      29. Dim Text_20 As String * 20
      30. Dim Textarray(20) As Byte At Text_20 Overlay
      31. Dim Leertext As String * 20
      32. Leertext = " "
      33. Dim A As Byte
      34. Declare Sub Text_drucken(byval Text As String , Position As Byte )
      35. Declare Sub _cleardisplay()
      36. Declare Sub _startdisplay()
      37. _startdisplay
      38. _cleardisplay
      39. Open "com1:" For Binary As #1 'zum Display
      40. Waitms 20
      41. ' #######################
      42. Do
      43. For I = 1 To 78
      44. Waitms 10
      45. If Sec_old <> _sec Then
      46. Exit For
      47. End If
      48. If Dcfsec_old <> Dcf_sec Then
      49. Exit For
      50. End If
      51. Next
      52. Waitms 100
      53. Sec_old = _sec
      54. Dcfsec_old = Dcf_sec
      55. '-------------------------
      56. Text = Time$
      57. Position = 00
      58. Text_drucken Text , Position
      59. Text = Date$
      60. Position = 9
      61. Text_drucken Text , Position
      62. Bweekday = Dayofweek()
      63. Strweekday = Lookupstr(bweekday , Weekdays)
      64. Text = Strweekday
      65. Position = 18
      66. Text_drucken Text , Position
      67. '----------------------------
      68. status_byte_new = dcf_status.2
      69. if dcf_status.2 = 0 then
      70. if status_byte_old <> status_byte_new then
      71. set PORTC.3 ' kurz blinken
      72. waitms 50 ' wenn das Telegramm fehlerfrei und plausibel war
      73. reset PORTC.3 ' und zum Stellen der Uhr genutzt wurde
      74. end if
      75. end if
      76. status_byte_old = status_byte_new
      77. '-----------------------------
      78. Loop
      79. Close #1 'gehoert zu "Open "com1:" For Binary As #1" / mein Display
      80. End
      81. ' #########################################################
      82. Sub Text_drucken(byval Text As String , Position As Byte )
      83. Text_20 = Text
      84. Printbin #1 , &H1B;
      85. Printbin #1 , &H48;
      86. Printbin #1 , Position;
      87. For A = 1 To Len(text_20)
      88. Zeichen = Textarray(a)
      89. Printbin #1 , Zeichen;
      90. Next A
      91. End Sub
      92. Sub _startdisplay()
      93. Printbin #1 , &H1B;
      94. Printbin #1 , &H4C;
      95. Printbin #1 , &H19;
      96. End Sub
      97. Sub _cleardisplay()
      98. Printbin #1 , &H00;
      99. Printbin #1 , &H0E;
      100. Printbin #1 , &H0C;
      101. End Sub
      102. ' #########################################################
      103. Weekdays:
      104. Data "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"
      105. '---
      Alles anzeigen


      Danke nochmal!

      MfG
      port
    • @Pluto25

      Danke Pluto25,

      ich habe mal die Zeilen testweise ausgetauscht - es scheint auch zu funktionieren.
      Dass diese Variante (nach der Synchronisation) so ohne Änderung jetzt "Fr" anzeigt, ist bestimmt ein kleines Ding.
      Wahrscheinlich fängt die eine Variante bei "0" und die andere Variante bei "1" an zu zählen oder so.

      Quellcode

      1. '--------------------------------
      2. Dim Strweekday As String * 2
      3. Dim Bweekday As Byte
      4. Bweekday = _weekday 'Variante 1
      5. 'Bweekday = Dayofweek() 'Variante 2
      6. Strweekday = Lookupstr(bweekday , Weekdays)
      7. Text = Strweekday
      8. Position = 18
      9. Text_drucken Text , Position
      10. Weekdays:
      11. Data "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"
      12. '--------------------------------
      Alles anzeigen

      Aber es würde wohl auch funktionieren!

      Danke!

      MfG
      port