Forum: Projekte & Code DCF77, die 1000ste Version


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Nachdem ich jetzt auch einmal mit einem Funkuhrenmodul hantiert habe, 
möchte ich hier den Code einstellen (für denjenigen, der das erste mal 
damit hantiert).

Mache ich deshalb, weil es zig Varianten für Arduino gibt, aber relativ 
wenig für reines C.

Im Zip-File sind 2 Varianten enthalten:

- Funkuhr mit OLED-Display (SPI)
- Funkuhr mit UART-Ausgabe und Ausgabe auf einer charliegeplexten 
LED-Anzeige. Anzeige auf den LED's erfolgt im BCD-Format.

Im Makefile (ist für Linux) muß unter PROJECT_NR angegeben werden, für 
welche Variante ein Funkuhrenprogramm erstellt werden soll.

In der Variante für OLED ist ein SPI-Display eingetragen. Soll für ein 
I2C-Display übersetzt werden, so ist die Datei "tftmono.h" zu editieren 
(die Einstellungen sollten hier selbsterklärend sein).

Für denjenigen der das Ausprobieren möchte: Viel Spaß.

Für alle Nörgler, die mir wahrscheinlich schon aufgrund dessen dass 
jjflash / Ralph das veröffentlicht, schon gleich auf "nicht lesenswert" 
klicken: Auch Euch viel Spaß dabei.

PS: ich weiß, dass das Steuern nur über den Timerinterrupt zur 
Auswertung des DCF-Telegramms suboptimal ist, eine Auswertung mittels 
Pinchange-Interrupt und Timer wäre wohl besser. Allerdings soll das 
Programm auch mal auf einem Chip laufen, der weder einen ext. Int noch 
einen PC-Int hat. Das Einlesen der einzelnen Bits in ein 60 Byte großes 
Array könnte platzsparender sein, wenn man die einzelnen Bits in 2 
uint32_t Variablen speichern würde (das ändere ich evtl. noch)

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

... mist, die ZIP-Datei vergessen !

von Peter D. (peda)


Lesenswert?

Ralph S. schrieb:
> Mache ich deshalb, weil es zig Varianten für Arduino gibt, aber relativ
> wenig für reines C.

Z.B.:
Beitrag "DCF77 Uhr in C mit ATtiny26"

Ralph S. schrieb:
> ich weiß, dass das Steuern nur über den Timerinterrupt zur
> Auswertung des DCF-Telegramms suboptimal ist

Nö, sie ist deutlich störtoleranter als mit externem Interrupt. Und die 
exakte ms benötigt man auch nur selten.
Ich finde aber keine interne Uhr für Empfangsstörungen und keine 
Fehlerüberprüfung.

Ralph S. schrieb:
> Das Einlesen der einzelnen Bits in ein 60 Byte großes
> Array könnte platzsparender sein

Wozu speicherst Du sie denn überhaupt?
Das Dekodieren geht doch völlig problemlos in knallharter Echtzeit 
(1Baud/s). Ich benutze dazu einfach eine Tabelle (Speicherindex + 
Bitwertigkeit).

Warum machst Du überhaupt 2 Dekodierroutinen?
Es ist übersichtlicher, wenn man das Dekodieren und Ausgeben voneinander 
trennt.

von Ralph S. (jjflash)


Lesenswert?

Peter D. schrieb:
> Z.B.:
> Beitrag "DCF77 Uhr in C mit ATtiny26"

... das hatte ich schlicht nicht gefunden gehabt. Weil ich Programme von 
dir schon gesehen habe gehe ich schlicht davon aus, dass Dein Programm 
schlichtweg gut ist.

Ich wollte meines erst einmal einfach nur laufen sehen. Wenn meinen 
Deinen Thread liest werde ich wohl noch ein Problem damit bekommen, eine 
DOT-Matrix Anzeige anzuschließen, die über einen MAX7219 betrieben wird.

Peter D. schrieb:
> Wozu speicherst Du sie denn überhaupt?
> Das Dekodieren geht doch völlig problemlos in knallharter Echtzeit
> (1Baud/s).

Wenn man sich mal in etwas verrannt hat! Werde ich doch glatt versuchen!

