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)
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.
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.
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.
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
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.
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.
Ralph S. schrieb: > das Dekodieren in Echtzeit werde ich > wohl machen. gibt es schon https://www.youtube.com/watch?v=f_qMfuUxgJ8 http://www.afug-info.de/Schaltungen-Eigenbau/DCF77/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.