- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: DCF-77 Empfang zu Fuß

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131

    DCF-77 Empfang zu Fuß

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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)

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    So ganz viel kann ich aus dem Codefragment nicht erkennen, da fehlt noch viel. Es wird wohl versucht die Zeit der flanken auszuwerten - im Prinzip kann das gut werden, aber so etwa wie ein ignorieren von Überschwingern kann ich da noch nicht erkennen.

    Im Prinzip hat man bei der Auswertung viele Möglichkeiten. Wie man es anstellt hat auch einen Einfluss darauf wie leicht man Fehler erhält bzw. wie gut auch ein leicht gestörtes Signal noch erkannt werden kann.
    Das klassische, eher einfache Verfahren ist es jeden Puls einzeln auszuwerten, und dann halt auf 0, 1 oder überlange Pause (= 59.Sekunde) zu entscheiden. Ggf. lohnt es sich die Grenzwerte an die Hardware und ggf. Empfangssituation anzupassen.

    Etwas besser kann es werden, wenn man ausnutzt, das die Pulse alle im 1 Sekundentakt beginnen. Also erst einmal den Sekundentakt zu synchronisieren durch so etwas wie einen PLL in Software, und dann nur jeweils das Ende der Pulse bzw. das Signal in der Zeit am Anfang jeder Sekunde auszuwerten. Wenn es sein muss könnte man auch Daten von mehr als 1 Minute zusammenfassen und so ggf. einmal schlecht empfangene "Bits" in der 2./3. Minute besser bestimmen zu können.

  3. #3
    RN-Premium User Stammmitglied
    Registriert seit
    26.01.2005
    Ort
    Leipheim / Donau
    Beiträge
    53
    Hallo rogerberglen,

    das DCF77 Signal arbeitet mit Absenkungen 100ms Absenkung = logisch 0 und 200ms Absenkung = logisch 1.
    ich hab da ein ganz interresantes Pdf

    http://www.ihle-elektronik.de/Downloads/DCF77.pdf


    mfg ihle

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Ich habe jetzt zur Genüge mit dem DCF-77 Empfang herumexperimentiert. Das mit dem Capturing über einen Timer erscheint mir nicht so das Gelbe vom Ei zu sein.
    Jetzt habe ich gelesen, dass es besser ist das Signal zu sampeln.
    Sampling habe ich zwar verstanden, lässt sich demnach ohne irgend ein Timer zu benutzen auch bewerkstelligen.
    Jetzt habe ich dazu noch Fragen:
    Ist es ohne einen Timer möglich alle 10ms den DCF-Eingang zu pollen?
    Wie geht es dann weiter? Wird das Sampling dann irgendwann auch angehalten um die gesampelten Bits auch auswerten zu können ?Wie kann man die Abtastung mit dem DCF-Signal syncronisieren?

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    Ganz ohne Timer Unterstützung wird es zwar nicht gehen, weil man ja eine Refernz für die Zeit braucht.

    Aber warum machst Du das Ganze nicht über flankengetriggerte Interrupts?
    z.B. INT0 auf steigende Flanke. kommt die dann, das Sensig auf fallende Flanke im Interrupt Umstellen.
    Fällt die Flanke dann wiede ab, kannst Du den Zeitstempel der ansteigenden Flanke vom aktuellen Wert abziehen.
    So bekommst Du die Impulslänge. Umgekehrt gehts natürlich auch und Du bekommst die Pausenlänge.
    Die Ist auch wichtig, weil in der 59 Sekunde kein Puls gesendet wird und somit eine Synchronosation stattfinden kann.

    Somit wird die Interruptroutine bei jedem Impuls 2x aufgerufen.
    Ein Timer - Ich würde einen 16 Bit Timer verwenden - fungiert nur als Zeitbasis zum Bestimmen der Impulslängen.
    Timer Interrupts werden keine aufgerufen.

    Die ankommenden Bits schiebst Du in entsprechende Variablen und die Paritätsprüfung läuft auch noch nebenher mit.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Auf dem Weg bin ich gerade. Werde ich Testen wenn ich die Abfragerei zusammen habe.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Könnte man auch mit Folgendem etwas anfangen. Denn das habe ich momentan in Gebrauch um das DCF-Signal besser kennenzulernen.

    Code:
      Cls                                                                           'LCD-Display löschen und Meldung ausgeben.
      Locate 3, 1                                                                   'Textposition auf LCD-Display festlegen
      Lcd "Minutenl{245}cke suchen"                                                 'und Text Minutenlücke suchen ausgeben
    
      signalgap = 0                                                                 'Signalbreite löschen
      While signalgap < 1700                                                        'Solange empfangen bis Minutenlücke gefun-
                                                                                    'den ist.
        ' Ende der Sekundenmarke suchen, DCF-Signal wird "0"
        While dcf77inp = 1                                                          'Ende der Sekundenmarke suchen, DCF-Signal
          Waitms 1                                                                  'wird 0. Im ms-Takt abfragen
        Wend
    
        ' Breite der Lücke messen (Zeit während der das DCF-Signal "0" bleibt)
        signalgap = 0                                                               'Signalbreite löschen
        While dcf77inp = 0                                                          'Neue Signalbreite messen in dem der Ein-
          Incr signalgap                                                            'gang im 1ms-Abstand abgefragt wird.
          Waitms 1                                                                  'Solange Signal Low ist, Zähler erhöhen
        Wend                                                                        'Solange wiederholen bis Signal 1 ist.
    
        Locate 3, 1                                                                 'Textposition auf LCD-Display festlegen
        Lcd "                    "                                                  'und alten Text löschen.
        Locate 3, 1                                                                 'Textposition wieder auf Anfang 3. Zeile
        Lcd "L{245}cke: "; signalgap; "   "                                         'und Text + Signallänge ausgeben
      Wend
    
    ' *****************************************************************
    ' * Minutenlücke gefunden (Signalgap >= 1700ms)                   *
    ' *****************************************************************
    
      Cls                                                                           'LCD-Display löschen.
      Locate 3, 1                                                                   'Textposition auf LCD-Display festlegen.
      Lcd "Bits empfangen..."                                                       'Und Text ausgeben.
    
      Reset signalerror                                                             'Fehlerflag für Signalempfang löschen
      bitcount = 1                                                                  'Bitzähler auf 1 setzen
    
      While BitCount <= 59
        If BitCount >= 59 Then BitCount = 0     'Test um die Zeiten auf dem Display zu sehen
    '  While signalerror = 0 AND bitcount <= 59
    
        ' Breite der Sekundenmarke messen: <70ms = Störpuls, 100ms = "0", 200ms = "1"
        signalwidth = 0
        While dcf77inp = 1
          Incr signalwidth
          Waitms 1
        Wend
    
        ' Die erste Sekundenmarke (Minutenanfang) wird immer wesentlich kürzer gemessen.
        ' Grund unbekannt. Daher wird hier die erste Marke künstlich um 20ms verlängert.
    
        If bitcount = 1 Then signalwidth = signalwidth + 30                         '1. Marke verlängern
    
        Locate 2, 1                                                                 'Alten Text auf dem LCD-Display
        'Lcd "                    "                                                  'löschen.
        'Lowerline
        Select Case signalwidth
          Case Is < 65:   Set signalerror                                           'Sekundenmarke ist zu schmal
                          Lcd "error"; signalwidth
          Case 65 TO 110: dcfbit(bitcount) = 0                                      'Signalbreite ergibt "0"
                          Lcd "(0) "; signalwidth; "  "
          Case Is > 110:  dcfbit(bitcount) = 1                                      'Signalbreite ergibt "1"
                          Lcd "(1) "; signalwidth; "  "
        End Select
    
        Incr bitcount                                                               'read next bit
    
        ' Lücke überspringen
        signalgap = 0
        Locate 2, 12
        While dcf77inp = 0
          Incr signalgap
          Waitms 1
        Wend
    
        Lcd SignalGap; "  "
    
        Locate 3, 1
        I = SignalWidth + SignalGap
        LCD I; "  "
    
        If signalgap < 700 Then Set signalerror                                     'Lücke war zu kurz
    
      Wend

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von rogerberglen Beitrag anzeigen
    Könnte man auch mit Folgendem etwas anfangen. Denn das habe ich momentan in Gebrauch um das DCF-Signal besser kennenzulernen.

    Code:
        ' Die erste Sekundenmarke (Minutenanfang) wird immer wesentlich kürzer gemessen.
        ' Grund unbekannt. Daher wird hier die erste Marke künstlich um 20ms verlängert.
    Der Fehler in diesen Programm ist, dass vergessen wurde, dass die LCD-Befehle auch Zeit für die Ausführung benötigen!
    Kommt jetzt aber Ganz auf die Bibliothek, das verwendete Interface des LCD und was ausgegeben wird an, wie lange da jeweils gearbeitet wird.

    Die gemessenen Zeiten bestehen also aus dem was mit der 1ms Delay gemessen wurde plus dem was die LCD-Befehle dazwischen benötigt haben.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Zur Zeit läuft die Uhr, aber ich habe da von der DS1307 eine Abweichung innerhalb von 21 Stunden von -7 Sekunden.
    Jetzt gerade wird das DCF-77 Signal durch ein nicht Timergestütztes Polling abgefragt. Es wird alle 1ms nachgeschaut was denn der DCF-77 Eingang so macht.
    Zu diesem Zweck wird auch der Interrupt INT0 abgeschaltet, solange das DCF-Signal abgetastet wird. Erst nach einer Minute dann wird der Interrupt INT0 wieder freigegeben.
    Jede Sekunde wird der RTC ausgelesen und auf dem LCD-Display angezeigt. Der Takt dazu kommt vom DS1307 und löst das Ganze über den INT0-Interrupt aus.
    Und jetzt kommt mein dickes Problem:
    Wenn ich das DCF-77 nun erneut zum Abgleich einlese, habe ich in dieser Zeit keine LCD-Anzeige der Uhrzeit, da ja der Interrupt INT0 abgeschaltet wird.
    Nun fällt mir leider zur Zeit pardout nicht ein wie ich:
    1. Das DCF-77 Signal per Interrupt alle 1ms, oder doch besser alle 10ms, sample und auch dann die Zeiten auswerte
    2. Der DCF-77 Empfang und Kodierung im Hintergrund abläuft, so dass die Uhrzeit auf dem LCD-Display immer weiterläuft.

    Wäre ganz Toll wenn ich in dieser Richtung Unterstützung bekommen könnte.

    Eine Lösung für die etwas hinterherhinkende DS1307 wäre die Zeitabweichung festzustellen und einmal (in der Nacht) die DS1307 entsprechend korrigieren.
    Noch besser aber ist wenn man das Ganze in der Nacht nach obigen Punkten wieder syncronisert.

    Hier der bisher verwendete Code aus dem Internet:

    Wie kann ich hier eine Datei bzw. den gesamten Quellcode anhängen ????
    Forume meldet, dass der Text zu lang sei.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    Ich würd die Abfrage der Zeit nicht in ein 1ms Raster legen.
    Egal ob nun Timer Interrupts oder Delay's.

    Probier doch die Flanken deines DCF Empfängers auszuwerten.
    Wenn Du die Sensing Umschalterei im Interrupt nicht magst, kannst Du ebenso 2 Interrupt Eingänge parallel schalten ( z.B. INT0 und INT1 ) und den einen auf steigende Flanke und den anderen auf fallende Flanke programmieren.
    Ein Timer läuft frei - Günstig wär ein 16 Bit Timer.
    Den Prescaler so einstellen, das 2 Sekunden überbrückt werden können. Eventuell einen Overflow Counter im Timer Overflow mitlaufen lassen.
    Der Vorteil ist , das die Interrupts mit 2Hz aufgerufen werden.
    Bei deiner Polling Methode läuft das Ganze mit 1000Hz.
    Das bedeutet, Du hast keine Probleme um dein Display anzusteuern.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. DCF-77 Empfang zu Fuß
    Von rogerberglen im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 06.04.2013, 18:46
  2. Hexapod Fuß
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.04.2009, 19:21
  3. DCF 77 Empfang
    Von karlmonster im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 03.05.2008, 13:54
  4. ATN zu Fuß...
    Von Sommer im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 0
    Letzter Beitrag: 27.08.2007, 14:17
  5. DCF 77 Funkuhr Probleme beim Empfang
    Von mihailo im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 13.04.2006, 08:41

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad