Guten Tag, weil eine Funkuhr eine sehr beliebtes Anfängerprojekt ist, habe auch ich mich dazu entschlossen es zu versuchen. Leider scheitere ich bei der Auswertung. Mein erstes Problem ist, dass kein Interrupt bei einer fallenden Flanke ausgelöst wird und der für die steigende nur mit starker Verzögerung (knappe 100ms). Anfänglich hatte es sogar noch mit dem Interrupts funktioniert, aber ich kann mich nicht dran erinnern, dass ich irgendetwas an den Interrupts verändert habe und nun bin ich schon seit Stunden am suchen. Als es noch mit den Interrupts funktionierte, kam es aber auch manchmal mit der Auswertung der low Phasen zu Problem. 1-2 in der Minute wurden diese nicht richtig ausgewertet, obwohl das DCF Signal sauber empfangen wurde. Laut Rechnung, bei einem Prescaler von 1024 und 16 MHz, müsste doch der Wert der low Phase bei 100ms 1562 betragen und bei 200ms dem entsprechend das Doppelt, oder habe ich mich verrechnet?
cli/sei in einer ISR ist meistens falsch. Es gibt in C auch Dezimalzahlen. Wenn das DCF-Modul zu jener Spezies gehört, wie Pollin es verkauft, dann ist auch der interne Pullup eines AVR schon zu viel Last. Ich habe ein DCF-Modul, das keine eindeutig auswertbare Flanke liefert, sondern bei einer davon etwas "pumpt", was ähnlich wie ein prellender Taster wirken kann. Abfrage per Polling in einem regelmässigen Timer-Interrupt ist dann sinnvoller als eine Messung der Abstände von Flanken.
- wenn du sowieso den Input Capture benutzt, dann setzt man den Timer nicht auf 0 zurück, sondern lässt ihn einfach durchlaufen. Die Differenz der Messwerte erzählt einem dann das was man wissen möchte. - wozu aktivierst du den INT2? Du hast keine ISR dafür. Einen Interrupt für den man keine ISR hat aktiviert man nicht! Niemals! Denn wenn der aus irgendeinem Grund auftreten sollte, dann führt das zu einem Reset des Prozessors. - exzessize Leerezeilen im Code führen nicht zu mehr Übersicht, sondern ziehen den Code nur unnötig in die Länge. Wodurch wiederrum die Übersicht abnnimmt.
>>bei einer fallenden Flanke ausgelöst wird falscher Ansatz! Was macht dein Controller wenn du ein 500Khz Flattern am DCF Eingang hast!? >>müsste doch der Wert >>der low Phase bei 100ms 1562 betragen und bei 200ms dem entsprechend >>das Doppelt, oder habe ich mich verrechnet? Dein Ansatz ist falsch. Es geht nicht darum das Signal auszumessen auf die ms genau, du musst nur unterscheiden zwischen 100ms und 200ms. Du hast viel Spielraum. Das ganze erstmal mit +/- 20ms Fenster belegen. Einfach im 10ms Raster abfragen und die Aufrufe mitzählen...wenn also zwischen 8 und 12 gezählt wird, ist es ein 100ms Puls und wenn es zwischen 18 und 22 liegt ein 200ms Puls. Für das DCF Signal KEINEN Interrupt verwenden, das geht immer in die Grütze... DS
Ok vielen Dank, für eure Hilfe, dann versuche ich es noch einmal erneut ohne Interrupt, sondern mit einem Trigger.
Probier halt erst mal aus, ob der Pullup den Ausgang des DCF-Moduls überlastet. Einfach in einem Testprogramm den Wert des Eingangs auf die LED 'spiegeln'. Wenn die LED sauber blinkt, weißt du, dass du den DCF-Ausgang nicht überlastest. Dann ist zumindest der Teil der Story schon mal geklärt.
Das hab ich schon gemacht, und es lief auch ohne Problem. Weil das ganze eine Facharbeit wird, werde ich dann wohl doch die "schönere Variante" nehmen, die mit dem Trigger.
im nächsten Schritt auch die Zeiten zwischen den Pulsen "überwachen" und auf den fehlenden Puls Synchronisieren... Schau dir auch mal den COde von Peter an: Beitrag "DCF77 Uhr in C mit ATtiny26" und das: https://www.mikrocontroller.net/articles/DCF77-Funkwecker_mit_AVR vielleicht auch das: https://www.mikrocontroller.net/articles/DCF77_Wetterinformationen und dann gibt es z.B. hier: Beitrag "DCF77-Modul von Pollin" noch viel über die Module, Antennen und die Probleme zu erfahren... DS
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.