DCF77 - Startbit erkennen - Hilfe

Gast #86882
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 #86883
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
Gast #86884
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.