Hallo, ich möchte mit einem AVR 8515 das DCF Signal einlesen und auf einem LCD ausgeben. Das Einlesen der Daten ist kein großes Problem, da ich als Signaleingang den T/C0 nutze. In einer Schleife wird der Zählerstand abgefragt und erhöht dieser sich um eins (durch steigende Flanke) wird 0,15 sec. später der Status des Bits ausgelesen. Leider habe ich noch kein richtige Lösung für die Startbiterkennung gefunden. Hat evtl. jemand einen Idee wie man die 59. fehlende Taktflanke erkennen kann. Vielen Dank Rolf PS: die schon veröffentlichten quelltexte, konnt ich leider nicht wirklich verstehen
Wenn der Zähler grösser als 200ms (0,2s) ist, ist kein DatenBit vorhanden. Ergo, Bit 59 ist aufgetreten. Sonst mal in der Codesammlung suchen. Gruß Rahul
Hallo Rolf, ich habe das DCF Signal an einen Interrupt-Eingang angeschlossen, welchen ich immer zwischen steigender und fallender Flanke umschalte. Im Interrupt messe ich über einen Timer die Zeiten ... Gruß Fiffi
Machs doch so wie ich, zähle einfach die Zeit mit einem Timerinterrupt bis zum nächsten Impulswechsel. Z.B. in einem Timerinterrupt von 50..100Hz kannst Du bequem in einem Byte die Impulsdauer (100 oder 200ms) und in einem anderen Byte den Impulsabstand (1s oder 2s) abzählen und auswerten. Peter
Boa, hab ich wieder unüberlegten Quatsch geschrieben... Ich dachte an die gleiche Lösung wie Peter. Timer bei Taktflanke starten, nach 150ms nachgucken, welches Signal noch vorhanden ist. Gleichzeitig zum ersten Timer einen weiteren starten, der erst beim nächsten gültigen Impuls zurückgesetzt wird. Der zweite Timer löst nach 1-2 Sekunden einen "Überlauf-Fehler" aus, der anzeigt, dass Minute 59 angekommen ist... Mit dem Wort "Timer" ist jetzt nicht direkt ein Hardware-Timer gemeint, sondern eine Variable, die aufgrund eines Taktes (z.B. 100Hz) herauf- oder heruntergezählt wird. Gruß Rahul
Hallo Ich helfe Dir mal: // External Interrupt 1 service routine // jede Flanke interrupt [EXT_INT1] void ext_int1_isr(void) { static unsigned int old_ms_count = 0; MeasureBit = MS_Count - old_ms_count; if(MeasureBit < 500) // also die Bitinformation (100 oder 200ms) { if(MeasureBit > 130) DCF77Bit = 1; else DCF77Bit = 0; } else { if(MeasureBit > 1500) sek_count = 0; // <--- Minute um, Startsekun de } } old_ms_count = MS_Count; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0 = 256 - 125; // 125kHz-Timer MS_Count++; // jede Millisek } Gruss, Holger
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.