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!

    • DCF-Empfang und softclock mit einem beliebigen timer realisieren

      Bascom stellt für den DCF77-Empfang eine Dcf77.lib zur Verfügung, die aber den 16bit-Timer timer1 verwendet. Wenn aber kein 16bit timer auf dem vorgesehenen AVR enthalten ist, braucht man eine alternative. Diese wird hier genau beschrieben.
      Um die Anwendung möglichst einfach zu gestalten, habe ich die lib und die zugehörige bas-Datei abgeändert. Jetzt kann im Hauptprogramm der port und pin, an dem das DCF-Signal eingespeist, wird über Konstanten angegeben werden. An der lib ist nichts mehr zu verändern. In der Datei dcf77_soft.bas sind die notwendigen Maßnahmen beschrieben.
      Es ist darauf zu achten, dass der notwendige Aufruf 'call dcf77_soft' möglichst genau alle 25 msec erfolgt.
      Es muss ein DCF-Empfänger mit invertiertem Ausgang angeschlossen werden. Die günstigen Pollinmodule sind dazu umzuschalten.
      Pollin-DCF-Modul.jpg
      Hier die Datei DCF77_soft.bas und die DCF77-rn-const.lib. Die lib muss in den lib_ordner von bacom kopiert werden (bitte umbenennen zu dcf77-rn-const.lib).
      Dateien
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hier mal ein Testprogramm für einen Arduino uno. Es wird timer2 verwendet, die Uhrzeit wird auf der seriellen ausgegeben

      BASCOM-Quellcode

      1. 'DCF77-rn-const.lib Test Programm
      2. 'mit Arduino uno
      3. $regfile = "m328pdef.dat"
      4. $crystal = 16000000
      5. $hwstack = 64
      6. $swstack = 32
      7. $framesize = 30
      8. $baud = 9600 'serielle Schnittstelle aktivieren
      9. Led Alias Portb.5
      10. Config Led = Output 'Led des Arduino uno aktivieren
      11. $include Dcf77_soft.bas
      12. 'aus Dcf77-soft.bas kopiert und angepasst
      13. '---------------------- Pin für DCF Eingang definieren ---------------------
      14. 'Eingangspin für das invertierte DCF-Signal
      15. 'mit const dcf_pin_nummer=1 wird die Pinnummer festgelegt
      16. Const Dcf_pin_nummer = 7
      17. 'mit const dcf_port_hex=&H03 Wird der Port festgelegt
      18. '&H00=PortA, &H03=PortB, &H06=PortC, &H09=PortD
      19. Const Dcf_port_hex = &H09
      20. 'Anzahl der gültigen Zeittelegramme infolge, damit die softclock gestellt wird
      21. Const Gueltiger_empfang_infolge = 1
      22. Dcfstatus.7 = 1 'DCF-Decoder ein
      23. Dcfstatus.6 = 0 'Softclock inaktuell
      24. 'timer für 25msec erstellen
      25. 'hier wird ein interrupt alle 1 msec ausgelöst, nach 25 interrupts wird das 'call dcf77-soft' ausgeführt
      26. const Timer2Reload = 250
      27. config timer2=timer,prescale = 64
      28. load timer2 , Timer2Reload
      29. on ovf2 Timer2_isr
      30. enable ovf2
      31. start timer2
      32. enable interrupts
      33. 'Timer value explination
      34. ' The timer is a 8Bit timer, it overflows when the timer reaches 256
      35. ' The AVR is running at 16000000Hz, the prescaler is 64
      36. ' Each tick is 0,004 ms - (1 / CPUSpeed in KHz ) * Prescaler
      37. ' The timer needs 250 ticks to reach the required time ( 250 * 0,004 = 1ms)
      38. ' The start value for the timer must be set to 6 so that it will overflow at 256 after 250 ticks
      39. ' NOTE: The load command does the inversion for you (256-value or 65536-value)
      40. Dim Isr_counter As Byte 'Zähler in der isr
      41. Dim Sekunde As Byte 'Vergleichssekunde, um ein Wechsel der Sekunde zu erkennen
      42. Wait 1
      43. Do
      44. Sekunde = _sec
      45. Print Time$ 'die aktuelle Zeit seriell ausgeben
      46. While Sekunde = _sec 'auf Sekundenwechsel warten
      47. Led = Pind.7 'Signel vom Dcf-Empfänger zeigen
      48. Wend
      49. Loop
      50. End
      51. 'wenn die Systemvariablen 'time$' verwendet werden sollen, dann diese subs einfügen
      52. Getdatetime:
      53. 'called when date or time is read
      54. Return
      55. Setdate:
      56. 'called when date$ is set
      57. Return
      58. Settime:
      59. 'scanned when time$ is set
      60. Return
      61. 'timer2 interrupt, des alle 1 msec ausgeführt wird
      62. Timer2_ISR:
      63. load timer2, Timer2Reload
      64. Incr Isr_counter
      65. If Isr_counter = 25 Then
      66. Call Dcf77_soft 'alle 25msec ausführen
      67. isr_counter=0
      68. end if
      69. Return
      Alles anzeigen
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • hero schrieb:

      Hallo tschoeatsch,
      Ich meine es würde auch gehen, dass du es so schreibst:
      Const Dcf_port_hex = PortD
      Eher Pind, ich brauche ja das Eingangsregister.
      Ich hab' damit auch rum probiert, bin aber irgendwie nicht weiter gekommen, drum diese hex-Angabe. Die Assemblerbefehle in der lib erwarten scheints eine Zahl.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ja, hatte ich aus deinem Programm übernommen.
      Wahrscheinlich hattest du bei deinen Tests eine Variable genommen. Die wird ja erst zur Laufzeit ausgewertet und bekommt dann den Inhalt des Registers, also die Eingangswerte. Const wird vom Compiler ausgewertet und dann steht dort die Nummer des Registers, sozusagen die Adresse des Registers.
    • hero schrieb:

      Wahrscheinlich hattest du bei deinen Tests eine Variable genommen.
      da hast du vermutlich Recht. Ich hab's grad mal mit 'Const Dcf_port_hex = pind' probiert, es geht.
      Danke für den Tipp.
      Raum für Notizen

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

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

      Wenn aber kein 16bit timer auf dem vorgesehenen AVR enthalten ist, braucht man eine alternative.
      Für die „lahme “Decodierung?

      tschoeatsch schrieb:

      Um die Anwendung möglichst einfach zu gestalten, habe ich die lib und die zugehörige bas-Datei abgeändert.
      Wie immer, hast du dich sehr viel Mühe gegeben, um eine eigenwillige und Objekt bezogene Lösung zu finden.
      Einfach Klasse finde ich es, wie du es schaffst, ein Oh, Oh „Leute denkt mal mit“ zu aktivieren.
      Möchte nicht wieder von(M-a) als Irre bezeichnet werden.
      Somit drehe ich mal den „Spieß“ um. Und stelle was zum diskusstieren ein.
      Bas- File und Print Aufzeichnung(nur mal auf der Schnelle erstellt. Rem wie gewohnt „lusie“)
      dcf77_00.bas
      DCF-Verlauf.txt
      Meine Frage, wenn der Softwarevorteil deiner und der MCS Variante (zum Teil meine) auf Praxistauglichkeit getestet werden sollte, berichte es.
      MfG
    • Und, was sagt mir das? Ist dein Dcf-Verlauf das Ergebnis von deinem Programm? Wenn ja, wo ist dein print 'Hallo Uhr' aus deiner timer1 isr? Das sollte doch schon mal auftauchen, wenn die isr gehen würde.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • BASCOM-Quellcode

      1. Config Timer1 = Timer , Prescale = 256
      2. Const Timer1_preload = 34286
      3. Enable Timer1
      4. Timer1 = Timer1_preload
      5. On Timer1 Isr_timer1
      6. Isr_timer1:
      7. Print "Hallo Uhr"
      8. Wait 4
      9. Return
      @fredred
      Was soll aber das Wait 4 in der Timer ISR? Und den Timer1 kannst du eigentlich nicht mehr mit Config Timer benutzen, da der ja schon durch Config Dcf benutzt wird.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo Detlef,
      die letzte Config überschreibt die früheren, weil du Config Timer ja mehrfach im Programm benutzen kannst.
      Da die Bascom Routine den CTC Modus verwendet, kommt sich der Compare Interrupt COMPARE1A nicht mit dem Overflow Interrupt TIMER1 von Fredred in die Quere. Allerdings wird der Overflow Interrupt auch nie ausgeführt, weil der Timer beim Compare Match schon wieder auf 0 geht.
    • Sonst müsste ja ständig 'Hallo Uhr' ausgegeben werden, weil durch das wait 4 der interrupt länger dauert, als die Zeit zwischen den Aufrufen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @fredred jetzt erklär mir bitte noch mal, was das soll. Wenn ich hier eine Alternative vorstelle (die nicht von mir ist und auch schon länger existiert), die keinen 16bit timer verwendet, dann kommst du mit einem Programm das einen verwendet. Ich kapier das jetzt nicht a_28_2c02f089
      Raum für Notizen

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

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

      @fredred jetzt erklär mir bitte noch mal, was das soll. Wenn ich hier eine Alternative vorstelle (die nicht von mir ist und auch schon länger existiert), die keinen 16bit timer verwendet, dann kommst du mit einem Programm das einen verwendet. Ich kapier das jetzt nicht
      Hallo tschoeatsch,
      damit wollte ich nicht deine Alternative anzweifeln, im Gegenteil.
      Sollte nur ein Gedankenspiel sein, in Anlehnung Time$ , Date$ und Timerbenutzung
      Speziell Thema Interrupts.
      Nun meine Antwort.
      Ich dachte in meinem „Programmschei..“ einige Bedingungen sehr abwegig platziert zu haben, dass mit „Platzverschiebungen“, zu erkennen ist, wo die Prioritäten liegen.
      Solltest die abwegigen Zeilen einfach mal selber testen. FALSCH verschieben usw.
      @ hero hat den ersten Unsinn erkannt und fast richtig erklärt. Mein Dank.
      Aber hätte Bascom nicht meckern müssen wenn Timer1 angeblich schon in Config Dcf77 genutzt wird? Egal. ConfigTimer1 nach Config Dcf77 verschoben. Nun wird Isr angesprungen und „Hallo Uhr“ erscheint aber Decoder bekommt einen „Streifschuss“.
      Das saublöde Wait 4 gelöscht. Nun bekommt der Decoder einen Volltreffer. Sieht man ja alles schön in Print.
      Nun Config Timer1 auf Timer2 umgestellt. Ah Decoder etwas lahm, weil ja „Hallo Uhr“ angezeigt werden soll. Noch die Pause in der While gelöscht(sollte ja das nächste Ei zum grübeln sein)
      Aber „Test DCF77_00.bas“ für eigene Test- Erkenntnisse zu nutzen, war wohl ein Schuss in Ofen.
      So! Bevor die nächste Antwort kommt wie
      “was soll schon wieder dein dummes Geschwätz du machst uns irre“.
      Gleich eine Frage: Ist es nicht interessant mal selber zu testen. Was ist wann und warum.
      Zum Beispiel:
      Bascom Alias „Timer1“, kann doch nicht das 1s Zeitfenster für Decodierung des DCF- Signal sein. (Mit Test-Code selber ermittelt, war wohl für Dritte zu aufwendig) Aber wo holt sich Config Dcf77 den Sekundentakt her.
      Ich vermute(Haha) vom Taktgeber des Rom. Bei allen AVR die ich kenne, sind es 65536 Impulse pro Sekunde.
      Macht doch Sinn dessen Überlauf – Flag zu nutzen und schon hat man ein Sekundenfenster, wo nach und nach mit ein Impulslängenzähler die Informationen in ein BCD- Speicherbereich geschoben werden können.

      Mit meiner Antwort auf Thema wollte ich, wie fast immer, eine Diskussion mit erfahrene User auslösen. Die auch Einsteiger anregen sollen mitzudiskutieren(auch oder gerade wenn Sie keine Expertensprache verstehen.)
      Wollte doch im Grunde nur wissen ist es verhältnismäßig ein 16 Bit Decoder, selber so aufwendig zu basteln um ans Ziel zu kommen.

      Vorab erwähnt, wenn Hardware es nicht hergibt ist diese Lösung eine gute Alternative.
      Man kann ein Controller schon vergewaltigen, aber ob er Spaß dabei hat bezweifele ich.
      Man kann ein Controller (dessen Insel mit Brücken sorgfältig verbinden) er wird sich dann freuen.
      Insel(fachmännisch) = Block (Port A bis vielleicht Port G)
      Brücken(fachmännisch) = Gate.
      Schaut mal in die unterschiedlichen Blocks. Da haben sich die Entwickler schon was dabei gedacht. Warum in einem der Hauptschalter Int von außen schaltbar ist oder bei einem andern Block nur ein Bit setzen um zwei Register zu verbinden usw.

      Nee nun verrenne ich mich ins IC- Innenleben.

      Bitte alle User um Verständnis für meine Kommentare, die hauptsächlich auf autotitaktischen Erfahrungen aufgebaut sind und im Wort, beim besten willen nicht, akademisch sind.
      Wollte nur an Leser vermitteln, eine eigene Kreativität fürs Programmieren, zu gestalten.
      Wer ein schnellen Erfolg möchte, sollte lieber Holz hacken, aber niemals, programmieren und wer nur abschreibt, wird nie ein guter Programmierer.
      Und wer nur solch ein Schmarren schreibt wie ich, sollte wie schon mal angekündigt, aus dem Forum ausgesperrt werden.
      Habe mich auch vor Jahren das Rauchen abgewöhnt, da Pfleger auf meinem Wunsch, keine Zigaretten mehr mitbrachte.
      Also Pfleger (Admins) erlöst mich vom Wahn hier im Forum ein Kommentar dahin zu schmieren. Habe bestimmt nicht mehr die Kraft und Wille für Neuanmeldung.
      Mit freundlichen Grüßen
    • fredred schrieb:

      Ich vermute(Haha) vom Taktgeber des Rom. Bei allen AVR die ich kenne, sind es 65536 Impulse pro Sekunde.
      so ein Schmarrn, du weißt doch, ich kann einen AVR mit verschiedenen Taktfrequenzen betreiben.

      fredred schrieb:

      Man kann ein Controller schon vergewaltigen, aber ob er Spaß dabei hat bezweifele ich.
      so ein Schmarrn

      fredred schrieb:

      Bitte alle User um Verständnis für meine Kommentare
      kriegst du von mir dafür nicht

      fredred schrieb:

      Und wer nur solch ein Schmarren schreibt wie ich, sollte wie schon mal angekündigt, aus dem Forum ausgesperrt werden.
      des ist mal kein Schmarrn!

      fredred schrieb:

      Also Pfleger (Admins) erlöst mich vom Wahn hier im Forum ein Kommentar dahin zu schmieren. Habe bestimmt nicht mehr die Kraft und Wille für Neuanmeldung.
      ohne Worte
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Na das hätte ich zum Abschluss nicht von dir erwartet.
      Taktfrequenzen kann doch niemals die Arbeitsfrequenz für alle Blocks sein.

      Hast völlig recht und meine Entscheitung war richtig.

      Als Forumgast werde ich wohl lesen, wie du die Struktur der AVR neu und vor allen als Weltneuheit umstellst. Man oh Man, das Taktprofil fast aller Controller sollte doch auch dich bekannt sein.
    • fredred schrieb:

      Bei allen AVR die ich kenne, sind es 65536 Impulse pro Sekunde
      the internal RC oscillator provides an approximate 8.0MHz clock.

      Wie kommst du da auf 1 Sekunde?

      fredred schrieb:

      Na das hätte ich zum Abschluss nicht von dir erwartet.
      Nö, ich auch nicht, aber wenn du es übertreibst

      fredred schrieb:

      Als Forumgast werde ich wohl lesen, wie du die Struktur der AVR neu und vor allen als Weltneuheit umstellst.
      kannst lange warten, das hab' ich nicht vor
      Raum für Notizen

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

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