Forum: Projekte & Code DCF77 Uhr, zum X.ten Mal, jetzt mit SAF


von Clemens H. (sum)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich habe hier mal eine DCF77 Uhr nun schon (fast) zur Perfektion
getrieben. Sie kommt mit einem AtTiny2313 und ein paar Widerständen und
Transistoren aus. Hinzu kommen natürlich noch die LED-Anzeigeelemente.

Der Empfänger ist ein SAF (Signal Angepasstes Filter). Dieser
integriert die letzten 200 Millisekunden des Signaleingangs. Ist das
Integral unter das viertel des Maximum gefallen, so wird sowohl das
Maximum als auch die dauer, für die das Maximum erreicht war, zur
Entscheidung auf 0 oder 1 genutzt.

Bei kurzem Imupls wird das Integral für lange zeit einen geringen Wert
(Maximum) einnehmen, da der Impuls das Filter nicht gänzlich füllt:
 _,/`^^^^^`\,____
Bei einem langen Impuls wird der Filter genau einmal ganz ausgefüllt,
so dass das Maximum groß ist aber nur kurz eingenommen wird:
       /`^`\
      /     \
 _,/       \,_____
Auch bei Störungen wird sich der Ausgang nicht merklich ändern, da die
integrierende Funktion des Filters Tiefpasscharakter aufweist und kurze
(hochfrequente) Störungen in Form von Prellen oder kurzen Störimpulsen
herausfiltert.

Des weiteren braucht dieser Filter keinen Abtastzeitpunkt, der wird
automatisch aus dem Signal zurückgewonnen. Lediglich um das
Synchronisationsbit (fehlender Impuls) zu erkennen wird eine Zeitbasis
gebraucht.

Wer hat Anregungen/Lob/Kritik?! Bitte schreiben!

Schöne Grüße, Clemens

von Neubert Uwe (Gast)


Lesenswert?

Leider gibts hier immer noch keinen Code für eine Bascom Uhr. :-(

Ich habe leider nicht das Wissen so ein Teil zu proggen. Meine Projekte
sind eher kleiner Natur. Aber eine Bascom-DCF Auswertung wäre genial!

von Simon K. (simon) Benutzerseite


Lesenswert?

Grummel, schon wieder so einer mit Unix-codiertem Zeilenende.

von uwegw (Gast)


Lesenswert?

Grummel, schon wieder so einer mit Notepad...
Tipp: auf Notepad2 umstellen:
http://www.flos-freeware.ch/notepad2.html

von Neubert Uwe (Gast)


Lesenswert?

Hä? Was willst du mit dem Zeilenende? Meinst du meine Postings?

von duundich (Gast)


Lesenswert?

Hallo Clemens,

> Sie kommt mit einem AtTiny2313 und ein paar Widerständen und
Transistoren aus.

Heißt das, ohne das übliche Empfangsmodul? Was ist denn dann nötig, um
das Projekt zum Laufen zu bekommen?
Wäre schön, wenn Du auch ein kleines Foto vom Aufbau hier anhängst.

von Simon K. (simon) Benutzerseite


Lesenswert?

>>Hä? Was willst du mit dem Zeilenende? Meinst du meine Postings?

Dein Editor macht nicht das "übliche" (unter Windows) CrLf
Zeilenende.. Sondern nur Cr oder nur Lf (weiß ich grad nicht wie das
bei Unix war). Das heißt das ganze kann man nicht mit dem Notepad
lesen.

von Peter D. (peda)


Lesenswert?

"Wer hat Anregungen/Lob/Kritik?! Bitte schreiben!"

Für das fehlende CRLF habe ich Borland C++, öffnen, speichern fertig.

Aber mit BRD, SCH kann keiner was anfangen, da wäre JPG, PNG oder PDF
angebracht.


Peter

von Mighty (Gast)


Lesenswert?

@Simon Küppers
Unter Unix (bzw. sogut wie jedem OS ausser Windows) nur LF (0x0A).

von Hobbylöt (Gast)


Lesenswert?

"Aber mit BRD, SCH kann keiner was anfangen, da wäre JPG, PNG oder PDF
angebracht."

Du schreibst einen Müll, man o mann!

Wer Eagle hat, kann damit was anfangen!

von oli (Gast)


Lesenswert?

Hallo

@Hobbylöt
"Du schreibst einen Müll, man o mann!"

Vielleicht schreibst Du ja Müll, schon mal daran gedacht dass es Leute
gibt die Eagel nicht verwenden und es auch nicht installieren wollen?
Für diese Fälle ist JPG o.ä. die bessere Lösung.
In diesem Sinne.

Oli

von Hobbylöt (Gast)


Lesenswert?

Wenn jemand Eagle nicht mag, ist es seine Sache,
aber der sollte nicht behaupten, mit BRD und SCH kann man nichts
anfangen!

Gruss und schönen Abend

von Clemens H. (sum)


Angehängte Dateien:

Lesenswert?

Hallo,

ich finde es sehr schön, dass hier etwas Leben rein kommt :-)

Die umkodierung von Linux/Windows-Dateien sollte i.A. kein Problem
darstellen, dafür gibt es Editoren, die beides können - auch für
Windows ... wurde ja auch schon gesagt.

Mit BRD und SCH kann vielleicht nicht jeder was anfangen, ok. Hier
kommt nun alles nochmal als PNG - nur verändern kann manns dann nicht
so leicht.

