mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DCF77: Strategie der Abtastung


Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Thema war hier sicherlich schon oft aber ich möchte die Soft selbst 
schreiben, weil mir manche Codes zu verschnörkelt und mit anderen 
Codeteilen verworben sind. Mein Conrad Modul blinkt munter vor sich hin 
nachdem ich eine LED angebaut habe und scheint zu funktionieren.

Leider gehen die EXT INT Pins meines LPC2368 allesamt für die SD karte 
drauf, daher kann ich keine ext. IRQ nutzen. Die Vierfachbelegeung der 
Pins hat leider ihre Nachteile.

Wie ich das übliche Vorgehen bei der Decodierung? 2 Minuten den Rechner 
nur das machen lassen oder on-the-fly? Meiner Einschätzung nach braucht 
man maximal 2 Minuten:

1. Warten auf den Gap bei 0s
2. Decodieren der Zeitinfo innerhalb einer Minute

Möglichkeit 1:

Capture IRQ steigende Flanke: Timer los
Capture IRQ fallende Flanke: Timer stop und Bit auswerten
Bits zu Bytes zusammenbauen und Zeit Struct damit füllen.
Statemachine weiterschalten
Bei 0s Gap die Uhr einstellen

Uhr jede Stunde einmal stellen

Möglichkeit 2:

Timer IRQ alle 10ms: Samplen des Pegels und Low/Hi Zeitdauer ermitteln.

Wie habt ihrs gemacht?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flanke ist ungut, da je nach Empfänger und Signal die Flanke auch mal 
kurz "wackeln" kann. Gemächliches Abtasten ist deshalb einfacher.

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst Du mit "wackeln"? Wenn das Signal nicht durchgehend sauber 
ist, ist das eh für die Tonne. Mein alter DCF hatte pieksaubere Flanken.

Also 10ms Timer, der immer mal wieder abtastet und dann zusammenzählt 
wieviele Hi/Lo da waren, das wäre eine gute Mittelung. Laut Spec ist 
eine 0 100ms und eine 1 200ms. Toleranzen kenne ich bisher nicht.

Oder halt 150ms nach fallender Flanke Pegel nachschauen, fertig.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dem Teil von Pollin habe (nicht nur) ich auf einer der Flanken schon 
mal einen kleinen Sägezahn draufmoduliert gesehen. War glaube ich mit 
der Signalfrequenz 77,5KHz. Ist bei Abtastung völlig unproblematisch, 
aber bei Flankentriggerung und der kleinen Hysterese der AVRs etwas 
unpraktisch.

So, und jetzt kannst du gern auf den Teil rumhacken. Weil von Pollin, 
weil aus China, weil zu billig, ... Egal. Das Dings funktioniert.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sauberes Signal hin oder her, wenn es mal wackelt haut es den Prozessor 
mit vielen Interrupts zu. Ob man das möchte bezweifel ich jetzt mal.

Ich polle auch ganz nach Schema, allerdings mit einer zusätzlichen 
Minute die ausgewertet wird und verlgiecht ob die letzte Minute auch 
eine Minute her ist. Das ist aber bei deinem Empfänger mit pieksauberen 
Flanken vlt auch niht nötig.

Autor: Christian J. (elektroniker1968)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Schauts aber gscheit aus für das 9€ Teil von Conrad. dafür habe ich 1990 
mal eine ganze Platine voller Spulen und Transistoren gebaut aus der 
ELO. Heute nur ein Chip.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep, zwei aufeinander folgende Minuten zu vergleichen ist sehr zu 
empfehlen. Ist nicht nur der Empfänger für das Signal verantwortlich, 
sondern auch Position und Umgebung. Wenn er deshalb bei Minuten :59 zu 
:00 eine auslässt brennt ja nix an.

Auch die Parity auszuwerten kann nicht schaden.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:

> Schauts aber gscheit aus für das 9€ Teil von Conrad

Mit dieser Zeitauflösung schaut das Dings von Pollin auch sauber aus. 
Erst wenn man in die Flanke erheblich dichter reingeht fällt das auf.

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinste, kleines RC Filter am Ausgang? Tau = 50ms ?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pack den DCF-Empfänger in irgendeinen Timer rein, der gerade läuft, und 
dabei alle 10ms oder so überläuft.
Mit Flanken und Interrupts ist das alles Murks da unberechenbar.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Filter wäre möglich, wobei ein C wohl reichen würde, denn für den R 
sorgt der offiziell nur 5µA liefernde Ausgang des Pollin-Moduls schon 
selber.

