DCF77 + Timer2 Asynchron

    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!

    • DCF77 + Timer2 Asynchron

      Hallo!

      Vor einigen Jahren wunderte ich mich schon, kann mich aber gerade nicht erinnern ob ich damals eine Lösung fand:

      Ich brauche auf einem ATmega1284 eine möglichst exakte Uhrzeit, sollte eine maximale Abweichung von 0,x Sekunden haben, gerne im ein- bis zweistelligen ms-Bereich. Sinn ist es das mehrere Geräte sequentiell in exakten Timeslots über RFM69-Funkmodems kommunizieren soll.

      Aus diesem Grund nutzen die Slaves alle ein 32kHz-Quarz am TOSC und Timer2 wird asynchron als RTC benutzt.
      Funktioniert mit Config Timer2 und Config Clock hinreichend gut - soll heißen: <1 Sekunde Abweichung nach gut 3 Tagen.

      Die Gegenstelle aller Slaves, der Master soll nun als Referenzuhr minütlich einen Referenz-Zeitstempel aussenden, um alle Slaves möglichst exakt synchron zu halten.

      Daher besitzt der Master exakt wie alle Slaves den gleichen 32kHz-Quarz und folgendes Progrämmchen:

      BASCOM-Quellcode

      1. $Regfile="m1284def.dat"
      2. $Crystal=8000000
      3. $hwstack=400
      4. $swstack=160
      5. $framesize=320
      6. $Baud=38400
      7. Config Timer2 = Timer , Async = On , Prescale = 128
      8. Enable Timer2
      9. config DCF77 = PinA.4, timer = 1, Inverted = 1 , Timer1sec = 2 , CHECK = 2 , UPDATE = 0 , GOSUB = Sectic , Debug = 1
      10. config Date = DMY , Separator = DOT
      11. Date$ = "00.00.00"
      12. enable Interrupts
      13. print "Initialisierung Repeater Version 0.0"
      14. do
      15. waitms 200
      16. loop
      17. Sectic:
      18. '_sec = _sec + 1
      19. 'Print Date$ , Time$
      20. print Time$ ; " " ; Date$ ; " " ; Time(dcf_sec) ; " " ; Date(dcf_day) ; " " ; Bin(dcf_status) ; " " ;Bin(dcf_bits) ; " " ; bDCF_Pause ; " " ; bDCF_Impuls
      21. return
      Alles anzeigen

      DCF77-Empfang klappt phasenweise und eher wackelig. Wie das halt so ist in der heutigen schaltnetzteilverseuchten Zeit.
      Egal, denn alle 20-24h mal nachts sauberen Empfang würde mir ja schon reichen, wenn die RTC mit dem 32kHz-Quarz genau so gut laufen würde wie in den Slaves.

      Genau das tut sie aber nicht!
      Vielmehr habe ich den Eindruck als ob die Zeile:
      "Config Timer2 = Timer , Async = On , Prescale = 128"
      von der Config DCF77 überlagert wird, und als RTC-Takt in Timer2 offenbar die MainClock genutzt wird.
      Und da der Haupttakt des ATmega1284 nur der interne RC-Oszillator mit 8MHz ist, eiert die "RTC" extrem umher.

      Bereits 30 Minuten Empfangsausfall DCF77 und die Systemzeit hinkt 29 Sekunden nach.

      Woher kommt dieser dämliche Fehler?
      Ich lese die Bascom-Hilfe bezüglich DCF77 so, das man Timer2 mit der DCF regelmässig (in meinem Fall Permanent wenn DCF-Zeit valide) synchronisieren kann.
      Aber das Timer2 dann das 32kHz RTC-Quarz und den asynchronen Betrieb verweigert, sobald Config DCF77 aufgerufen wird, finde ich nirgendwo im Handbuch.
      Wie bekomme ich das in den Griff das trotz DCF77 der Timer2 asynchrom mit dem Uhrenquarz läuft?

      Und wo ich gerade bei DCF77 bin:
      Ich habe im LIB-Ordner von Bascom folgende Dateien zu DCF77:

      dcf77.lbx Version 1.04 vom 27.04.2007
      dcf77.lib Version 1.04 vom 27.04.2007
      dcf77_2010.lib Version 4.11 vom 15.01.2010

      Welche dieser Dateien/Versionen benutzt Bascom bei Config DCF77?
      Zur neueren dcf77_2010.lib finde ich keine .lbx
      Wie stelle ich sicher das Bascom die neuere nimmt?

      Grüße

      Jürgen
    • DG7GJ schrieb:

      Aber das Timer2 dann das 32kHz RTC-Quarz und den asynchronen Betrieb verweigert, sobald Config DCF77 aufgerufen wird, finde ich nirgendwo im Handbuch.
      Dem ist aber leider so. Wenn du Config Dcf77 verwendest läuft das dann nicht mehr über einen 32768 KHz Quarz.
      Ich hab aber mal irgendwo gelesen, dass man bei $crystal eine krumme Zahl nahe dem eigentlichen Takt angeben sollte, damit die Soft-Clock nicht so schnell aus dem Ruder läuft.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo!


      djmsc schrieb:


      Dem ist aber leider so. Wenn du Config Dcf77 verwendest läuft das dann nicht mehr über einen 32768 KHz Quarz.Ich hab aber mal irgendwo gelesen, dass man bei $crystal eine krumme Zahl nahe dem eigentlichen Takt angeben sollte, damit die Soft-Clock nicht so schnell aus dem Ruder läuft.

      Tja, da könnte ich genauso gut die RC vom ATmega nachkalibrieren, was mir aber nichts nutzt. Denn meine gewünschte Genauigkeit wird mit dem RC niemals was gescheites. Diese ist aber wichtig, da die Slaves aufgrund Stromeinsparung schlafen sollen, bis ihr Timeslot kommt. Also nicht irgendwann zwischen Sekunde 0 und 2, sondern liebend gerne in den ersten 20ms der Sekunde 0 usw.

      djmsc schrieb:

      DG7GJ schrieb:

      Ich habe im LIB-Ordner von Bascom folgende Dateien zu DCF77:
      Welche Version von Bascom hast du denn?Bei mir (2.0.8.1) sind nur die dcf77.lbx und die dcf77.lib vom 07.02.2011 drin.

      Hier auch die Version 2.0.8.1.
      Die ursprünglich 2014 gekaufte Vollversion war glaube ich die 2.0.7.7 und wurde mindestens zwei mal geupdatet.

      Grüße

      Jürgen
    • Um zu sehen, welche lib verwendet wird, bräuchte man diese nur aus dem lib-Ordner raus nehmen. Dann sollte es eine Fehlermeldung generieren.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo!

      djmsc schrieb:

      Was aber bei DCF77 gut geht ist eine externe RTC wie die DS3231.
      Die läuft recht genau und bei DCF-Empfang kannst du sie aktualisieren.

      Ja, da habe ich sogar welche hier.
      Aber in diesem Projekt wollte ich da keine drin verwursten.
      Zumal die Platinen bereits fertig sind und der I²C-Bus nicht wirklich praktikabel anzapfbar ist.
      Ausserdem müsste ich dann ja quasi permanent in schleife die DS3231 auslesen um jederzeit eine Genauigkeit im ms-Bereich zu erhalten.

      tschoeatsch schrieb:

      Um zu sehen, welche lib verwendet wird, bräuchte man diese nur aus dem lib-Ordner raus nehmen. Dann sollte es eine Fehlermeldung generieren.

      Aha. stimmt.
      Also gerade mal geschaut...Bascom meckert wenn ich die alte dcf77.lbx umbenenne.
      Wenn ich die neuere dcf77_2010.lib Version 4.11 umbenenne in dcf77.lib meckert Bascom das er die dcf77.lbx nicht findet.

      Ich weis auch nicht woher ich diese einzelne LIB ohne LBX in der Version 4.11 her habe.

      Gerade eben mit dem Update Wizzard die angeblich aktuellsten LIB's gezogen und rein geschaut:
      Da sind nur die alten (1.04) drin.
      Achja: Mit Version 1.04 und Datum 27.04.2007 meine ich diese Angaben im Header der dcf77 LIB und LBX (geöffnet im Editor), und eben nicht das Filedatum (07.02.2011).


      Grüße

      Jürgen
    • DG7GJ schrieb:

      Mit Version 1.04 und Datum 27.04.2007 meine ich diese Angaben im Header der dcf77 LIB
      Stimmt ist bei mir auch das gleiche Datum.

      DG7GJ schrieb:

      Zumal die Platinen bereits fertig sind
      Das ist eigentlich immer schlecht wenn schon etwas fertig ist bevor man überhaupt mit dem Projekt fertig ist.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Dcf bastelt sich ja eine eigene softclock mit dem timer1 und dem Systemtakt. Da hat @djmsc schon Recht, vielleicht hilft es ja schon, den Minutenumschaltpunkt vom dcf-Signal zu finden und mit dem die Quarzclock zu synchronisieren.

      Vielleicht geht auch ein gps-Empfänger bei dir besser, als dcf. Da bekommst du ja auch eine genaue Zeit. Ich hab' aber keine Ahnung, wie das dann mit dem Synchronisieren geht, ob die Dinger einen Sekundenpin haben, oder alles seriell raus blubbert a_56_df238249
      Raum für Notizen

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

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

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Hallo!

      Pluto25 schrieb:

      Kann der Timer nicht wieder auf den externen Quarz umgeschaltet werden nachdem das Dcf initialisiert hat?

      Hab ich gestern versucht: Die Config DCF zuerst, nachfolgend dann den Config Timer1...:geht nicht.
      Das kuriose ist ja: Offensichtlich wird Timer2 korrekt konfiguriert.
      Zumindest die entsprechenden Register sind korrekt gesetzt:

      ASSR b00100000 also Timer 2 läuft asynchron mit Quarz an TOSC
      TCCR2R b00000101 also vorteier 128, auch korrekt

      Nur die Softclock von der DCF77-Routine nutzt diesen Timer2 nicht, sondern irgendwas anderes - mutmaßlich Timer0?
      So richtig schlau werde ich aus der Funktion der DCF77.lib nicht, die Dokumentation erscheint mir reichlich oberflächlich:
      Die Variable "Timer = Timer1" konfiguriert den 16Bit-Timer zur Impulsmessung (20ms-Interrupt).
      Die Variable "Timer1sec = Timer2" war ein stumpfsinniger Versuch von mir, der aber von Bascom nicht angemeckert wird?!?
      Tatsächlich spricht die Bascom-Hilfe zu Timer1sec nur vom 16Bit-Timer als Sekundentaktgeber - welcher aber als Timer1 doch schon zur Impulslängenmessung herrangezogen wird.

      djmsc schrieb:

      Was übrigens auch geht ist, wenn man die DCF Zeit manuell dekodiert. Somit kann man die normale Soft-Clock weiterhin verwenden.

      Wollte ich eigentlich vermeiden. Aber zumindest ein denkbarer Ansatz welcher mir auch schon gelegentlich kam:
      Schließlich ist genau das Teil welches die Referenzuhr und dafür eben eine durchgängige DCF-Synchronisierung braucht, etwas überdimensioniert mit einem ATmega1284 mit Netzteil und 1200mAh-Notstromakku.
      Die ganzen Slaves haben alle die selbe Platine, jedoch nur einen ATmaga324 ohne Netzeil und nur 600mAh-Akku.

      Theoretisch also sieht die Auslastung des Masters durchaus noch human aus.
      Wäre zwar lästig da ne DCF-Sub zu schreiben, aber wenn es nicht anders geht.
      Solange hoffe ich noch darauf irgendwie die DCF77.lib so hinbiegen zu können das die Softclock irgendwie auf den Timer2 gezwungen wird.


      tschoeatsch schrieb:

      Dcf bastelt sich ja eine eigene softclock mit dem timer1 und dem Systemtakt. Da hat @djmsc schon Recht, vielleicht hilft es ja schon, den Minutenumschaltpunkt vom dcf-Signal zu finden und mit dem die Quarzclock zu synchronisieren.

      Vielleicht geht auch ein gps-Empfänger bei dir besser, als dcf. Da bekommst du ja auch eine genaue Zeit. Ich hab' aber keine Ahnung, wie das dann mit dem Synchronisieren geht, ob die Dinger einen Sekundenpin haben, oder alles seriell raus blubbert

      Tja, der Timer1 wird ja von der DCF77.lib dazu genutzt aus dem Haupttakt (hier interner 8MHz RC-Osc) ein 20ms-Interrupt aus zu lösen. Dieser wird als Pin-Abfrage genutzt um die Impulslängen am DCF-Pin zu vermessen. Soweit verstanden.
      Das Timer 1 parallel genutzt wird für einen Sekundenimpuls kommt mir schon komisch vor.
      Kann eigentlich nur über eine Zählvariable gehen welche eben die 20ms-Impulse zählt und bei jedem 50. den Sekundenimpuls genneriert.

      Was GPS angeht:
      Der Master soll Inhouse betrieben werden, hat also keine freie Himmelssicht.
      Gut, braucht es nicht mehr zwingend, die zwei A2200A SiRF-IV die ich hier habe warten noch auf Ihr stockendes Projekt, aber erste Tests ergaben das die sauempfindlich sind. einen 1PPS-Ausgang haben die, wenn auch verflixt kurz.

      Mir sträubt sich alles GPS als Notlösung an zu sehen, da das so eigentlich nicht gedacht war.
      Andererseits...brauchbare DCF-Module scheint es ja auch nicht mehr zu geben.
      Das Pollin DCF1 ist extrem taub und launisch, das ELV DCF-2 werkelt hier neu seit einigen Stunden und scheint auch keinen Deut besser zu sein.

      Verglichen mit meinen zahlreichen alten DCF-Armbanduhren aus der Zeit 1985-1992 hängen seit Jahren an alternativen Stromquellen als Kleinuhren hier rum. Und sie laufen und laufen...haben alle regelmässig Synchronität (sehe ich 2x jährlich zur Zeitumstellung), obwohl sie alle denkbar ungünstige Vorraussetzungen haben:
      Sind von ihrem winzigen Ferritkern überwiegend in Nord-Süd-Richtung positioniert, also 90° flasch für DCF77, hängen an PC-Monitoren, in der Küche über dem Induktionskochfeld usw.
      Wenn ich die Qualität der DCF-Module in den letzten 10 Jahren betrachte...ohweh. Im Verglich zu den Armbanduhren schon riesige Ferritantennen, wollen alle +-5° exakt ausgerichtet werden, und sind dennoch alle schwerhörig/unempfindlich wie hacke.

      Grüße

      Jürgen
    • Schau mal hier DCF-Empfang und softclock mit einem beliebigen timer realisieren, vielleicht ist diese lib leichter zu durchschauen. Ich denke, der für dcf verwendete timer ist auf ein fixes intervall eingestellt, zumindest bei dieser alternativen lib. Für die kannst du natürlich auch timer1 oder timer0 verwenden und dein Quarz mit timer2.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @DG7GJ schau mal in die dcf77.lib, da wird die eingebaute softclock an dieser Stelle
      '; ===== Soft Clock ============================================================
      ; wird bei jedem Timer-Tick ausser bei Zeiteinstellung beim Minutenpuls aufgerufen '
      aufgerufen. Wenn du die betreffenden Zeilen löscht, bzw auskommentierst, dann sollte doch deine eigene softclock nicht gestört werden.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • In der alternativen dcf-lib von RN gibt es auch so eine Sektion. Da müsste es eigentlich genauso gehen, dass man diesen Bereich, der die softclock bildet, in der lib deaktiviert. Das ist da vielleicht noch besser zu machen, weil man diese geänderte lib unter einem eigenen Namen speichern kann und dann auch gezielt im Programm anwählen kann. Übrigens hat diese lib die Version 4.11, aus dem Jahr 2010.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo!

      tschoeatsch schrieb:

      @DG7GJ schau mal in die dcf77.lib, da wird die eingebaute softclock an dieser Stelle
      '; ===== Soft Clock ============================================================
      ; wird bei jedem Timer-Tick ausser bei Zeiteinstellung beim Minutenpuls aufgerufen '
      aufgerufen. Wenn du die betreffenden Zeilen löscht, bzw auskommentierst, dann sollte doch deine eigene softclock nicht gestört werden.

      Tja...wenn ich wüsste wie: Bascom bindet nicht die dcf77.lib ein, sondern nur die kompilierte dcf77.lbx!
      In der LBX finde ich die Stelle nicht, gescheige denn das ich da durchblicke...Assambler?

      tschoeatsch schrieb:

      In der alternativen dcf-lib von RN gibt es auch so eine Sektion. Da müsste es eigentlich genauso gehen, dass man diesen Bereich, der die softclock bildet, in der lib deaktiviert. Das ist da vielleicht noch besser zu machen, weil man diese geänderte lib unter einem eigenen Namen speichern kann und dann auch gezielt im Programm anwählen kann. Übrigens hat diese lib die Version 4.11, aus dem Jahr 2010.

      Ein ähnliches problem:
      Wenn ich versuche manuell eine LIB einzubinden, beispielsweise mit $include "dcf77.lib" meckert Bascom haufenweise Fehler an. Egal ob die originale oder die 4.11 von RN bzw. Roboternetz.

      Aktuell mache ich mir daher Gedanken über eine eigene Routine und ein herrangehen:
      Grob betrachtet eine Art modulartig einfügbare Subroutine die gelegentlich (alle xx Stunden, wenn der µC gerade keine andere Aufgaben hat) angesprungen werden kann.

      Dort dann Timer0 mit Vorteiler 1024 von 0-195 zählen lassen.
      Das ergäbe eine Interrupt-Rate von ca. 40Hz entsprechend alle 25ms.
      Im Interrupt dann Pegel am DCF-Pin abfragen und Zähler aufadieren:
      Wenn Highpegel für 4 Messungen (100ms) und Lowpegel für 36 Messungen (900ms) war es eine 0
      Wenn Highpegel für 8 Messungen (200ms) und Lowpegel für 32 Messungen (800ms) war es eine 1
      Wenn Higpegel für 0 Messungen und Lowpegel für 72-76 Messungen (1800-1900ms) war das der Minutensprung.
      Also nach jeweils 10 Messungen nach Impulsbeginn sollte klar sein ob es eine 0 oder eine 1 war...*grübel*

      Über den Capture-Eingang auszählen wäre einfacher, aber auch wieder störanfälliger. Störungen bei DCF77 sind überwiegend Nadelimpulse weit unterhalb von 100ms. Bei der Abfrage des Pegels nur alle 25ms dürften diese weniger stören.


      Im Übrigen: Mir ist es wieder eingefallen wie ich vor Jahren das verdrängte Problem in meiner ersten Funkuhr erschlagen habe:
      Zwar hängt da auch ein 32kHz-Uhrenquarz an den TOSC-Pins, aber auch dort ohne Funktion.
      Damit die Softclock der DCF77.lib eine erträgliche Genauigkeit hat um nur alle 24h synchonisiert zu werden, habe ich die Quarzkapazitäten ausgebaut und 20pF Trimmer ans 16MHz-Quarz gelötet, um diesen exakt aus 16000000Hz zu ziehen.
      Dieses hilft mir bei diesem Projekt aber nicht, da nun wirklich kein Platz mehr ist für ein externes Quarz.
      Wobei...die XTAL-Pins wären noch frei...






      Hier gezeigt ein Slave als Beispiel.
      Der Master sitzt auf der selben Platine (100% identisches Layout) nur halt mit Mega1284 statt Mega324.

      Grüße

      Jürgen
    • Wie schaut jetzt deine softclock aus? Du hast den Quarz, timer2 mit 128 prescaler und bekommst so einen Sekundeninterrupt beim overflow vom timer2. Und dann?
      config clock=user für die Variablen, wie geht es bei dir weiter?
      Raum für Notizen

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

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