DCF77 - Startbit erkennen - Hilfe

Gast #86882
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
Gast #86884
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
#86885
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
Gast #86886
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
Gast #86887
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren