Forum: FPGA, VHDL & Co. DCF77 Funkuhr in VHDL, 0. Sekundenmarkenerkennung


von klaus (Gast)


Lesenswert?

Ich habe in einem Schulprojekt die Aufgabe die 59. Sekundenmarke
zuerkennen.

Dabei habe ich folgende Vorgaben:

ENTITY dcf77SekundenMarke IS
PORT(
clk1khz:            IN std_logic;    --Abtasttakt
resn:               IN std_logic;    --Reset, aktiv low
new_data:           IN std_logic;    --neue Daten sind vorhanden
dcf77cod_filteres:  IN std_logic;    --gefiltertes Empfangssignal

sekunde0:           OUT std_logic;   --0te Sekundenmarke
);

Nun bräuchte ich eure Hilfe: Ich bin von einem Zähler ausgegangen, der
bei Zählerstand >900 das fehlen der der 59.Sekundenmarke registriert.
Nun meinte der Prof zu meinem Vorschlag, dass es doch etwas
komplizierter sei, die 0te Sekundenmarke zu setzen.

Vielen Dank für Eure Mühe
:-)

von Daniel R. (Gast)


Lesenswert?

Hallo Klaus,

das Prinzip geht so schon, jedoch kann man nicht einfach sagen, dass
ein Impuls > 900ms eine Minutenmarke ist.
Ich habs bei meiner Funkuhr(mit einem AVR) so gemacht:
Ich messe die Zeit des Impulses und vergleiche ob er größer als 990 ms
ist. Wenn er das ist, wird geprüft, ob der Sekundenzähler auf 59 liegt.
Wenn das der Fall ist, wird gewartet, bis der Impuls zu Ende ist. Dort
wird geprüft, ob der Impuls kürzer als 1010ms war. Wenn all dies
zutrifft, dann ist es eine Minutenmarke.
D.h. ich hab eine Toleranz von 20 ms und es wird geprüft, ob gerade
Sekunde 59 ist. Wenn man das weglässt und ein Störimpuls, der um die
1000 ms dauert, auftritt, kann es sein, dass auch dieser als
Minutenmarke gewertet wird. Deshalb ist die Marke nur gültig, wenn sie
in Sekunde 59 auftrat.

Ich kann leider keinen Code posten....ich hätte ja gern mal schnell
einen geschrieben, aber ich hab grad kein Synthesetool da...und
außerdem (da Du von einem Professor sprichst gehe ich davon aus, dass
Du Student bist) könntest Du Dir das auch mal selbst überlegen.
Ich mein...so schwer ist das auch nicht.
Die Funktionsweise hab ich ja schon verraten...Jetzt probierst Du mal
das in VHDL umzusetzen. Wenns gar nicht klappt bekommst Du vielleicht
meinen Code(den ich auch erst schreiben müsste).

Mal sehen, was ihr Studenten so drauf habt   ;)

Bit&Byte-Bruch

Daniel

von Klaus (Gast)


Lesenswert?

Hi Daniel,

vielen dank für deine Gedanken.
Die Programmierung dürfte ich selbst hinbekommen, ist ja nicht so, dass
ich das von jemand anderem erledigt haben möchte. Mir geht es nur um
meinen grundsätzlichen Ansatz.

Grüße Klaus

von Daniel R. (Gast)


Lesenswert?

Dann lass mal Dein Ergebnis sehen, wenn Du fertig bist    :)
Dann haben Andere eventuell auch was davon.

Daniel

von Klaus F. (kfalser)


Lesenswert?

Beim Einschalten, also beim ersten mal einsynchronisieren hast, hast Du
noch keine Information über die 59. sekunde.
Außerdem gibt es da noch die Sache mit der Schaltsekunde (sehr
selten!), bei der die Lücke an der 60. Sekunde auftritt.

Grüße
Klaus

von A.S. (Gast)


Lesenswert?

Die Schaltsekunde wird aber im gesendeten Protokoll mit angekündigt, man
kann sich also drauf vorbereiten.

von Daniel R. (Gast)


Lesenswert?

OK, beim Einschalten ist das anders. Bei mir wird dann eben der
nächstbeste 1000ms Impuls als Min-mark genommen. Danach wird ein Flag
gesetzt, welches die Überprüfung auf Sekunde 59 steuert.
Die Schaltsekunde ist auch ein gutes Beispiel für einen "Fehlimpuls".
Meine Variante wirft das Datenpaket weg und läuft intern weiter.

Wo bleibt der Code?   ;)

Daniel

von Klaus (Gast)


Lesenswert?

Hab das nun letztendlich folgendermassen realisiert:
Das Eingangssignal (dcf77cod_filteres) ist negiert. Sprich die Pulse
von 100ms und 200ms führen bei uns HI Pegel, sonst LOW Pegel.

Ich habe einen Zähler der bei einem Zählerstand >999 seinen Ausgang auf
HI setzt. Zurückgesetzt wird der Zähler entweder mit einem HI Puls
(dcf77cod_filteres) oder einem Resetknopf (resn, für das gesamte
System). Gezählt werden die positven Flanken des clk1kHZ Signals.

Der Pegel des Zählerausgangs wird in einem Flipflop
zwischengespeichert.

Das Ausgangsignal des Flipflops und das Eingangssignal
(dcf77cod_filteres) werden einem UND Gatter zugeführt.
Am Ausgang des Gatters entsteht nun eine Puls von 1ms der den genauen
Zeitpunkt der 0ten Minutmarke wiederspiegelt.

Den Code füge ich bei Gelegenheit ein.
Momentan leider keine Zeit.
Ist aber gar nicht so wild.

Grüße

von Didi (Gast)


Lesenswert?

Hallo,

hier hat schon mal jemand sowas gemacht:

http://www.i-tip.de/projectDCF/dcfDoku.html

Vielleicht für den ein oder anderen interessant.

Gruß

Didi

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.