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?
Flanke ist ungut, da je nach Empfänger und Signal die Flanke auch mal kurz "wackeln" kann. Gemächliches Abtasten ist deshalb einfacher.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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? ;-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.