Forum: Mikrocontroller und Digitale Elektronik DCF77 nicht an Interrupt Pin? (ARDUINO / AVR)


von Stefan A. (ripper121)


Lesenswert?

Guten Abend,
ich wollte gern wissen ob ich DCF77 Empfänger immer an einem Interrupt 
Pin betreiben kann oder ob es auch über jeden anderen Pin gehen kann.

Hier mein der Code und die Lib die ich verwende.
https://docs.google.com/file/d/0B8CnI1PuBigbRndmc3BoZ1U5NnM/edit?usp=sharing

An Pin 2 + 3 läuft er aber an allen anderen nicht.

von SuperD (Gast)


Lesenswert?

Diese Lib geht nur mit Interruptfähigen Pins. Bei besseren 
Mikrocontrollern sind alle GPIOs interruptfähig, bei den billigen 
Hobbycontrollern nur einige wenige.

von Stefan A. (ripper121)


Lesenswert?

Habe arduino uno r3, heißt das jetzt das ich nur Pin 2 und 3 nutzen 
kann?

von Marc Rupprath (Gast)


Lesenswert?

Hallo;
wenn du die lib so wie sie ist, vermutlich.

Aber, du kannst ja auch eine andere Art der Auswertung verwenden, nicht 
unbedingt interuptbasiert, nur eine idee.

von Stefan A. (ripper121)


Lesenswert?

Gibt es da schon was fertiges?

von Peter D. (peda)


Lesenswert?

DCF-77 sendet ja mit ner wahnsinns Datenrate von 1bit/s, da brauchts 
keinen Interruptpin.
Im Gegenteil, ohne Interruptpin ist die Auswertung sogar deutlich 
einfacher.
Einfach mit Timerinterrupt 10ms die Zeit bis zur nächsten Flanke 
abzählen, dazu reicht ein Byte als Zähler aus.

von Michael (Gast)


Lesenswert?

SuperD schrieb:
> ... bei den billigen Hobbycontrollern nur einige wenige.

Du glaubst doch nicht ernsthaft, das irgendein Prozessorhersteller extra 
für den Hobbybereich einen Prozessor designet?

von Johannes O. (jojo_2)


Lesenswert?

Ein DCF77 Empfänger gehört NICHT an einen Interrupt Pin. Sofern das 
irgendeine Lib verlangt, würde ich sie nicht benutzen weil der 
Programmierer dann vermutlich nicht sehr fähig war.

Das Signal ist so langsam das kann man direkt ablesen und dekodieren. 
Außerdem ist es nicht so optimal nur auf die Flankenwechsel zu schauen. 
Da gibts sinnvollere Methoden wie Faltung usw.
Schwieriger zu implementieren, aber besser im Betrieb!

von Stefan A. (ripper121)


Lesenswert?

Wenn es doch ach so leicht geht wieso gibt es dann für Avr und arduino 
noch keine solche Lösung?

von c-hater (Gast)


Lesenswert?

Peter Dannegger schrieb:

> DCF-77 sendet ja mit ner wahnsinns Datenrate von 1bit/s, da brauchts
> keinen Interruptpin.

Unbedingt brauchen tut man keinen, das ist wahr.

> Im Gegenteil, ohne Interruptpin ist die Auswertung sogar deutlich
> einfacher.

Das allerdings ist Unsinn. Wenn man den ICP-Int verwendet, ist die 
Auswertung ganz genauso einfach.

> Einfach mit Timerinterrupt 10ms die Zeit bis zur nächsten Flanke
> abzählen, dazu reicht ein Byte als Zähler aus.

Siehste, den Solms kann man sich dann nämlich schon sparen. Statt des 
nutzlosen Rechenzeitverbrauchs von hundert ISRs/s hat man mit der 
ICP-Variante nämlich bloß durchschnittlich knapp zwei. Also weniger als 
2% des Rechenzeitverbrauchs der Variante mit Timerüberläufen. Der 
Unterschied kann schon durchaus wichtig sein. Jedenfalls wenn der 
Controller auch noch was anderes machen soll, als nur den DCF-Empfang.