@duundich:
Natürlich wird noch das normale Empfangsmodul benötigt. Dieses ist aber
leicht aus einem beliebigen 1-Zellen-Wecker zu entnehmen und hier
einzusetzten. z.B. bietet Mediamarkt soche Wecker an (mein Modul ist
aus einem Mediamarkt-7-eu-Wecker).

Schöne Grüße, Clemens

von Läubi (Gast)


Lesenswert?

Kannst du den Wecker mal nenen? Wäre bestimmt interesant, da ein solches
Modul neu bei Reichelt 14 Euro kostet!

von Hobbylöt (Gast)


Lesenswert?

Bei ELV:

DCF-Empfangsmodul mit 77,5-kHz-Empfangsantenne, abgeglichen, inkl.
Beiblatt
Artikel-Nr.: 68-352-62
9,95 Teuro

von Benedikt (Gast)


Lesenswert?

>Für diese Fälle ist JPG o.ä. die bessere Lösung.

Das ist totaler Müll !

Für Schaltpläne nie jpg nehmen, sondern immer png oder gif !

von Peter D. (peda)


Lesenswert?

@Hobbylöt,

"Wenn jemand Eagle nicht mag, ist es seine Sache,"


Du schreibst aber auch einen großen Müll, man o mann!

Es hat überhaupt nichts mit mögen zu tun, sondern Eagle ist weder der
Nabel der Welt noch irgendein Standard.

Eagle ist nur ein Programm unter vielen und daher können viele die
Dateien nicht lesen.

Ich könnte ja auch SCH von Protel oder Orcad erzeugt reinstellen, aber
ich machs nicht, weil das eben viele nicht lesen können.


Also komm mal von Deinem hohen Roß runter, das hier ist kein
Eagle-Forum.


Peter

von Peter D. (peda)


Lesenswert?

@Benedikt,

"Das ist totaler Müll !"

Jau, immer bloß auf die Kacke hauen.

Ich meinte doch irgendein standardisiertes Ausgabeformat.

Ich druck z.B. in eine Datei (Postscript) und jags dann durch die
PS2PDF.BAT (Ghostscript).


Peter

von Clemens H. (sum)


Lesenswert?

@Läubi:

Das Funkmodul stammt aus einem Wecker von EUROCHRON. Dies ist ein
LCD-Wecker mit Tasten rechst und links (jede Seite ist halbrund zudem).
Gabs glaube ich in 2 Farben, ich hatte ihn in Grau gekauft. Das ist aber
schon eine ganz schöne Weile her, ich weiss nicht mehr, wann das war.
Ich denke aber, wenn man Glück hat, kriegt man auch ein anderes
Alternativprodukt. Habe gehöhrt, dass die Tschibo-teile auch geeignet
sein sollten (~5€).

Schöne Grüße, Clemens

von Neubert Uwe (Gast)


Lesenswert?

Hat keiner mal irgendwo einen Code in Bascom zur DCF Auswertung gesehen?
Gruss, uwe!

von duundich (Gast)


Lesenswert?

clemens - ok, ich dachte, du hättest die ultimative empfangsmodulfreie
softwarelösung klammheimlich hier reingestellt, während die anderen
sich noch über den empfängerbau unterhalten :-)

die anderen:
ihr benehmt euch hier dermaßen daneben, daß es mich so nervt, daß ich
das hier schreibe. hättet ihr euch doch alles sparen können, oder?

von Mirko (Gast)


Lesenswert?

Schau mal unter diesem Link

http://www.mcselec.com/index.php?option=com_content&task=view&id=86&Itemid=57

Dieser bezieht sich auf ARV, für den 8051 gibt es auch ein Listing. Das 
aber nur auf Englisch

Gruss Mirko

von Jupp (Gast)


Lesenswert?

Hallo DCF-Freaks,

habe letztens bei Conrad DCF77_Funkwecker für 3 Euro gesehen.

von Fried V. (tich)


Lesenswert?

@Clemens
Hi, ich bin gerade dabei auf Basis Deines Codes eine DCF77 Uhr 
aufzubauen.
Der Code wird in cvavr erstellt, der Dekoder läuft bereits in der VMLab 
Simu (langsam, aber mit den NRZ files kann man das DCF-Signal genau 
nachbilden). Hast Du irgendwo noch was zur Theorie Deines Filters?
So ganz kann ich die Funktionsweise noch nicht nachvollziehen, er 
funktioniert aber recht gut.
LG Fried

von Clemens H. (sum)


Lesenswert?

Hallo Fried,

der Filter arbeitet nach dem Prinzip eines jeden SAF (Signal Angepassten 
Filter). Es wird die zeitinvertierte Impulsantwort des Senders als 
Empfängerimpulsantwort verwendet. Der Sender sendet Rechteckimpulse, 
diese sind symetrisch, also ist die Impulsantwort des Empfängers auch 
wieder ein Rechteckimpuls (z.B. ein Halte-Glied). Das Filtern des 
Eingangssignal geschieht hier im Zeitbereich, es wird gefaltet. Die 
Faltoperation ist ein Integral aus dem Produkt der Impulsantwort und der 
um einen beliebigen Wert T verschobenen Version des Empfangssignals. 
Dies genau ist im Code implementiert.
Das Ergebnis welches aus der Faltung rauskommt, ist folglich ein Dreick 
oder ein Trapez (zwei Rechtecke gegeneinander verschoben und miteinander 
multipliziert und integriert). Je nach angelegtem Sende-signal ist das 
Signal nun ein Dreieck oder ein Trapez. Danach wird unterschieden, ob 
ein 0 oder eine 1 gesendet wird.

