www.mikrocontroller.net

Forum: Codesammlung DCF77 Uhr, zum X.ten Mal, jetzt mit SAF

Autor: Clemens Helfmeier (sum)
Datum:
Angehängte Dateien:

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
Autor: Neubert Uwe (Gast)
Datum:

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!
Autor: Simon K. (simon) Benutzerseite
Datum:

Grummel, schon wieder so einer mit Unix-codiertem Zeilenende.
Autor: uwegw (Gast)
Datum:

Grummel, schon wieder so einer mit Notepad...
Tipp: auf Notepad2 umstellen:
http://www.flos-freeware.ch/notepad2.html
Autor: Neubert Uwe (Gast)
Datum:

Hä? Was willst du mit dem Zeilenende? Meinst du meine Postings?
Autor: duundich (Gast)
Datum:

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.
Autor: Simon K. (simon) Benutzerseite
Datum:

>>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.
Autor: Peter Dannegger (peda)
Datum:

"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
Autor: Mighty (Gast)
Datum:

@Simon Küppers
Unter Unix (bzw. sogut wie jedem OS ausser Windows) nur LF (0x0A).
Autor: Hobbylöt (Gast)
Datum:

"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!
Autor: oli (Gast)
Datum:

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
Autor: Hobbylöt (Gast)
Datum:

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
Autor: Clemens Helfmeier (sum)
Datum:
Angehängte Dateien:

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
Autor: Läubi (Gast)
Datum:

Kannst du den Wecker mal nenen? Wäre bestimmt interesant, da ein solches
Modul neu bei Reichelt 14 Euro kostet!
Autor: Hobbylöt (Gast)
Datum:

Bei ELV:

DCF-Empfangsmodul mit 77,5-kHz-Empfangsantenne, abgeglichen, inkl.
Beiblatt
Artikel-Nr.: 68-352-62
9,95 Teuro
Autor: Benedikt (Gast)
Datum:

>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 !
Autor: Peter Dannegger (peda)
Datum:

@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
Autor: Peter Dannegger (peda)
Datum:

@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
Autor: Clemens Helfmeier (sum)
Datum:

@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
Autor: Neubert Uwe (Gast)
Datum:

Hat keiner mal irgendwo einen Code in Bascom zur DCF Auswertung gesehen?
Gruss, uwe!
Autor: duundich (Gast)
Datum:

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?
Autor: Mirko (Gast)
Datum:

Schau mal unter diesem Link

http://www.mcselec.com/index.php?option=com_conten...

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

Gruss Mirko
Autor: Jupp (Gast)
Datum:

Hallo DCF-Freaks,

habe letztens bei Conrad DCF77_Funkwecker für 3 Euro gesehen.
Autor: Fried Vissel (tich)
Datum:

@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
Autor: Clemens Helfmeier (sum)
Datum:

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
Autor: rfr (Gast)
Datum:

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
Autor: Wolfgang Horn (Gast)
Datum:

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
Autor: Falk (Gast)
Datum:

@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
Autor: Fried Vissel (tich)
Datum:

@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
Autor: Clemens Helfmeier (sum)
Datum:

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
Autor: Fried Vissel (tich)
Datum:

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
Autor: Christian Berger (casandro)
Datum:

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.
Autor: Clemens Helfmeier (sum)
Datum:

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
Autor: Christian Berger (casandro)
Datum:

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.
Autor: Clemens Helfmeier (sum)
Datum:

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.
Autor: Christian Berger (casandro)
Datum:

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.
Autor: Clemens Helfmeier (sum)
Datum:

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
Autor: Christian Berger (casandro)
Datum:

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.
Autor: Clemens Helfmeier (sum)
Datum:

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.
Autor: Christian Berger (casandro)
Datum:

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.
Autor: Clemens Helfmeier (sum)
Datum:

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.
Autor: Christian Berger (casandro)
Datum:

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.
Autor: Clemens Helfmeier (sum)
Datum:

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...
Autor: Christian Berger (casandro)
Datum:

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.
Autor: Clemens Helfmeier (sum)
Datum:

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...
Autor: Christian Berger (casandro)
Datum:

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.
Autor: No Name (nohelp)
Datum:

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?
Autor: sum (Gast)
Datum:

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
Autor: No Name (nohelp)
Datum:

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"
Autor: sum (Gast)
Datum:

einfach kopf einschalten und statt "nohelp" lieber mal "help" rufen ;-)
Autor: No Name (nohelp)
Datum:

Konstruktive Beiträge helfen bestimmt besser
Autor: help (Gast)
Datum:

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

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.
Autor: nohelp (Gast)
Datum:

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.
Autor: No Name (nohelp)
Datum:

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.
Autor: nodenk (Gast)
Datum:

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 :(
Autor: No Name (nohelp)
Datum:

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.
Autor: 900ss D. (900ss)
Datum:

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.
Autor: No Name (nohelp)
Datum:
Angehängte Dateien:

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.
Autor: bisschendenk (Gast)
Datum:

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!
Autor: No Name (nohelp)
Datum:

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.
Autor: vieldenk (Gast)
Datum:

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!
Autor: No Name (nohelp)
Datum:

So abschließend für die Quarzfraktion noch meine Timer1 Initialisierung:
TCCR1B  = (1<<WGM12)|0x04;
TCNT1  = 0;
OCR1A  = (F_CPU/256/1)-1;  // == 31249   F_CPU=8000000
TIMSK  = (1<<OCIE1A);
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.
Autor: 900ss D. (900ss)
Datum:

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.
Autor: No Name (nohelp)
Datum:

Meinste nicht auch, dass die Synchronisation innerhalb meiner
ISR(TIMER2_COMP_vect) geschieht? Ist im Original in main()
Autor: 900ss D. (900ss)
Datum:

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().
Autor: Felix Tischer (felix)
Datum:

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
Autor: Synchronlunch (Gast)
Datum:

Autor: erhardd (Gast)
Datum:
Angehängte Dateien:
  • c1.zip (70,4 KB, 29 Downloads)

...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;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net