von Peter R. (peterfido)


Lesenswert?

Dafür bremst dann schlechter Empfang das Teil stark aus. Für DCF-Empfang 
reicht ein Timer, welcher 4mal in der Sekunde den Pegel checkt. Hat man 
mehr Reserven, kann man die Frequenz erhöhen und so schlechten Empfang 
detektieren und berücksichtigen.

Der Vorteil beim Timer ist, das man vorher schon weiß, wie oft dessen 
Routine durchlaufen wird.

Gibt es noch mehr zu tun, kann man nach (sichergestelltem) erfolgreichem 
Empfang für einige Stunden den Takt auf 1Hz ändern. Ist diese Frequenz 
recht genau, reicht es, wenn erst wieder von 01:58 bis 02:02 und von 
02:58 bis 03:02 die interne Zeit abgeglichen wird. Wertet man das Datum 
aus und baut die Sommer-/ Winterzeitregeln mit ein, reicht 1 
Zeitkontrolle / - Einstellung pro Tag.

Meine DCF-Uhren haben einmal pro Stunde die Zeit abgeglichen. Seitdem 
ich "überall" RaspPis verwende, stellen diese ihre Uhrzeit per NTP über 
den Router. Mein Radiowecker nutzt beides, falls das Internet mal 
ausfällt.

von c-hater (Gast)


Lesenswert?

Peter R. schrieb:

> Dafür bremst dann schlechter Empfang das Teil stark aus.

Tatsächlich?

Nach meiner Beobachtung liefern die üblichen DCF77-Empfänger bei 
schlechtem Empfang, egal ob durch zu geringe Feldstärke oder zu starke 
Störungen einfach garkeine Pegelwechsel mehr. Wo nix wackelt, da kein 
ISR-Aufruf...

Aber es wird möglicherweise einen Übergangsbereich geben (auch wenn es 
mir nie gelungen ist, den zu erreichen), in dem vielleicht der Träger 
durchdringt. Gegen solche Situation hilft der "noise canceller", den ICP 
in Hardware bereitstellt und eine sinnvolle Auswertelogik, die dann 
einfach den Kram temporär deaktiviert.

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Das allerdings ist Unsinn. Wenn man den ICP-Int verwendet, ist die
> Auswertung ganz genauso einfach.

Nö ist umständlicher. Du hast mehr Code, da Du sämtliche 
Impulszeitrechnungen und Vergleiche nun 16bittig machen mußt.

c-hater schrieb:
> Jedenfalls wenn der
> Controller auch noch was anderes machen soll, als nur den DCF-Empfang.

Das ist Quatsch. Ein 10ms Interrupt stellt für den AVR keine merkbare 
CPU-Last dar.
Ein Routine mit <1% CPU-Last lohnt sich nicht, noch weiter zu 
optimieren.

Ein 10ms Interrupt ist aber für weitere Sachen noch recht nützlich, z.B. 
Tasten entprellen, Blink-LEDs, interne Uhr bei Empfangsstörungen usw.

von Torsten C. (torsten_c) Benutzerseite


Angehängte Dateien:

Lesenswert?

c-hater schrieb:
> Nach meiner Beobachtung liefern die üblichen DCF77-Empfänger bei
> schlechtem Empfang, egal ob durch zu geringe Feldstärke oder zu starke
> Störungen einfach gar keine Pegelwechsel mehr. Wo nix wackelt, da kein
> ISR-Aufruf.

Geht es um einen bestimmten Empfänger? Ich verstehe die Frage allgemein.

Hier mal meine Beobachtung mit dem Pollin-Empfänger bei 
unterschiedlichem Empangssituationen (s. Bild) zur allgemeinen 
Information.

Allerdings muss ich zugeben, dass mir das zu komplex wird. Auf Faltung 
o.ä. ^^ würde ich gern verzichten. Ich habe mich jetzt für den den DCF2 
von ELV entschieden.