Leider habe ich keine Quelle parat, die dieses Prinzip gut erklärt, aber 
u.U. hilft google oder wikipedia weiter, Stichworte: SAF, 
Signalangepasster Filter, Faltung

Schöne Grüße,
Clemens

von rfr (Gast)


Lesenswert?

Hi,
du brauchst immer noch ein Empfangsmodul. ist es nicht möglich, das 
Signal von DCF77 direkt zu samplen (ADC) und dann zu filtern und weiter 
zu verarbeiten?

Grüsse

Robert

von Wolfgang Horn (Gast)


Lesenswert?

Hi, rfr,

Du: "st es nicht möglich, das Signal von DCF77 direkt zu samplen (ADC) 
und dann zu filtern und weiter zu verarbeiten?"

Gibt solche Vorschläge, aber nicht für Zeitzeichenempfang, sondern 
Spektrumsanalyse für EMV-Meßtechnik.

Problem ist nur: Um ein Signal von 3 Hz Bandbreite zu nutzen, mußt du 
(kleingeschrieben, weil allgemein gemeint) >150 kHz mit hoher 
Großsignalfestigkeit empfangen und verarbeiten - und nachher 150kHz - 3 
Hz mühsam ausfilgern.

Klingt so ein wenig wie "mit dem Lkw losfahren, Packung Zigaretten aus 
dem Automaten ziehen".

Ciao
Wolfgang Horn

von Falk (Gast)


Lesenswert?

@Wolfgang Horn

> Du: "st es nicht möglich, das Signal von DCF77 direkt zu samplen (ADC)
> und dann zu filtern und weiter zu verarbeiten?"

> Problem ist nur: Um ein Signal von 3 Hz Bandbreite zu nutzen, mußt du
> (kleingeschrieben, weil allgemein gemeint) >150 kHz mit hoher
> Großsignalfestigkeit empfangen und verarbeiten - und nachher 150kHz - 3
> Hz mühsam ausfilgern.

Naja, man könnte auch Undersampling machen, dann reichen theoretisch ein 
paar Hertz. Aber ohne (sehr) gutes analoges Frontend (=Empfangsmodul) 
wird das nix. Man muss schliesslich auch noch AGC und ähnliches 
baeachten.

MFG
Falk

von Fried V. (tich)


Lesenswert?

@Clemens
Hallo,
vielen Dank für Deinen Code und die Erläuterungen. Der Decoder läuft 
jetzt auch realtime bei mir, nur mit dem Zusammenspiel tsCurrent, 
tsLastValid und tsSecure scheint was nicht zu stimmen.
tsCurrent wird korrekt empfangen, nach dem ersten Mal auch richtig durch 
dcf77_putSync nach tsLastValid kopiert. Nach dem nächsten Telegramm 
erfolgt der Vergleich Current-Valid, ist immer falsch weil Valid eine 
Minute weniger hat als Current, muss auch so sein IMO?
Danach wird bei korrektem Empfang tsLastValid nie wieder geändert.
Habe ich was übersehen?
LG Fried

von Clemens H. (sum)


Lesenswert?

Hallo Fried,

schön, dass der Code bei dir läuft.
Zu deinem Problem:
Nach der 59. Sekunde wird dcf77_putSync vom bit_Decoder aufgerufen. 
Dieses kopiert den Current timestamp in den LastValid, falls LastValid 
noch nicht empfangen wurde. Folglich ist nach dem ersten, fehlerfreien 
Empfangenen Timestamp einer in LastValid drin. Hier werden die Sekunden 
auf 0 gesetzt, denn es wird immer die Zeit gesendet, die als nächstes 
kommt.
In der 4. Sekunde nun - die ja danach kommt - vergleicht er beide 
Timestamps, falls beide vorhanden sind (putBit -> case 4:) sind sie 
gleich, inkrementiert er den ValidCounter, sind sie unterschiedlich 
inkrementiert er den InvalidCounter. In der ersten 4.Sekunde sind sie 
logischerweise gleich, da sie vor 4 sekunden gerade kopiert wurden.
Anschließend empfängt er wieder nach Current (erster neuer Wert kommt 
erst in Sekunde 20). Ist dies wieder abgeschlossen, wird in putSync der 
Timestamp nicht kopiert - er ist ja schon da.
Inzwischen wurde die "Uhr" des Dekoders >60 mal mit 1 Hz aufgerufen 
(dcf77_timer). Also ist der LastValid-Stand eine minute weiter und beim 
nächsten Vergleich von Current (der neue Stand, der empfangen wurde und 
deshalb wie du schon sagtest eine Minute weiter ist) und LastValid (der 
ja dur dcf77_timer erhöht wurde) sollte bei fehlerfreiem Empfang nun 
auch wieder Gleichheit liefern.
Ist diese Prozedur des Empfangen und vergleichens häufig genug 
abgelaufen, so  (mindestens 3 Mal), wird davon ausgegangen, dass die 
richtige Zeit empfangen wurde. Folglich wird der Timestamp nach Secure 
kopiert - der wiederum auch von dcf77_timer aktuell gehalten wird. Die 
Häufigkeit des Vergleichs ist für die Sicherheit maßgeblich...

