Forum: Mikrocontroller und Digitale Elektronik Nochmal DCF-77 und AVR


von A. Arndt (Gast)


Lesenswert?

Hallo,

ich suche noch immer eine Lösung zur Anzeige des DCF-77-Signals mittels 
LCD und AVR.

Eine Lösung in Basic wäre schön zur Übersicht, ich habe mir schon viele 
Artikel durchgelsen, weiss aber trotzdem nicht, wie ich mit 
Entschlüsselung anfangen soll, mit Zählern, Timer und Oszillatoren, mit 
diesem 25ms Signal usw. in der Theorie ja ganz leicht, aber mir fehlt 
der Startschuss. Evtl. gibt es ja heute schon andere Lösungen und 
Erfahrungen, ich hoffe auf Eure Mitarbeit.

Ich nutze das Empfangsmodul mit Antenne von Conrad, die kleine Platine.

Hier mal ein guter Link zu einer Funk-Uhr-Seite...
http://www.heret.de/funkuhr/index.htm
hat mir aber auch sehr viel weiter geholfen.

Gruss
A. Arndt

von Peter D. (peda)


Lesenswert?


von Dieter Brüggemann (Gast)


Lesenswert?

Hallo

Wo hängst du denn genau fest ??  Beim erkennen der Signale 0,1 oder 0,2 
Sekunden, dem Startzeichen oder bei der Auswertung ??

MFG
Dieter

von A. Arndt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

habe mal ein fertiges Programm genommen, aber habe nur ein 1-sec-Blinken 
und eine Pause nach 59 Sek..

Ich habe auch nicht den Plan von diesen Geschichten wie z.B. Timer und 
Oszillator.

Ich denke mir das mal :

Ich nehme einen Oszillator, der macht immer 25ms Takte und da wird 
geschaut welche Bits im Signal sind und wielange der Zustand bleibt und 
dann wird dekodiert.

Gruss
A. Arndt

von Dieter Brüggemann (Gast)


Lesenswert?

Hallo A. Arndt

Das Problem bei fertigen Programmen ist halt, daß man nur sehr schwer 
nachvollziehen kann, was abgeht. Gerade wenn die Grundlagen fehlen ( 
Timer, Interrupts ) ist das fast unmöglich, hinter den Sinn des 
Programms zu kommen.

Fang doch erstmal langsam an. Schritt für Schritt, dann lernst du eine 
Menge dabei.

Erster Schritt:

Das DCF Signal sendet ja jede Sekunde ein Bit

0,1 Sekunden High = low
0,2 Sekunden high = high
1,8 Sekunden low = Start

Wenn du jetzt einen Interrupt mit einem Timer aufbaust, der alle 10 ms 
das Signal testet, ob es high oder low ist und dabei entsprechenden eine 
Variable mizählst, hast du sehr schnell die Infos, die du haben willst.
So erhälst du z.B.: bei LOW einen Wert zwischen ungefähr 8 und 12 in der 
Variablen und bei HIGH 18 bis 22. Die Zeiten haben halt Toleranzen und 
du weißt ja nicht genau, wann der Zustand abgefragt wird.

Ein Interrupt ist nur eine Unterbrechung deines laufendes Programm, bei 
dem ein bestimmter Code ausgeführt wird. Danach läuft dein normales 
Porgramm weiter.

So long

MFG
Dieter

von A. Arndt (Gast)


Lesenswert?

Hallo,

Dieter,

vielen Dank für Deine Starthilfe, ich werde mich jetzt da mal 
reinarbeiten, habe auch die Grundlagen studiert, welche Daten wo 
abgelegt sind, Minute usw., mit dem berühmten Kreismodell.
Timer setzen mit Teiler auf 10ms ist auch kein Thema.
Wenn ich mit Interrupts arbeite kann es doch aber zu Störungen mit 
anderen Abfragen kommen, z.B. beim DS1820.

Aber ich werde mich erstmal auf die DCF-Geschichte stürze, es kann ja 
jeder AVR mit INT0 ausführen. Schön wäre das natürlich, wenn ein Chip 
die Daten bereithält, und andere AVRs daraufzugreifen können, z.B. 
I2C-RTC oder RS-485.

Eigentlich müsste ich doch nur eine interne Zeit über Zähler und Timer 
mitlaufen lassen und diese z.B. alle 10 Minuten neu stellen. Wenn ich 
dann mit der Uhr herumlaufe und mal keinen Empfang habe läuft sie doch 
weiter.

Trotzdem vielen herzlichen Dank für die Infos...

Gruss
A. Arndt

von Peter D. (peda)


Lesenswert?

Das mit dem DS1820 ist ein wichtiger Punkt, der leider oft unter den 
Tisch gekehrt wird. "Unerklärliche" Fehler sind dann die Folge.

Deshalb will ich das näher erläutern:


1.
DS1820 Reset-Impuls: 480...960µs:

Wenn Dein Interrupthandler also weniger als 480µs dauert, werden die max 
960µs eingehalten und Du brauchst keine Interrupts zu sperren.


2.
DS1820 Presence detect 15...60µs:

15µs sind etwas wenig für einen Ineterrupthandler, deshalb sollte  bis 
zum Presence-Detect der Interrupt gesperrt werden.

Da Dein Interrupt nur alle 10ms kommt, ist eine Verzögerung um max 60µs 
kein Problem. Zumal der Timer ja weiterläuft, d.h. beim nächsten 
Interrupt hohlst Du die Zeit wieder auf.


3.
DS1820 Datenbit lesen bzw. schreiben 60µs:

Es gilt das gleiche, wie beim Presence Detect, d.h. Du must die 
Interrupts sperren (für max 60µs)


4.
Zusammenfassung:
Der DS1820 und der Timerinterrupt kommen sich also nicht in die Quere, 
wenn Du, wie beschrieben, während der kritischen Zeiten die Interrupts 
sperrst.

Vorausgesetzt, Dein DS1820-Treiber ist keine Black-Box und Du kannst an 
den entsprechenden Stellen im Kode "CLI" und "SEI" einfügen.

Bei weiteren Interruptquellen oder zeitabhängigen Routinen mußt Du diese 
Betrachtungen natürlich wiederholen.


Peter


P.S.:
Kann sein, daß mein Kode nicht gerade gut für Anfänger zu verstehen ist. 
Aber wenn Du keine Fragen dazu stellst, kann ich auch nichts näher 
erklären.

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.