Nur so als Gedanke: Der ist zwar teurer, aber dafür nehme ich nur 
einen und  platziere ihn an einer Stelle mit gutem Empfang. Ich 
verteile das Zeitsignal (Beacons) per NRF24L01+ weiter an alle µCs, die 
wissen wollen, wie spät es gerade ist. Dann haben diese nach einem Reset 
auch sofort die Uhrzeit parat.

von Karl H. (kbuchegg)


Lesenswert?

Stefan Anderson schrieb:
> Wenn es doch ach so leicht geht wieso gibt es dann für Avr und arduino
> noch keine solche Lösung?

Um die Frage noch zu beantworten:
Weil wir es hier mit dem gemeinen Arduino-Programmierer zu tun haben, 
der um Interrupts einen Bogen macht, wie der Teufel ums Weihwasser.
Der geimeine Arduino-Programmierer instantiiert sich ein Objekt von der 
DCF-Klasse und erwartet, dass er von der die aktuelle Zeit kriegt. Und 
zwar ohne, dass er vorher irgendwelche Polling-Mechanismen an 
irgendwelche Timer anhängt, die er nicht versteht, oder dass er (Gott 
bewahre) aus loop() heraus möglichst gleichmässig eine Methode der 
DCF-Klasse aufrufen muss, die dann das Sampling bzw. die Auswertung 
davon macht.

Sorry, wenn das jetzt etwas sarkastisch klingt. Aber so sieht die 
Realität nun mal aus.
Siehe zb den TO, der trotz vorhandenem Code nicht in der Lage ist, 
selbst die Frage zu entscheiden: externer Interrupt - ja oder nein.

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Stefan Anderson schrieb:
> Gibt es da schon was fertiges?

Wie unsportlich ...

SuperD schrieb:
> bei den billigen Hobbycontrollern

... schliesst sich irgendwie gegenseitig aus. Die sind teuer die Dinger.


Peter Dannegger schrieb:
> Du hast mehr Code, da Du sämtliche
> Impulszeitrechnungen und Vergleiche nun 16bittig machen mußt.

Ach Peter! Musst Du nicht! Takte den Controller mal langsamer ...

Peter Dannegger schrieb:
> Ein 10ms Interrupt ist aber für weitere Sachen noch recht nützlich, z.B.
> Tasten entprellen, Blink-LEDs, interne Uhr bei Empfangsstörungen usw.

... Multiplexanzeige (ich bevorzuge dann allerdings 4ms - da bekommt man 
dann in einem Byte auch noch 1s gezählt)


Gruß

Jobst

von Jens P. (picler)


Lesenswert?

c-hater schrieb:
> Nach meiner Beobachtung liefern die üblichen DCF77-Empfänger bei
> schlechtem Empfang, egal ob durch zu geringe Feldstärke oder zu starke
> Störungen einfach garkeine Pegelwechsel mehr. Wo nix wackelt, da kein
> ISR-Aufruf...

Ich verwende hier einen DCF-77-Empfänger von Conrad. Da ich meine Uhr 
mit einer zusätzlichen Empfangsled ausgestattet habe, kann ich schön die 
Empfangsqualität beurteilen. Zumindest bei mir ist es so, dass ab etwa 
17 Uhr die LED nur noch flackert. Ich habe da spaßeshalber mal den Oszi 
angeschlossen und bis zu 100 Pegelwechsel gemessen. Auch wenn dies den 
Prozessor nicht an die Leistungsgrenze bringen wird, ist es doch ein 
schlechter Programmierstil. Da im µC die Uhr meistens in Software 
realisiert wird, kann es vorkommen, dass durch die vielen DCF-Interupts 
einige Timer-Interupts verloren gehen, wodurch die Uhr zunehmend falsch 
geht. Außerdem wird der Timer-Interupt sowieso für die Uhr benötigt. Was 
liegt also näher, den in einer sinnvollen Zeitspanne (10ms) überlaufen 
zu lassen, beim Überlauf das DCF-Pin abzufragen und danach die Zeit für 
die Sekunde hochzuzählen.

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.