Bei mir läuft der Code seit langem sehr stabil und zeigt nie eine 
falsche Zeit an - auch gibt es keine Probleme die Zeit zu empfangen.

Last valid wird wieder zurückgesetzt (das Statusbit in u8Status 
gelöscht), wenn der Vergleich häufiger fehlgeschlagen ist als er 
erfolgreich war. Dann ist es wahrscheinlich dass LastValid falsch ist 
und erneut empfangen werden muss.

Grüße,
Clemens

von Fried V. (tich)


Lesenswert?

Hallo Clemens,
so ich glaube jetzt den Code verstanden zu haben, läuft bei mir in der 
Simu soweit aber real time noch nicht ganz, die Software RTC (über den 
Timer1s) hängt der DCF nach (mehrere Sec), daher erfolgt kein korrektes 
Update von LastValid. Mal sehen woran das liegt, die DCF Telegramme 
kommen aber auch realtime richtig an.
Die Simulation zeigt, dass das Update der lokalen RTC etwa 300msec nach 
der Eingangsflanke des DCF-Bits erfolgt, ich will mal schauen ob man das 
noch optimieren kann. Ich denke dass man den Timer1 Int noch mit der 
Bitflanke des DCF Signals synchronisieren muss.
LG Fried

von Christian B. (casandro)


Lesenswert?

Clemens Helfmeier wrote:
> Wer hat Anregungen/Lob/Kritik?! Bitte schreiben!
>
> Schöne Grüße, Clemens

Sehr schön. Was jetzt noch fehlt ist eine Uhr, die parallel mitläuft und 
ihre Geschwindigkeit an die des Funksignals anpasst. Damit könnte man 
auch andere Zeitbasen ableiten, die auch dann stabil wären, wenn der 
Empfang ausfällt.

von Clemens H. (sum)


Lesenswert?

Hallo Christian,

das ist eine gute Idee. Ich habe den Eindruck, dass das Quarz zwar 
stabil ist, aber durch die deutlichen Temperaturunterschiede bei heller 
und dunkler Anzeige, läuft es nicht immer exakt auf der Nennfrequenz 
(Der Chip verstimmt es sozusagen).

Folglich müsste man hier auch noch die Helligkeit der Anzeige 
(=Stromverbrauch, Wärmeentwicklung) mit in die Berechnung der "wahren" 
Zeit einbeziehen.

Vielleicht ein bisschen viel aufwand, wenn man eigentlich spätestens 
nach 48h wieder dcf77-empfang hat ;-)

Was für eine Zeitbasis hast du dir vorgestellt?

Grüße,
clemens

von Christian B. (casandro)


Lesenswert?

Servus Clemens,

naja, das mit dem Display kann man ja einrechnen. Das ist ja nur lineare 
Algebra. Im Zweifellsfall heizt man einfach den Quarzoszillator.

Nunja, es ist doch relativ oft so, dass man Geräte hat, die genau auf 
einer bestimmten Frequenz arbeiten sollen. Beispielsweise ein 
Radiogerät, ein Frequenzzähler oder ein Videorekorder. Diese Geräte 
haben dafür in der Regel einen 1 oder 10 MHz Eingang. Wenn man nun den 
ATMega dazu bringen kann, ein sehr genaue Zeit zu haben, so kann man 
einen einfachen VCO auf die Frequenz nachregeln, die man braucht. Also 
in gewisser Weise ein billiges Frequenznormal.

von Clemens H. (sum)


Lesenswert?

Guten Abend,

ok, zwar bin ich nicht im Besitz eines solchen gerätes, aber das ist mal 
ein interessantes Projekt. Ich denke aber, man darf es dann auf keinen 
Fall in Zusammenhang mit einer Uhr mit schöner Leuchtanzeige machen, da 
das den Fehler wirklich krass beeinflusst wie ich gemerkt habe.

Die Sache mit der Temperatur hängt glaube ich auch nicht primär von der 
Temperatur des Quarzes ab, sondern viel mehr von der Temperatur des 
AVRs. Schließlich ändert sich ja auch die Eingangskapazität der 
Oszillator-Pins mit der Temperatur und wird den Quarz somit verstimmen.

Mich würde wirklich mal interessieren, wie man eine derartige Regelung 
in einen AVR implementieren will.
Angenommen du willst "nur" 100kHz genau erzeugen. Sagen wir, dein 
Oszillator ist auf 1% genau - von Natur aus - und du willst nun gerne 
"nur" 0.1% erreichen mithilfe des DCF77-Signals. Wenn du nicht gerade 
einen verstimmbaren Oszillator nimmst, sondern das Signal irgendwie aus 
dem AVR rausquetcshen willst, brauchst du schon 100kHz/0.1% = 100Mhz 
Taktrate für einen Zähler, damit du mit einem LSB differenz im Überlauf 
(1000->1001 z.B.) einen Unterschied von 0.1% erzeugen kannst. 100Mhz / 
1000 = 100kHz.

Nur so ein Rechenbeispiel...

Wie man das ganze mit einem VCO erzeugen kann, weiss ich nicht. Dabei 
wär's natürlich deutlich einfacher. VCO->messen (über entsprechend 
langer Zeit auch entsprechend genau, da ja digital möglich) und ggf. 
VCO-Voltage ändern.

