Forum: Mikrocontroller und Digitale Elektronik DCF77 - Startbit erkennen - Hilfe


von Rolf Krause (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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

von Fiffi (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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

von Holger B. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.