Digispark mini (attiny85) ohne Quarz mit softclock, RTC und DCF

    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!

    • Digispark mini (attiny85) ohne Quarz mit softclock, RTC und DCF

      Ich möchte mit dem Digispark mini experimentieren und mal eine Uhr mit DCF77-Empfang, RTC und max7219-Matrixanzeige aufbauen. Ich hab' zwar die Digispark noch nicht und experimentiere noch mit einem Arduino uno, aber es tauchen schon Fragen auf.
      Das eine ist, der verbaute attiny85 hat keinen 16bit timer, nur 8bit. Also nicht die DCF77.lib von bascom, sondern die DCF77-rn.lib aus dem Roboternetz rn-wissen.de/wiki/index.php?ti…rary#Bascom_Hauptprogramm angepasst. Hierbei braucht es nur einen Aufruf einer sub alle 25msec. Diese 25msec müssen aber genau sein, weil a: die softclock damit gesteuert wird, b: die Decodierung des DCF-Signals damit gesteuert wird. Kein gültiges Zeittelegramm > es läuft die softclock, aber eben auch nur mit der Genauigkeit der 25msec. Ich hab' mal beim Arduino mit timer0 bei prescale=1024 und timerload=78 einen Aufruf alle 4,992msec x5 genommen, zusammen mit dem Resonator auf dem Arduino gab es eine deutliche Gangungenauigkeit in der softclock und ein seltenes Decodieren des DCF-Signals. Ein genauer 1msec-Aufruf x25 geht deutlich besser.
      Jetzt kommt das Problem, der attiny läuft ohne Quarz und dessen Taktfrequenz liegt wohl zwischen 16Mhz und 16,5 Mhz. Wie bekomme ich da jetzt einen isr mit genau 25msec hin, damit die softclock ordentlich läuft und das Decodieren auch klappt?
      Ich hätte ja noch die RTC, damit könnte ich einen 1-Sekundenzeitraum erkennen und meinen nötigen timeraufruf damit irgendwie berechnen. Aber wie bekomme ich da einen möglichst genauen timerload-Wert hin? Natürlich könnte ich mit der RTC eine userclock betreiben, nur wo bekomme ich die 25msec für den Decoder her, der meine RTC ja auf dem Laufenden halten soll?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mit dem Thema beschäftige ich mich auch schon eine Weile ;)
      Ich habe mal mit einem Atmega und internem RC-Oszillator eine Uhr mit DCF77 Anschluss gebaut, da ist das Problem ja ähnlich.
      Ich habe da einfach in der Hauptschleife den eintreffenden DCF-Puls angeschaut und mit der aktuellen Sekunde verglichen.
      Je nach Abweichung dann das OCCAL Register nachgestellt.
      Nach einiger Zeit war der interne Oszillator dann recht genau.
      Für den Attiny85 würde ich es auch so machen oder alternativ einen richtigen Quarz anbinden.
      Bei den wenigen Pins muss man sich dann arrangieren (Porterweiterungen etc.)
    • Michael schrieb:

      Ich habe da einfach in der Hauptschleife den eintreffenden DCF-Puls angeschaut und mit der aktuellen Sekunde verglichen.
      Wenn die softclock eine neue Sekunde beginnt, dann mit dem gerade anliegenden DCF-level verglichen? Ich hab' jetzt einen invertiertes DCF.Signal, das heißt high=800/900msec, low 100/200msec. Da gibt's doch eine recht große Bandbreite. a_27_b277ca12
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Also bei einer neuen Sekunde einen timer starten und auf einen Pegelwechsel beim Dcf-Signal warten. Dann timer stoppen und Laufzeit mit den timer-Daten errechnen. Wenn länger wie 1 Sekunde, dann Takt um einen Tick erhöhen. So, in etwa?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Wenn du sowieso auf beide Flanken schaust, macht es meiner Meinung nach wenig Sinn, die DCF Routine zusätzlich zu benutzen. Da werden doch nur einige Ressourcen benutzt/verschwendet und die wichtigen Infos hast du eh schon. Das bisschen Auswerten der Bits ist doch keine Raketentechnik.
      Dann lässt du einen Timer frei laufen und wertest die Länge der High bzw. Low Zeiten aus. Der andere Timer steht dann zur freien Verfügung.
    • Die Dcf-Routine ist halt schon fertig und geht auch ganz gut, aber halt nur dann, wenn der 25msec Aufruf auch genau kommt. Gut, ich kann bei Programmstart auf 2 folgende Flanken warten und die als Sekundenabstand hernehmen und zu einem timerload verrechnen. Wenn ich nicht zufällig den Minutenwechsel erwische, mit 2 Sekunden Flankenabstand :/ und anfängliche Störungen beim Empfang, wenn sich der Empfänger noch nicht eingestellt hat, müsste ich auch ausblenden.
      Am zuverlässigsten kommt der Sekundenwechsel der Rtc (einen Sekundenausgang hab' ich bei dem verwendeten Modul nicht).
      Raum für Notizen

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

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

      Also bei einer neuen Sekunde einen timer starten und auf einen Pegelwechsel beim Dcf-Signal warten. Dann timer stoppen und Laufzeit mit den timer-Daten errechnen. Wenn länger wie 1 Sekunde, dann Takt um einen Tick erhöhen. So, in etwa?
      nein, das machst du nur einmal pro Minute, der Abstand der Sekunden zueinander ist da zu ungenau bestimmbar.
      Am Anfang kannst du das vielleicht einmal pro Sekunde machen, damit du von großen Abweichungen weg kommst.


      tschoeatsch schrieb:

      Am zuverlässigsten kommt der Sekundenwechsel der Rtc
      die einen Quarz benutzt?
    • Ich will so ein Minimodul mit ds3231 ebay.de/itm/Precision-DS3231-R…id=p2045573.c100505.m3226
      verwenden, die gehen doch genau.
      Raum für Notizen

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

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

      die gehen doch genau.
      naja, da kannst du dir ja auch die Zeit dort holen und nicht den Umweg über den internen Oszillator?
      Der DS3231 hat einen 32kHz Ausgang, damit könntest du ja einen Counter füttern, der dir bei 800 Takten deinen 25ms Interrupt gibt.
      Ich hab mir den Attiny85 aber noch nicht so genau angesehen, ob er das kann ;)
    • tschoeatsch schrieb:

      Wenn die softclock eine neue Sekunde beginnt, dann mit dem gerade anliegenden DCF-level verglichen? Ich hab' jetzt einen invertiertes DCF.Signal, das heißt high=800/900msec, low 100/200msec. Da gibt's doch eine recht große Bandbreite.
      Gleich vorab meine Entschuldigung.

      Habe dich wohl wieder mal fasch verstanden. Du möchtest eine Eieruhr kaufen/anwenden um den Sekundentakt des DCF77- Empfangsignal auf Genauigkeit zu trimmen?
      Fehler von einer Sekunde in 30.000 Jahren ist wohl für dich zu ungenau.
      Ich kenne keine DCF- Module, wo man nicht den Sekundentakt anzapfen kann. Das gesendete Datenpaket(59/60 Sekunden) auszuwerten ist wie schon Bemerkt, eine andere Sache. Aber wohl nicht dein Problem. Motto: „Selbst ist der Mann“
      Für mich ist ein sehr genauer Takt die Basis um z.B. die Minute genau zu berechnen/abzubilden.

      Hoffe wie gewohnt, du verstehst mein spaßigen Kommentar.
      Gruß
      P.S habe noch einige DCF- Module(in IP54 Gehäuse) gebe diese mit Versandkostenübernahme gerne ab.
    • Michael schrieb:

      Der DS3231 hat einen 32kHz Ausgang,
      Dieses Modul hat diese Ausgänge nicht herausgeführt, hat nur die i2c-Pins am Stecker.

      fredred schrieb:

      Habe dich wohl wieder mal fasch verstanden. Du möchtest eine Eieruhr kaufen/anwenden um den Sekundentakt des DCF77- Empfangsignal auf Genauigkeit zu trimmen?
      Ja, das glaub' ich auch. Ich möchte das Dcf-Signal Decodieren, um eine genaue Zeit zu bekommen. Mit dieser genauen Zeit synchronisiere ich die RTC, die dann nach dem Einschalten schon mal eine Zeit liefert. Da spare ich mir die Knöpfle, um eine Zeit einzustellen. Der Dcf-Decoder braucht aber eine hinreichend genaue Zeitbasis, genauso die softclock, damit nach den vollen Minuten die Sekunden nicht hakeln, wenn doch mal Dcf decodiert worden ist. Diese Zeitbasis ist 25msec und die muss ich jetzt zusammen basteln, weil der Systemtakt nur sehr ungenau angegeben werden kann (laut den bisherigen Beschreibungen über das Digispark mini).
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • "Die Buchsenleiste 5-polig hat einen unbelegten Pin.
      Pin1 vom Schaltkreis mit dem unbelegten pin-buchse mittels Spulendraht 0,1mm
      verbinden und 32Khz sind verfügbar."
      Das ist natürlich eine Option. Ich hab' grad' ein Programm laufen, dass die Timertakte zwischen 2 Sekunden der RTC zählt. Funktioniert soweit mal, über die Ganggenauigkeit kann ich noch nix sagen.
      Jetzt muss ich mich mal um den counter kümmern, ob das mit den 32kHz klappt.

      BASCOM-Quellcode

      1. ...
      2. Dim Timer2reload As Byte : Timer2reload = 0
      3. Config Timer2 = Timer , Prescale = 128
      4. Load Timer2 , Timer2reload
      5. On Ovf2 Timer2_isr
      6. 'enable ovf2
      7. Start Timer2
      8. enable interrupts
      9. Dim Isr_counter As Byte
      10. Dim Ueberlaufzaehler As Dword 'in der timer2_isr
      11. ...
      12. Dcfstatus.7 = 0 'DCF-Decoder aus
      13. 'timerload für einen 1msec interrupt ermitteln
      14. I2cstart 'Sekunde aus der RTC lesen
      15. I2cwbyte Ds3231w
      16. I2cwbyte 0 'auf 0 stellen
      17. I2cstart
      18. I2cwbyte Ds3231r
      19. I2crbyte _sekunde , Nack 'Sekunden
      20. I2cstop
      21. Sekunde = _sekunde
      22. Do
      23. I2cstart 'auf Start der neuen Sekunde warten
      24. I2cwbyte Ds3231w
      25. I2cwbyte 0 'auf 0 stellen
      26. I2cstart
      27. I2cwbyte Ds3231r
      28. I2crbyte _sekunde , Nack 'Sekunden
      29. I2cstop
      30. Loop Until Sekunde <> _sekunde
      31. Ueberlaufzaehler = 0 : Timer2 = 0
      32. Enable Ovf2 'Zählung starten
      33. Sekunde = _sekunde
      34. While Sekunde = _sekunde
      35. I2cstart 'auf Ende der Sekunde warten
      36. I2cwbyte Ds3231w
      37. I2cwbyte 0 'auf 0 stellen
      38. I2cstart
      39. I2cwbyte Ds3231r
      40. I2crbyte _sekunde , Nack 'Sekunden
      41. I2cstop
      42. Wend
      43. Stop Timer2 : Disable Ovf2 'Zählung stoppen
      44. Ueberlaufzaehler = Ueberlaufzaehler * 256 'Timertakte für 1 Sekunde
      45. Ueberlaufzaehler = Ueberlaufzaehler + 500 'für genauere Rundung
      46. Ueberlaufzaehler = Ueberlaufzaehler / 1000 'Timertakte für 1msec
      47. Timer2reload = Ueberlaufzaehler
      48. Enable Ovf2 : Start Timer2
      49. Dcfstatus.7 = 1 'DCF-Decoder ein
      50. ...
      51. Timer2_isr:
      52. Load Timer2 , Timer2reload
      53. Incr Ueberlaufzaehler
      54. incr isr_counter
      55. If Isr_counter = 25 Then
      56. Call Dcf77_soft 'alle 25msec ausführen
      57. isr_counter=0
      58. end if
      59. return
      Alles anzeigen
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hm, T0 gibt's als clock-Eingang für counter0. Dann geht mir wieder ein pin flöten. Noch stell ich's mir so vor: 1 pin als Dcf-Eingang, 2 pins als i2c für die RTC, 1 pin für CS für den max7219, 1 pin für den clk für den max und der Din vom max wird mit dem sda vom i2c verbunden und gemeinsam verwendet. Mach 5 pins und ich kann den resetpin so lassen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Einen Oszillator mit 5ppm(!) hat der DS3231 schon eingebaut, sogar nach Bedarf teilbar.
      Wenn man die 8KHz (eigentlich 8192Hz) benutzt, dann gibt es bei einem Timer mit 8 Bit alle 31,25 ms einen Überlauf, wenn man den Timer entsprechend setzt, dann auch mit weniger.
      Wichtig ist m.M.n. die Stabilität.
      Der Aufwand beschränkt sich auf das Kabel von Pin3 zum NC-Pin der Steckerleiste am DS3231.
    • Eigentlich ist ja nur wichtig, dass das Dcf-Signal mit dem Decoder gut decodiert werden kann. Für die Zeiten zwischen den Synchronisationen durch Dcf zeigt die Softclock die Zeit. Wenn ich diese jede Sekunde durch die Rtc-Zeit abgleiche, dann hab' ich ja eine langzeitgenaue Zeitanzeige.
      Mein oben gezeigter Programmschnipsel misst und errechnet für den testweise verwendeten Arduino uno ein timerload von 125 (16Mhz, prescale 128, ergibt 1msec interrupt), aber es werden ja nur ganze Zahlen für den timerload berechnet. Bei 'krummen' Taktraten könnte ich mir Ergebnisse vorstellen, die nur 'ähnlich 1msec' interrupts erzeugen. Das langt vielleicht für die Decodierung, aber wenn es mal eine längere Empfangsstörung gibt, dann läuft die softclock sehr ungenau.
      Raum für Notizen

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

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