Forum: Mikrocontroller und Digitale Elektronik DCF77: Strategie der Abtastung


von Christian J. (elektroniker1968)


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?

von (prx) A. K. (prx)


Lesenswert?

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

von Christian J. (elektroniker1968)


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.

von (prx) A. K. (prx)


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.

von Gast (Gast)


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.

von Christian J. (elektroniker1968)


Angehängte Dateien:

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.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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.

von Christian J. (elektroniker1968)


Lesenswert?

Was meinste, kleines RC Filter am Ausgang? Tau = 50ms ?

von Sven P. (Gast)


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.

von (prx) A. K. (prx)


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.

von Christian J. (elektroniker1968)


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.

von Michael U. (amiga)


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

von Peter D. (peda)


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:
1
// ...
2
if( input_bit && !old_input_bit ){
3
//  0->1 Flanke erkannt
4
}
5
old_input_bit = input_bit;
6
// ...

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

von Christian J. (elektroniker1968)


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? ;-)

von Peter D. (peda)


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

von Jochen K. (jkunz)


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"

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.