Ich beschäftige mich gerade mit dem DCF-77 Empfang, den ich zu Fuß erledigen möchte da ich verschiedene Zusatzbits auch mit auswerten will. Ich habe auch viele Beispielprogramme dazu gefunden. Aus einem habe ich die Dekodierung übernommen, da diese recht verständlich aufgebaut ist. Leider wird immer wieder eine 0 (kurzes Signal) als eine 1 dekodiert was dann zu einem Parity-Fehler führt.
Wie kann man das Ganze noch etwas zuverlässiger machen? Denn ich möchte das empfangene Protkoll dann an einen DS1307 übergeben.
Hier mal der Code der das Zeitsingal abtastet:
Code:
$regfile = "m32def.dat" 'Vereibarung des Atmel Prozessors, hier: AVR AT Mega32
$crystal = 7372800 ' 7.372.800 Hz-Quarz
On Icp1 On_capture1
Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Falling , Noise Cancel = 1
Enable Icp1 ' Freigabe Timer1
Enable Interrupts ' Freigabe der Interrups allgemein.
On_capture1: ' Wird mit dem Sekunden-Impulse des DCF Empfängers an Port D.6 ausgelöst.
Zaehlerstand = Capture1 ' Aktuellen Zählerstand sofort nach Interrupt fixieren.
Zeitdauer = Zaehlerstand - Zaehlerstand_alt ' Der Wert in der Variablen (Zeitdauer) mit 0,0001388 s multipliziert-
Zaehlerstand_alt = Zaehlerstand ' ergibt die seit dem letzten Interrupt vergangene Zeit in Sek.
Zeiger = Zeiger + 1 ' Laufvariable (Zeiger) um 1 erhöhen.
'Goto Test
Select Case Zeitdauer ' Auswertung der Zeitdauer seit dem letzten Interrupt.
Case Is > 18011 ' <9500> Kein Funk Signal; Weil Impulsabstand größer als 2,5 Sek.
Goto Fehler1
Case Is < 5548 ' <1500> Impuls Störung; Weil Impulsabstand kleiner als 770 ms.
Goto Fehler2
Case Is < 6484 ' <3520> Kurzer regulärer Impulsabstand von ca 900 ms.
Portd.0 = 1 : Bit_old = 0 : Portd.1 = 1 : Sync(zeiger) = 0
Goto Hinter_fehler
Case 6844 To 7493 ' <3422> <3774> Wenn Impulsabstand ca. 1000ms dann war der Bit Wert gleich dem letzten Bit Wert
Portd.0 = 1 : Portd.1 = 1 : Sync(zeiger) = Bit_old ' (950ms - 1.04s)
Goto Hinter_fehler
Case 7750 To 8429 ' <3774> <4200> Langer regulärer Impulsabstand ca. 1100ms.
Portd.1 = 1 : Bit_old = 1 : Portd.0 = 1 : Sync(zeiger) = 1 ' (1.075s - 1.17s)
Goto Hinter_fehler
Case 9006 To 15201 ' <4500> <7600> Ausfall der 59. Sekunde also Pause zwischen 1250 ms - 2111 ms.
' (1.25s - 2.11s)
Lesezeichen