Interrupt DCF77 + FastLED - schließt sich aus?

Hi!

Ich baue eine Uhr auf mit einem (Conrad) DCF77 Empfänger und einer Darstellung mittels zweier großer (insgesamt fast 300 LEDS) WS2812B Strips, die mit FastLED angesteuert werden.

Der Einfachheit halber verwende ich die DCF77 Library von Thijs Elenbaas.

Folgende Beobachtung:
Ich habe den Empfänger mal laufen lassen, so dass stündlich zwischen LED-Ausgabe und keiner Ausgabe (= showstopper) umgeschaltet wird. Das Ergebnis ist eindeutig:

Showstopper activated @7200008
Time is updated: 16:37:01 30 7 2017 - (2103912 minutes since last valid ticket.)
Time is updated: 16:40:00 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 16:42:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 16:44:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 16:45:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:46:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:47:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 16:48:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:51:00 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 16:52:00 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:53:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:54:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:55:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 16:56:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:57:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 16:58:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 16:59:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:00:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:01:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:03:00 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:04:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:05:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:08:01 30 7 2017 - (3 minutes since last valid ticket.)
Time is updated: 17:10:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 17:12:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 17:13:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 17:14:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:15:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:16:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 17:17:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:18:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 17:21:01 30 7 2017 - (3 minutes since last valid ticket.)
Time is updated: 17:22:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:23:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:24:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:25:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 17:26:01 30 7 2017 - (1 minutes since last valid ticket.)
Showstopper deactivated @10800001
Showstopper activated @14400010
Time is updated: 18:27:00 30 7 2017 - (60 minutes since last valid ticket.)
Time is updated: 18:28:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:29:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:32:00 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 18:33:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:35:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 18:36:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 18:37:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:38:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:39:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:40:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 18:41:00 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:44:00 30 7 2017 - (3 minutes since last valid ticket.)
Time is updated: 18:45:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:46:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 18:47:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:49:00 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:50:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:51:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 18:52:00 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:53:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 18:58:01 30 7 2017 - (5 minutes since last valid ticket.)
Time is updated: 18:59:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 19:01:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 19:03:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 19:04:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 19:05:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 19:06:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 19:07:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 19:08:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 19:09:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 19:10:00 30 7 2017 - (0 minutes since last valid ticket.)
Time is updated: 19:12:01 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 19:15:00 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 19:16:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 19:17:01 30 7 2017 - (1 minutes since last valid ticket.)
Time is updated: 19:20:00 30 7 2017 - (2 minutes since last valid ticket.)
Time is updated: 19:21:01 30 7 2017 - (1 minutes since last valid ticket.)
Showstopper deactivated @18000001
Showstopper activated @21600007
Time is updated: 20:28:01 30 7 2017 - (67 minutes since last valid ticket.)

--> Wenn FastLED schreibt, ist kein Empfang möglich. In den zwei Stunden gar nichts. Generell ist der Empfang aber nicht soo schlecht.

Vermutete Erklärung: Zwei so lange Strips zu schreiben deaktiviert den Interrupt zu lange (~8,5ms gem. der Faustformel aus dem FastLED FAQ zum Thema von 30µs/LED) und entweder gehen Flanken verloren (weil sie nicht abgeholt und behandelt werden) oder das Timing gerät so durcheinander, dass die Auswertung versagt.

Jetzt kommt meine Bitte:
Kann jemand das anhängende Sketch mit dem Pollin-Empfänger und einem Uno oder Nano oder ähnlichem testen (LEDs sind nicht erforderlich, FastLED.show() einfach ins Leere laufen lassen)? Der soll nach allem was ich hier und anderswo gelesen haben einen Lowpass Filter haben und meine Vermutung ist, dass wenn weniger Rauschen am Input-PIN ankommt, keine Flanke mehr verloren geht sondern nur ein paar ms später "ankommt", was nichts ausmachen sollte.

Die Uhr wird ohnehin auch eine RTC bekommen, Alternativ würde ich einfach Nachts die Darstellung anhalten um ein Fenster für den Empfang zu schaffen. Schöner wäre es aber natürlich, durchlaufen lassen zu können...

Danke!
Hajo

DCF77_test_withbusyFastLED.ino (5.01 KB)

--> Wenn FastLED schreibt, ist kein Empfang möglich. In den zwei Stunden gar nichts. Generell ist der Empfang aber nicht soo schlecht.

Das Signal für die WS2812 ist ein Rechteksignal mit 800 kHz und für H und L unterschiedlichen Tastverhältnis. Die Zeiten müssen auf 0,15µS genau eingehalten werden. Das kann man nur erreichen, wenn man die Ausgabe in Assembler schreibt und alle Interrupt abschaltet. Darum kann keine andere Funktion die Interrupt braucht während der Datenausgabe an die WS2812 funktionieren.

Eine Uhr braucht immer eine RTC die gegebenenfalls über DFC77 sychronisiert wird. Es wird Dir nichts übrig bleiben als wie Du sagst die Ausgabe der Zeit auf die LED anhalten und in dieser Zeit die RTC auf die DCF zu synchronisieren.

Udo Klein hat eine fehlerverzeihende DCF Routine geschrieben. Vieleicht kann diese mit den wenigen durchkommenden DCF Impulsen eine DCF Synchronisation schaffen. Vieleicht reicht die Ausgabe der Zeit für 1-2 Minuen zu stoppen (die WS2812 leuchten ja autonom weiter) und in dieser Zeit die RTC zu synchronisieren.

Grüße Uwe

Problem: Auf AVR Prozessoren sperrt FastLED Interrupts während des schreibens von clockless LEDs (unabhängig von der Anzahl der LEDs).

Lösung: Wenn möglich, nicht so oft die LEDs beschreiben.

Alternative: Ein Board mit ARM Prozessor benutzen, z.B. einen Teensy.

Alternative 2: Arduino benutzen, aber LEDs mit Clock Eingang, z.B. APA102 oder LPD8806, dann müssen Interrups nicht gesperrt werden.

Gruß,

Helmuth

Von der DCF Libarary von Udo Klein versuche ich immer noch eine Version zu bekommen, aus der Zeit bevor von einem Kristall ausgegangen wurde. Habe nur einen Resonator und möchte auch nichts anderes verbauen um in Zukunft ohne Bastelleien einen 1:1 Austausch machen zu können.

Vielen Dank für die gelisteten Alternativen, Helmuth. Die LEDs sind gesetzt (im wahrsten Sinne: In Glasbausteinen fest verbaut!) und ein paar Minuten Empfangspause (bis zum ersten gültigen Ticket) in jeder Nacht bringen mich auch noch nicht dazu, den Controller zu tauschen.

Danke!

Von der DCF Libarary von Udo Klein versuche ich immer noch eine Version zu bekommen, aus der Zeit bevor von einem Kristall ausgegangen wurde

So eine Version hat es nie gegeben.

Hallo,

die Udo Klein DCF77 Lib funktioniert auch mit Resonator statt Quarz. Ein Quarz wäre nur um Welten besser dafür. So lese ich das in seiner Readme und habe es in Erinnerung aus damaligen Threads. Probier es einfach aus.

HajoPiltz:
Die Uhr wird ohnehin auch eine RTC bekommen, ...

DS3231 als RTC ist bei mir über das Jahr so genau, daß ein Nachstellen mittels DCF77 einmal im Jahr genügen würde. Die RTC läuft immer in Winterzeit und die zusätzliche sommerliche Stunde wird für die Anzeige addiert.