von Christian B. (casandro)


Lesenswert?

Natürlich würde man da dann einen externen Quarzoszillator verwenden. 
Den kann man gut auf Temperatur halten.

Zum Oszillator ist es wichtig zu wissen, was so genau sein soll. Die 
Phase oder die Frequenz. Wenn die Phase so genau sein soll, dann geb ich 
Dir recht, dann muss die Frequenz des AVRs so hoch sein.
Soll hingegen nur die Frequenz auf lange Sicht gesehen so genau sein, so 
kannst Du das sehr genau per DDS (Direkter Digitaler Synthese) 
erreichen. Das funktioniert ungefähr so. Stell Dir einen Kreis vor. Du 
möchtest jetzt, dass sich ein Punkt gleichmäßig auf dem Kreis bewegt. Da 
Du in einem zeitdiskreten System arbeitest, schiebst Du den Punkt bei 
jedem Taktzyklus ein paar Werte weiter. Der Durchmesser deines Kreises 
kann nun beispielsweise eine 128-Bit Ganzzahl sein. Da ist in Assembler 
auf dem AVR überhaupt kein Problem. Die Schritte speicherst Du in 
ebensoeiner Ganzzahl ab.
OK 100kHz sind direkt mit dem AVR ein Problem. Aber rechnen wir mal mit 
10 kHz und einer Schrittrate von 100 kHz.
Dein Kreis hat dadurch, dass er durch einen 128 Bit Zähler gebildet 
wird, genau 340282366920938463463374607431768211456 Punkte.Du möchtest 
jetzt 10 kHz erreichen, somit gehst Du immer 1/10 Durchmesser in jedem 
Schritt. Das sind 34028236692093846346337460743176821145,6 pro Schritt, 
was natürlich nicht geht. Aber stell Dir nur mal vor in welch feinen 
Schritten Du die Frequenz am Ausgang jetzt einstellen kannst. Du kannst 
als extra natürlich auch noch die obersten 10 Bit verwenden, um einen 
Sinuswert in einer Tabelle nachzuschlagen und den dann auf den PWM 
auszugeben. Das reicht für 8 Bit am Ausgang. Diese Frequenz kannst Du 
wunderbar filtern und auf eine PLL geben.

von Clemens H. (sum)


Lesenswert?

Moin Christian,

an DDS habe ich natürlich nicht gedacht - vielleicht auch, weil mir 
nicht klar war, dass auch ein "einfacher" Sinus reichen würde...
Hier könnte nur schwierig werden, diesen (dann ja analogen Wert) 
auszugeben.

Was ich bisher verstanden habe hast Du etwa folgende Idee:
Eine Sinustabelle hat meinetwegen 2^16 Werte. Je schritt gehst Du nun X 
Werte weiter. Für eine Periode musst Du insgesamt 2^16 wert weitergehen 
wobei uninteressant ist, ob zwischendurch welche ausgelassen werden. 
Jetzt kannst Du also sehr fein einstellen, wie viel Frequenz Du haben 
willst. Du kannst nicht nur die Geschwindigkeit mit der Du weitergehst 
bestimmen sondern auch noch die Schrittweite. Mein Problem: es entsteht 
eine Amplitudenmodulation. Die Frequenzen müssen hier dem 
Nyquistkriterium genügen, damit eine einwandfreie Rekonstruktion möglich 
ist... Also abtastfrequenz >> Signalfrequenz*2 Und man braucht noch ein 
analoges Filter welches sich verstimmen lässt für ein optimales 
Verhalten, oder?

Ich glaub das ist mal ein echt interessantes Projekt!

Grüße,
Clemens

von Christian B. (casandro)


Lesenswert?

Nunja, erstmal kannst Du in deine Tabelle ja auch einen Rechteck 
reinschreiben, da kannst Du dann sogar einfach dein hochwertigstes Bit 
verwenden.

Klar, die Abtastfrequenz muss deutlich größer als die doppelte 
Signalfrequenz sein. Wobei besonders beim Sinus der Filter das schon gut 
rausfiltern könnte.  Man müsste nur mal ausrechnen, wie das Spektrum 
aussieht. Wenn die Linien durch die Abtastfrequenz weit genug weg sind, 
so sollte das funktionieren. Variabel muss der Filter nicht sein, da wir 
ja nur eine Frequenz ausgeben wollen.

von Clemens H. (sum)


Lesenswert?

Also das mit dem Rechteck wird wohl nicht so recht klappen. Schließlich 
hat man dann ja höhere frequenzen die nicht ordentlich mitverschoben 
werden. Das wär ja das gleiche, als PWM auf 50% stellen und den TOP-Wert 
bei jedem Überlauf ändern, so dass im Mittel die sollfrequenz rauskommt. 
Nur dann hat man ja ne FM... ich weiss zwar nicht, wie sich das auf das 
gewünschte Verhalten auswirkt, aber kann mir vorstellen, dass 10Mhz 
nicht erst nach 1sec 10Mhz sein sollen, sondern möglichst nach 
spätestens 10 perioden...

Hier könnte ein Schmitttrigger nach dem sinus helfen.

von Christian B. (casandro)


Lesenswert?

