DCF77: Strategie der Abtastung

OP #1248156
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?
OP #1248182
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.
#1248186
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.
Gast #1248187
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.
#1248199
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.
#1248212
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.
OP #1248214
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.
#1248222
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
#1248237
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
OP #1248241
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? ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren