mikrocontroller.net

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


Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
:-)

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel R. (Gast)
Datum:

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

Daniel

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.S. (Gast)
Datum:

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

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Didi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.