Naja, gut, beim Sinus hast Du den Vorteil, dass deine gewünschte 
Frequenz immer genau mit dabei ist, und Du nur deine Aliasing-Frequenzen 
wegbekommen musst. Solange die Frequenz jedoch viel kleiner als die 
halbe Samplingrate ist, reicht aber der Rechteck auch.

von Clemens H. (sum)


Lesenswert?

Ja, aber da liegt ja grad der Hase im Pfeffer begraben:
wir haben mit einem AVR nunmal ne maximale Samplingrate von 16Mhz. Da 
ist nicht mehr viel mit 10Mhz...
Also das mit dem Recheteck wird vermutlich schwierig.

von Christian B. (casandro)


Lesenswert?

Naja, aber man könnte ja einen Sinus mit 10 kHz ausgeben und den dann 
als Eingang für einen PLL verwenden. Direkt 10 MHz zu erzeugen ist 
natürlich utopisch.

von Clemens H. (sum)


Lesenswert?

Wie genau lässt sich den ndie pll realisieren? würde die sich nicht auch 
manchmal "verschlucken"? dann hat man ja auch keine 10Mhz mehr...

von Christian B. (casandro)


Lesenswert?

Naja, die PLL würde in Hardware gemacht. Du nimmst deinen Sinus aus 
deinem ATMega, filterst den, so dass Du wirklich nur eine Frequenz hast, 
dann machst Du daraus wieder ein Rechteck und gibst das an den Eingang 
eines XOR-Gatters. Den Ausgang Tiefpassfilterst Du dann und gibst ihn an 
den Eingang eines spannungsgesteuerten Oszillators. Dessen Ausgang 
teilst Du dann runter auf 10kHz und gibst den an den 2. Eingang des 
XOR-Gatters.
Das regelt sich dann so ein, dass die Ausgangsfrequenz des Oszillators 
genau ein Vielfaches der Eingangsfrequenz ist. Man kann dann das 
Tiefpassfilter am Ausgang des XOR-Gatters noch optimieren, so dass die 
Schaltung nicht schwingt, aber trotzdem schnell einschwingt.

von Clemens H. (sum)


Lesenswert?

Christian Berger wrote:
> Das regelt sich dann so ein, dass die Ausgangsfrequenz des Oszillators
> genau ein Vielfaches der Eingangsfrequenz ist. Man kann dann das
> Tiefpassfilter am Ausgang des XOR-Gatters noch optimieren, so dass die
> Schaltung nicht schwingt, aber trotzdem schnell einschwingt.

Da liegt ja das Problem, da es eine Regelschleife ist, die sich erst 
einschwingt, wird es nicht sehr konstant sein. also man kann nicht davon 
ausgehen, dass z.B. exakt alle 10us exakt 100 Schwingungen entstehen, 
wenn man 10Mhz einstellt.
Aber genau das zeichnet ja eine qualitativ gute Frequenzreferenz aus. 
Sonst würde die Genauigkeit eines Quarzes wohl auch ausreichen - da 
bräuchte man dann keine Rechenschaltung mit AVR und DCF...

von Christian B. (casandro)


Lesenswert?

Naja, aber Du kannst sehr gut feststellen, wann sich die Regelschleife 
eingeschwungen hat. Und dann ist die starr verbunden. Dann läuft die 
einfach hochgenau auf der richtigen Frequenz. Und das Einschwingen kann 
man in den Bereich von deutlich weniger als einer Sekunde bringen.

von Birger Z. (nohelp)


Lesenswert?

Bin auf der Suche nach gescheitem DCF77 Code auf dieses interessante 
Projekt hier gestoßen. Verstehe den ganzen Code nicht komplett auf 
Anhieb dennoch hier meine Frage zum Timer0: Muss dieser zwingend mit 625 
Hz getaktet sein oder darf's auch 1 KHz (1ms Takt) sein? In meiner 
Zielanwendung läuft T0 bereits mit 1 KHz und versorgt einen kleinen 
Scheduler. Bauen weitere Berechnungen auf diesen 625 Hz auf?

von sum (Gast)


Lesenswert?

Hallo "No Name" [hier könnte Dein Name stehen],

ich gehe fest davon aus, dass da was drauf aufbaut. Du musst u.U. auch 
noch gucken, ob der prozessor mit 1khz vielleicht überlastet ist...

Schöne Grüße,
 Clemens

von Birger Z. (nohelp)


Lesenswert?

Wie soll ich denn "ob der prozessor mit 1khz vielleicht überlastet ist" 
verstehen. Mein verwendeter ATmega16 überlebt laut Datenblatt sogar 
16000 KHz.

Schöne Grüße,
 "No Name"

von sum (Gast)


Lesenswert?

einfach kopf einschalten und statt "nohelp" lieber mal "help" rufen ;-)

von Birger Z. (nohelp)


Lesenswert?

Konstruktive Beiträge helfen bestimmt besser

von help (Gast)


Lesenswert?

Der Code muss mit 625Hz laufen. Ansonsten musst du die Filterlänge 
(Array) anpassen.
Steht auch im Kommentar irgendetwas drin zur Filterlänge.

von Birger Z. (nohelp)


Lesenswert?

Hab zwischenzeitlich etwas Erfahrung mit dem Code gesammelt. Für die 
625Hz hab ich einen weiteren Timer verwendet. Dass die Sekunden von der 
tatsächlichen Zeit abweichen, finde ich nicht so gut gelungen. Schon ein 
kleiner Frequenzdrift des Quarz sorgt nach einiger Zeit für mehr oder 
weniger großes "Weglaufen" von der realen Uhrzeit, die nicht neu 
synchronisiert wird. Vorteil des SAF ist allerdings, dass Spikes bis zu 
einem gewissen Grad herausgerechnet werden.

