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