Zitat Zitat von wkrug Beitrag anzeigen
Ich würd die Abfrage der Zeit nicht in ein 1ms Raster legen.
Egal ob nun Timer Interrupts oder Delay's.

Probier doch die Flanken deines DCF Empfängers auszuwerten.
Wenn Du die Sensing Umschalterei im Interrupt nicht magst, kannst Du ebenso 2 Interrupt Eingänge parallel schalten ( z.B. INT0 und INT1 ) und den einen auf steigende Flanke und den anderen auf fallende Flanke programmieren.
Ein Timer läuft frei - Günstig wär ein 16 Bit Timer.
Den Prescaler so einstellen, das 2 Sekunden überbrückt werden können. Eventuell einen Overflow Counter im Timer Overflow mitlaufen lassen.
Der Vorteil ist , das die Interrupts mit 2Hz aufgerufen werden.
Bei deiner Polling Methode läuft das Ganze mit 1000Hz.
Das bedeutet, Du hast keine Probleme um dein Display anzusteuern.
1ms Abtastrate ist übertrieben, 10-50ms reichen.

Das obige Programm ist im Prinzip OK, aber es muss in einem Interrupt abgetastet werden.

Das Abtasten der Flanken macht eine Menge Probleme, das reale Signal des Empfängers sieht eben nicht so schön aus, da hat es eine Menge Störimpulse drauf, besonders bei Gewittern. Mit dem Abtasten, fallen da schon eine Menge der Störimpulse raus.

Wie im obigen Programm, macht man ein Blindfenster von etwa 700ms, in welchem gar nicht abgetastet wird, dann sieht man auch die Störungen nicht und muss diese auch nicht extra behandeln. Das Blindfenster endet etwa 50ms vor der Sekunde. Die Abtastung nimmt man nur während der 300ms vor.
Beim Starten muss man aber zuerst synchronisieren. Da wird dann dauernd abgetastet, bis man einen gültigen 100ms oder 200ms Impuls eingefangen hat.

Ich habe das zu DOS-Zeiten erstmalig für den IBM-PC gemacht. Der Treiber sass da im Timertick von DOS (18.7 Hz, wenn ich mich recht erinnere) und hat dann einfach die System-Uhr korrigiert.

MfG Peter(TOO)