von nohelp (Gast)


Lesenswert?

wenn die Sekunden merklich abweichen hast du
a) einen kaputten quarz, oder
b) den quarz nicht genutzt und läufts auf dem rc-oszi, oder
c) die versorgungsspannung nicht in den spezifizierten greunzen, oder
d) den temperaturbereich verlassen, oder
--> e) den timer falsch eingestellt.
bei mir läuft die zeit ohne abweichungen und synchronisiert sich auch 
nach.

von Birger Z. (nohelp)


Lesenswert?

Mein Atmega8 hängt am Clkout-Ausgang eines MCP2515, der mit 8 MHz 
getaktet wird, Vorteiler /1. Ich hab das ganze 2mal aufgebaut, das 2te 
mal allerdings mit ATmega16. Beide Systeme entwickeln eine Abweichung, 
der eine Aufbau etwas mehr als der andere. Meiner Meinung fehlt ein 
häufigerer Abgleich mit der Softwareuhr zum Minutenanfang.

von nodenk (Gast)


Lesenswert?

Warum nur ... warum nur ... warum nur?! Das frugte sich "nohelp", oder 
nicht?

Ich würd mal darüber nachdenken, warum beide unterschiedliche 
Abweichungen haben! Aber denken muss man leider schon :(

von Birger Z. (nohelp)


Lesenswert?

Hallo und zur Info, ich bin kein blutiger Anfänger, der nicht weiss, wie 
man die Taktversorgung organisiert. Und klar dürfte sein, dass so 
ziemlich jeder Quarz eine gewisse Abweichung hat. Daher nimmt man auch 
bei bestimmten Anwendungen (z.B. im HF-Bereich) Quarzheizungen, um 
wenigstens das Thema Temperaturdrift in den Griff zu bekommen. Oder eben 
PLL.

Falls jemand einen konstruktiven Hinweis zum Quellcode hat, nur her 
damit. Denn dort liegt meiner Meinung nach noch ganz sicher ein Wurm 
drin. Ich lasse momentan als Referenz einen der beiden Mikrocontroller 
mit einer "herkömmlichen" DCF77 Software laufen, die ein wirklich 
exaktes Ergebnis liefert. Beide bekommen das selbe Empfangssignal eines 
einzigen DCF77-Moduls eingespeist.

von 900ss (900ss)


Lesenswert?

No Name schrieb:
> großes "Weglaufen" von der realen Uhrzeit, die nicht neu
> synchronisiert wird.

Dann hast du die Synchronisierung der Uhrzeit (Bits) aus dem SAF-Filter 
mit deiner SW-Uhr nicht richtig realisiert. Der Code funktioniert prima.
Der SAF-Algorithmus hier hat allerdings den Nachteil, dass er auch bei 
großen Störungen meint, er hat ein gültiges Bit erkannt, also 0 oder 1. 
Das kann nicht sein und deshalb mußt du mindestens 2 aufeinanderfolgende 
Datensätze auf konsistens prüfen ehe du den letzten dann übernimmst. Das 
ist in dem Ursprungscode auch so realisiert. Wenn du das dann selber 
änderst dann weine nicht, das der Code nicht funktioniert bzw. nicht 
synchronisiert.

Außerdem bleibt dir auch die Aufgabe auf Sekunde 0 (Minutenanfang) zu 
synchronisieren wenn du den Originalcode nicht verwendest. Sonst 
bekommst du ja auch keine gültige Uhrzeit hin.

Der SAF-Filter ist das eine Ding, einen kompletten gültigen(!) Datensatz 
aus den Bits zu generieren, dass andere. Und Fehlererkennung ist noch 
wieder etwas anderes.

Dein eigener KOMPLETTER Code dürfte auch aufschlussreich sein zum Fehler 
finden.

von Birger Z. (nohelp)


Angehängte Dateien:

Lesenswert?

Ok, dann mal hier mein Programmcode, der sich mit der Uhr beschäftigt. 
Ich hab den ursprünglichen Code kaum verändert, allerdings die vier 
Dateien zu zwei zusammengeführt. Benutze INT1 als Eingang. An anderer 
Stelle im Programm wird dcf77_timer(); im Sekundentakt aufgerufen, was 
durch einen weiteren Timer (CTC Mode) geregelt wird.

von bisschendenk (Gast)


Lesenswert?

Du hast den entscheidenden Teil leider vergessen:

No Name schrieb:
> An anderer
> Stelle im Programm wird dcf77_timer(); im Sekundentakt aufgerufen, was
> durch einen weiteren Timer (CTC Mode) geregelt wird.

Wenn was wegläuft, ist sicher das hier schuld! Und jetzt komm nicht mit 
Quarz habe Abweichung ... blablah ... da will ich erst mal Deine 
Rechnung sehen!

von Birger Z. (nohelp)


Lesenswert?

Angenommen, mein Quarz ist blöd und ich bin unfähig die Formel aus dem 
Datenblatt richtig anzuwenden, dann müsste dennoch hin und wieder ein 
Abgleich zwischen davon laufender Softwareuhr und SAF-Bitstream erfolgen 
und dies nicht nur nach 4 Minuten korrektem Empfangs zum Programmstart. 
Dass die Sekunden meist 4 Sekunden nachlaufen, ist ja schon 
prinzipbedingt. Nach Stunden und Tagen wird es aber mehr. Die Frage, wie 
ich den Timer1 für den Sekundentakt programmiert habe, ist meiner 
Meinung nach hier nicht zielführend.

von vieldenk (Gast)


Lesenswert?

Du tönst so groß rum, dass du kein Neuling bist. Warum rechnest du dir 
nicht mal aus, wie groß die Abweichung ist, wenn der Quarz 10ppm von der 
Nennfrequenz abweicht? Bei mir kommt da raus, das nach 1 Tag die Uhr 
weniger als 1 Sekunden abweicht. Aber selber rechnen kannste nicht, 
oder?
"Formel aus dem Datenblatt" klingt auch nicht gerade nach selberdenken 
sondern eher nach c&p, schäm dich!

von Birger Z. (nohelp)


Lesenswert?

So abschließend für die Quarzfraktion noch meine Timer1 Initialisierung:
1
TCCR1B  = (1<<WGM12)|0x04;
2
TCNT1  = 0;
3
OCR1A  = (F_CPU/256/1)-1;  // == 31249   F_CPU=8000000
4
TIMSK  = (1<<OCIE1A);
5
TIFR  = (1<<OCF1A);

Allerdings finde ich es schade, dass hier in der Codesammlung nicht über 
den Quellcode diskutiert werden kann, sondern eine endlose Diskussion 
über Quarze stattfindet.
Lasst's mal gut sein, werde selber weiterforschen.

von 900ss (900ss)


Lesenswert?

No Name schrieb:
> dann müsste dennoch hin und wieder ein
> Abgleich zwischen davon laufender Softwareuhr und SAF-Bitstream erfolgen

Richtig. Genau dort vermute ich dein Problem. Da du aber oben in 
deinem geposteten Code die Synchronistation nicht enthalten ist, kann 
dir da auch keiner helfen.
Probiere doch mal den Originalcode und teste ob es damit funktioniert.

Deinen eigenen Code solltest du nochmal genau prüfen. Instrumentiere 
ihn, d.h. an geeigneten Stellen Ausgaben auf ein Display/UART senden um 
zu sehen, dass deine erwarteten Werte auch wirklich da sind. Im IRQ 
besser keine Ausgaben da diese dann die Laufzeit des IRQs zu stark 
verlängern.

von Birger Z. (nohelp)


Lesenswert?

Meinste nicht auch, dass die Synchronisation innerhalb meiner 
ISR(TIMER2_COMP_vect) geschieht? Ist im Original in main()

von 900ss (900ss)


Lesenswert?

No Name schrieb:
> Meinste nicht auch,

Nein, da passiert nur die Synchronisation auf den Minutenanfang. Ob die 
bei dir aber auch funktioniert, hab ich nicht geprüft.

> dass die Synchronisation innerhalb meiner
> ISR(TIMER2_COMP_vect) geschieht? Ist im Original in main()

In der Funktion dcf77_putBit() ab "case 4:" passiert die Validierung, ob 
ein empfangener Datensatz gültig ist. Das schaue dir mal genau an. Du 
kannst dir die Variablen "u8InvalidCounter" und "u8ValidCounter" mal 
ausgeben lassen und dir die Logik anschauen die dahintersteckt. u8Status 
spiegelt wieder, ob und welcher Datensatz gültig ist. Das hast du ja 
auch in deiner eigenen neuen Routine dcf77_getTime() schon mit 
eingebaut.
Aber du hast im Moment keine Möglichkeit zu erkennen, ob überhaupt 
genügend aufeinanderfolgende gültige Datensätze erkannt werden. Das 
müssen 4 Stück sein.
Die Ausgabe der oben vorgeschlagenen Variablen ist ja nur einmal die 
Minute notwendig (also stört nicht) und dann wirst du sicher erkennen, 
warum nicht ein gültiger DCF77-Datensatz geliefert wird mit 
dcf77_getTime().

von Felix T. (felix)


Lesenswert?

Hallo Clemens

Vielen Dank für deinen Code.
Ich bin grad dabei den zu verstehen, ist aber ein bisschen tricky für 
mich.
An welcher Stelle (wahrsch. in der Hauptschleife) müsste ich denn 
ansetzen um mir z.B. im sekunden-Takt über die serielle Schnittstelle 
Stunden, Minuten und Sekunden ausgeben zu lassen. Die Ausgabe über UART 
krieg ich selber hin ;-)
Vielen Dank schon mal.

Felix

von Synchronlunch (Gast)


Lesenswert?


von erhardd (Gast)


Angehängte Dateien:

Lesenswert?

...nachdem ich die Pinbelegung geändert(c1) und die unbenutzte Var. j
entfernt habe, synchronisiert die Schaltung.
Gute Arbeit, Clemens !
Dauerte bei mir - Nähe Demmin (meck/Vorpom) allerdings mehr als 1 
Stunde.
(bei trüben Wetter, teils Regen);
Spricht aber für das Filter(und Deine gelungene Umsetzug), das sie es 
dennoch tat...
p.s.:
-das Bild kannst'e vergessen...
hab auf 4 Digit geändert, daher DP hinter Stunden;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.