Peter D. schrieb:
> Ich finde aber keine interne Uhr für Empfangsstörungen und keine
> Fehlerüberprüfung.

Ursprünglich wollte ich sogar nur eine interne Uhr verwenden, die im 2 
Stunden-Intervall synchronisiert wird. Dann hab ich festgestellt, dass 
die Anzeige jedes empfangenen Telegramms auch funktioniert und nur die 
Sekunden softwareseitig gezählt werden.

Ich werde alles nochmal überdenken, das Dekodieren in Echtzeit werde ich 
wohl machen.

von Bauform B. (bauformb)


Lesenswert?

Ralph S. schrieb:
> Das Einlesen der einzelnen Bits in ein 60 Byte großes
> Array könnte platzsparender sein, wenn man die einzelnen Bits in 2
> uint32_t Variablen speichern würde

Es soll doch ausdrücklich ein C Programm sein, also nimmt man natürlich 
uint64_t. Ideal wäre uint60_t, gibt's sowas eigentlich? Nicht um Platz 
zu sparen, aber man möchte ja später mal die empfangene Minute mit der 
lokalen Minute vergleichen. Oder man sucht nicht die Minutenmarke, 
sondern synchronisiert, indem man jede Minute mit der vorigen 
vergleicht.

Peter D. schrieb:
> Ich finde aber keine interne Uhr für Empfangsstörungen und keine
> Fehlerüberprüfung.

Eigentlich geht's hier ja um Display-Ansteuerung und zwecks Demo hätte 
man auch Temperatur und Luftdruck statt DCF-Zeit nehmen können.

von Thilo L. (bc107)


Lesenswert?

Also, egal, wie Jemandes Code ausschaut, und egal, ob diese Aufgabe 
schon 1000mal gelöst wurde, ich finde es immer wieder schön, ein Foto 
von einem letztendlich funktionierenden Projekt zu sehen! Sehr schön!

Zu den Interrupts: aus eigener Erfahrung (ich zähle zu den anderen 1000 
DCF77-Implementierern :-) kann ich nur von direkter Flankentriggerung 
eines Interrupts durch den DCF77-Pin Change abraten: viel zu 
fehleranfällig. Ich habe einen 1ms-Timer-Interrupt genommen, mit dem ich 
das DCF-Signal sample, dann einen Mittelwert bilde, und dann erst 
überlege, was ich da gerade empfangen habe. Das bringt zwar einige ms 
Zeitversatz zwischen Anzeige und empfangenem Signal, aber darauf kommt 
es in den allermeisten Fällen nicht an.

Viel Spaß mit Deiner Uhr!!!

-- Thilo

: Bearbeitet durch User
von temp (Gast)


Lesenswert?

Thilo L. schrieb:
> Zu den Interrupts: aus eigener Erfahrung (ich zähle zu den anderen 1000
> DCF77-Implementierern :-) kann ich nur von direkter Flankentriggerung
> eines Interrupts durch den DCF77-Pin Change abraten

Dem kann ich 100% ig zustimmen. Man sieht diesen Blödsinn aber immer 
wieder. Noch schlimmer ist es bei 433MHz oder 868MHz Decodern wo auch 
diverse Libs mit Flankeninterrupts arbeiten. Da muss man sich fragen ob 
sich die Leute  jemals die Ausgangssignale der Empfängermodule mit einem 
Oszi angesehen haben. Die gängigen DCF77 Empfänger sind da auch nicht 
besser.

von Ralph S. (jjflash)


Lesenswert?

Bauform B. schrieb:
> Eigentlich geht's hier ja um Display-Ansteuerung und zwecks Demo hätte
> man auch Temperatur und Luftdruck statt DCF-Zeit nehmen können.

na ja ... eigentlich geht es schon um die Uhr !

Die Displayroutinen habe ich vor langer Zeit schon gemacht. Ein Programm 
mit RTC und einem BME680 hab ich auch gemacht. Jetzt werde ich den 
BME680 eben mit der Funkuhr kombinieren. Wahrscheinlich wird es so 
werden, dass ich die RTC über die Funkuhr stellen werde.

von 1001ste Antwort (Gast)


Lesenswert?


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.