Aber: wozu? Soll er wackeln. Ich taste mit besagten 10ms ab und das 
funktioniert. Dazu kommt, dass ich in einer Anwendung aus historischen 
Gründen auf dem Pin zwei Informationen drauf habe, sowohl das später 
hinzu gefügte DCF Signal als auch einen Taster und die per Pegel also 
ADC unterscheide.

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das ist das Conrad teil, da habe ich einen 22k PU nach Vcc geschaltet, 
hat einen OC Ausgang. Naja, vielleicht spendiere ich ja noch mal 50nf am 
Ausgang.

Da das ganze aber nebenbei laufen soll brauche ich schon IRQs und im IRQ 
eine Statemachine.

Und wie trennt man die Bits voneinander, wenn eine ISR alle 10ms kommt? 
Die kann ja nur Pegel zählen aber man hat keine Synchronisation auf eine 
Flanke.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

alle 10ms abtasten. Bei erkenntem H (nehme ich jetzt mal als aktiven 
Zustand an) Zähler erhöhen. Bei L 10ms-Zählerstand auswerten und Zähler 
erhöhen.

Bei mir z.Z.:
 Zähler > 250 (2,5s) kein Impuls erkannt -> Ende
 Zähler > 195 oder < 6 zu lang oder Spike -> Ende
 Zähler > 177 Minute rum, Flag setzen, 100 abziehen (für die fehlende 
Sekunde bei 59)

 Zähler > 95 oder < 78 ungültige Länge -> Ende
 Zähler > 87 Bit ist 1, sonst Bit ist 0, merken

Zähler auf 0, wenn Minutenflag gesetzt: waren es 59 Impulse?
Wenn nein -> Ende, sonst auswerten (Parity) und wenn güötig, Zeit 
setzen.

-> Ende Zähler zurpcksetzen und von von vorn.

Es fallen hier zwar diverse Pakete wegen Störungen raus, fehlerhaft 
synconisiert hat er aber bisher noch nicht.

Gruß aus Berlin
Michael

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> Und wie trennt man die Bits voneinander, wenn eine ISR alle 10ms kommt?
> Die kann ja nur Pegel zählen aber man hat keine Synchronisation auf eine
> Flanke.

Dann nimm halt ne Variable:
// ...
if( input_bit && !old_input_bit ){
//  0->1 Flanke erkannt
}
old_input_bit = input_bit;
// ...

Keine Angst, Dein 32Bit-Superbolide schafft die wahnsinns 1Baud 
Datenrate bequem nebenbei, schafft ja spielend ein 8Bitter:

Beitrag "DCF77 Uhr in C mit ATtiny26"


Peter

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

danke habs mir mal ausgedruckt! Also, habe das Signal mal um den 
Triggerpunkt stark vergrössert angeschaut. Das sind keine Spikes. Was 
aber auch viellicht daran liegt, dass die Slew rate extrem langsam ist, 
nämlich 1V/0,1ms. Da scheint intern schon ein Filter vorzusitzen. Oder 
weil ich im 3.ten Stock im Grünen wohne. Habe es mal testweise auf einen 
Ext Interrupt des PIC Boards gelegt, da wird genau ein INT pro Sekunde 
ausgelöst.

Ich werde aber die Timerlösung von Micha wohl nehmen, danke nochmal !

@Peter, Du meinst als ich kann ihn von 80Mhz derzeit mit Instruktiontime 
12,5ns runter drehen auf zB 12 Mhz? ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> @Peter, Du meinst als ich kann ihn von 80Mhz derzeit mit Instruktiontime
> 12,5ns runter drehen auf zB 12 Mhz? ;-)

Wenn Dir eine CPU-Belastung von ~0,1% nicht zu hoch ist, ja.


Peter

Autor: Jochen Kunz (jkunz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:

> Timer IRQ alle 10ms: Samplen des Pegels und Low/Hi Zeitdauer ermitteln.
>
> Wie habt ihrs gemacht?
Abtasten mit 100 Hz. Ist einfacher als ständig an den Timern 
rumzupfriemeln. Siehe mein Beispiel, das ich vorhin in die Codesammlung 
eingestellt habe: Beitrag "DCF 77"

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]
  • [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.