- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: DCF-77 Empfang zu Fuß

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Zitat Zitat von wkrug Beitrag anzeigen
    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.
    1ms Abtastrate ist übertrieben, 10-50ms reichen.

    Das obige Programm ist im Prinzip OK, aber es muss in einem Interrupt abgetastet werden.

    Das Abtasten der Flanken macht eine Menge Probleme, das reale Signal des Empfängers sieht eben nicht so schön aus, da hat es eine Menge Störimpulse drauf, besonders bei Gewittern. Mit dem Abtasten, fallen da schon eine Menge der Störimpulse raus.

    Wie im obigen Programm, macht man ein Blindfenster von etwa 700ms, in welchem gar nicht abgetastet wird, dann sieht man auch die Störungen nicht und muss diese auch nicht extra behandeln. Das Blindfenster endet etwa 50ms vor der Sekunde. Die Abtastung nimmt man nur während der 300ms vor.
    Beim Starten muss man aber zuerst synchronisieren. Da wird dann dauernd abgetastet, bis man einen gültigen 100ms oder 200ms Impuls eingefangen hat.

    Ich habe das zu DOS-Zeiten erstmalig für den IBM-PC gemacht. Der Treiber sass da im Timertick von DOS (18.7 Hz, wenn ich mich recht erinnere) und hat dann einfach die System-Uhr korrigiert.

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

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.188
    Das Abtasten der Flanken macht eine Menge Probleme, das reale Signal des Empfängers sieht eben nicht so schön aus, da hat es eine Menge Störimpulse drauf, besonders bei Gewittern. Mit dem Abtasten, fallen da schon eine Menge der Störimpulse raus.
    Mit den Störsignalen hast Du natürlich recht.
    Beim AVR ist die Abtasterei in einem Timer Interrupt allerdings auch relativ einfach.
    10ms Abtastrate im Prinzip auch kein Problem.

    Impulsauswertung müsste man aber trotzdem machen - Liegt die berechnete Impulslänge innerhalb der zulässigen Grenzen?
    Wenn nicht handelt es sich um einen Fehlimpuls bzw. Störung.

    Bei meiner letzten DCF Steuerung hab ich einfach einen internen Timer als Basis für eine Uhr mitlaufen lassen.
    Diese Uhr wird vom DCF Signal beim 30. Impuls einer Minute nachgestellt.
    Also in der 30. Sekunde jeder Minute nachgestellt, wenn vorher alle parity Bits des Signals in Ordnung waren.

    Die interne Uhr ( Stunden und Minuten ) wurde bei mir erst wieder auf die DCF Zeit nachgestellt, wenn 3 mal eine gültige DCF Zeitinformation ( 3 Minuten ) in Folge empfangen wurde.
    Auch Doppelfehler mit gültigem Parity sollten somit keine Chance haben und auch eine automatische Sommer Winterzeit Umstellung ist damit gewährleistet.

    Der am Controller verwendete Quarz dürfte so genau sein, das man damit auch mal ne Stunde DCF Ausfall überbrücken kann.
    Ein Hardware RTC ist hier natürlich wesentlich genauer.
    Gute RTC Chips haben eine Abweichung von 3 Minuten pro Jahr!

    DCF hat natürlich den Charme einer Automatischen Sommer / Winterzeit Umstellung, das nicht jeder RTC Chip bietet.

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Ich habe jetzt das Ganze mit 10ms Abtastrate erstellt. Die Uhr läuft jetzt inzwischen unbeirrt und holt sich die Daten aus der RTC. So ganz nebenher wird auch das DCF-77 Signal empfangen und decodiert.
    Jetzt muss ich nur noch die Informationen aufbereiten und in die RTC schieben. Dann sollte Alles so funktionieren wie ich mir das vorgestellt hatte.
    Wenn Alles funktioniert würde ich gerne den Code komplett zur Verfügung stellen.
    Wo kann man in diesem Forum den kompletten Code einstellen?

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Bis jetzt hat die erste Routine (misst den kürzesten DCF-Impuls aus) immer funktioniert. Nach ein paar Änderungen im Programm hat diese plötzlich nicht mehr funktioniert!! Und tut es auch nicht nachdem ich die Änderungen wieder herausgenommen habe.
    Auf dem Display erscheint "Sign.Zeit: Messung" und dann nach der Wartezeit gleich "ms 0". Die Schleife wird schlicht ausgelassen
    Wenn ich jetzt den Timer1 abschalte dann funktioniert dieser Programmteil. Aber seither hat es immer in Verbindung mit dem Timer1 funktioniert.
    Ich kann da kein System erkennen und weis nicht weiter:

    Hier mal der betreffende Codeausschnitt:

    Code:
     $regfile =   "m32def.dat"                                                   'Atmel Prozessor: AVR AT Mega32
    $crystal =   7372800                                                        'Quarz-Frequenz = 7.3728 MHz
    $hwstack =   68
    $swstack =   68
    $framesize = 54
    'baud     = 19200                                                           'Option für Serielle Schnittstelle
    $lib "i2c_twi.lib"                                                          'Hardwaresteuerung für I2C-Bus
    
    ------------------------------------------------------------------------------------------------------------------------
    
    Config Lcd     = 20x4                                                       'LCD-Display mit 20 Zeichen und 4 Zeilen
    Config Lcdbus  = 4                                                          '4Bit-Modus für LCD-Daten
    Config Lcdmode = PORT                                                       'Betriebsart für LCD-Daten
    Config LcdPin  = Pin, Db7 =PORTA.7, Db6 =PORTA.6, Db5 =PORTA.5, Db4 =PORTA.4, _
                           Rs =PORTA.3, E =PORTA.2                              'Anschlußbelegung des LCD-Displays
    
    ------------------------------------------------------------------------------------------------------------------------
    
    DDRA = DDRA OR &B00000001                                                   'PortA Bit0 ist Ausgang für Beleuchtung
    DDRD = &B10110011                                                           'Datenrichtungsregister setzen  1=Ausg.
    
    Config PIND.2 = Input                                                       'INT0-Eingang (Sign. von DS1307 RTC)
    Config PIND.6 = Input                                                       'PC0 ist Eingang für DCF-77 Signal
    
    Config TWI = 100000                                                         'I2C-Schnittstelle auf 100 kHz einstellen
    TWCR = &B00000100                                                           'I2C-Schnittstelle einschalten
    
    PORTD.7 = 1                                                                 'PullUp an Port D7 ein (DCF Ein/Aus)
    PORTD.6 = 0                                                                 'PullUp an Port D6 aus (DCF-77)
    PORTD.5 = 1                                                                 'PullUp an Port D5 ein (LED4)
    PORTD.4 = 1                                                                 'PullUp an Port D4 ein (LED3)
    PORTD.3 = 1                                                                 'PullUp an Port D3 ein (frei)
    PORTD.2 = 0                                                                 'PullUp an Port D2 aus (DS1307 int)
    PORTD.1 = 1                                                                 'PullUp an Port D1 ein (LED2)
    PORTD.0 = 1                                                                 'PullUp an Port D0 ein (LED1)
    
    DCF77Inp Alias PIND.6                                                       'DCF-77 Eingang Alias
    
    -----------------------------------------------------------------------------------------------------------------------
    
    Config Timer0 = Timer, Prescale = 1024                                      'Timer für DCF-77 Signalabtastung
    Config Timer1 = Timer, Prescale = 1024                                      'Timer für die Erzeugung eines Sek. Taktes
    
    ------------------------------------------------------------------------------------------------------------------------
    
    Const DS1307W = &HD0                                                        'DS1307 RTC schreiben
    Const DS1307R = &HD1                                                        'DS1307 RTC lesen
    
    Const Preload0 = 183                                                        'Timer0 Wert für 10ms Impulse
    Const Preload1 = 58335                                                      'Timer1 Wert für 1s   Impulse
    
    Const DS1307_Sekunden = &H00                                                'Korrektur bei Zeitübernahme in DS1307
    Const Jahrh           = &H20                                                'Start Jahrhundert bei &H20 (2000)
    
    Dim   Taste         As Byte
    Dim   RTC_Regs(11)  As Byte                                                 'Byte-Array für DS1307 RTC Inhalte
    Dim   DcfBit(60)    As Byte                                                 'Variable für DCF-77 Behandlung
    Dim   Status        As Byte                                                 'Statusregister der Programmteile
    
    Dim   Zähler        As Word                                                 'Impulslängenmessungen
    Dim   Fehler        As Byte                                                 'Fehlerspeicher für DCF-Routinen
    Dim   SigZ(10)      As Word                                                 'Feldvariable für Unterprogramm
    
    Dim   Sek_Hex       As Byte                                                 'Sekunden in Hexadezimal
    Dim   Min_Hex       As Byte                                                 'Minuten in Hexadezimal
    Dim   Std_Hex       As Byte                                                 'Stunden in Hexadezimal
    Dim   Tag_Hex       As Byte                                                 'Tage in Hexadezimal
    Dim   Tag_Str       As String * 2                                           'Tage in Stringform
    Dim   Mon_Str       As String * 2                                           'Monat in Stringform
    Dim   Std_Str       As String * 2                                           'Stunden in Stringform
    Dim   WTag_Hex      As Byte                                                 'Wochentag in Hexadezimal 1=Montag
    Dim   TagNam        As String * 10                                          'Wochentagsname
    
    Dim   ZeitZone      As String * 4                                           'Sommer/Winterzeit
    Dim   ZeitZ_Hex     As Byte                                                 'Zeitzone MEZ/MESZ
    Dim   Mon_Hex       As Byte                                                 'Monate in Hexadezimal
    Dim   Jahr_Hex      As Byte                                                 'Jahre in Hexadezimal
    Dim   JahrH_Hex     As Byte                                                 'Jahrhunderte in Hexadezimal
    Dim   JahrhW        As Byte                                                 'Zähler Jahrhundertwechsel seit 2000
    Dim   JahrhW_EEp    As Eram Byte                                            'Anzahl der Jahrhundertwechsel seit 2000
    
    Dim   Dcf_Parity    As Single                                               'Parität bei DCF-77 Auswertung
    Dim   PBit          As Byte                                                 'Variable für Paritätsprüfung
    
    Dim   V             As Word                                                 'Vergleichswert für Signalzeiten
    Dim   Z             As Byte                                                 'Allgemeine Zählvariable
    
    ------------------------------------------------------------------------------------------------------------------------
    
    Declare Function  SigDauer() As Word                                        'DCF-Signallänge ermitteln
    Declare Function  Syncro() As Byte                                          'Minutenmarke abwarten
    Declare Sub       DCFReceive()                                              'DCF-77 Signalverarbeitung
    Declare Sub       PTest()                                                   'Paritätstest
    Declare Function  DelNull(ByVal Var As Byte) As String * 2                  'Führende Null unterdrücken
    Declare Sub       Rtc_Init()                                                'DS1307 RTC initialisieren
    Declare Sub       DS1307Set()                                               'DCF-77 Informationen in RTC schreiben
    Declare Function  DS1307R_Sekunde() As Byte                                 'DS1307 Sekundenregister auslesen
    Declare Sub       DS1307W_Sekunde(ByVal Value As Byte)                      'DS1307 Sekundenregister schreiben
    Declare Sub       DS1307Read()                                              'DS1307 $00 - $09 auslesen
    Declare Sub       DS1307Write()                                             'DS1307 $00 - $09 schreiben
    
    ------------------------------------------------------------------------------------------------------------------------
    
    On Timer0 Kurzzeit_isr                                                      'Erzeugung 10ms Takt
    On Timer1 Sekundentakt_isr                                                  'Erzeugung 1s   Takt
    
    ------------------------------------------------------------------------------------------------------------------------
    
    Cls                                                                         'LCD-Display löschen
    Cursor Off Noblink                                                          'Cursor auf LCD-Display ausblenden
    PORTA.0 = 0                                                                 'LCD-Hintergrundbeleuchtung einschalten
    
    
    Timer1 = Preload1                                                           'Timer1 mit Startwert für 1s Takt laden
    
    Call DS1307Read()                                                           'Daten für Lcd-Anzeige aus RTC auslesen
    
    Enable Timer1                                                               'Timer1 für 1s   Takt einschalten
    Enable Timer0                                                               'Timer0 für 10ms Takt einschalten
    Enable Interrupts                                                           'Interrupts global freigeben
    
    
    PORTD.0 = 0                                                                 'Led1 für DCF-Empfang einschalten
    PORTD.7 = 0                                                                 'DCF77-Empfänger einschalten
    Wait 4                                                                      '4s warten bis DCF-Empfänger bereit ist
    
    V = SigDauer()                                                              'Durchschnittliche Signaldauer ermitteln
    
    Locate 4, 1                                                                 'Textposition auf LCD festlegen.
    If V = 0 Then                                                               'Wenn kein Vergleich ermittelt, dann
      Lcd "Kein Vergleich gef."                                                 'Fehlermeldung auf LCD ausgeben.
    Else                                                                        'sonst Vergleichswert auf LCD anzeigen
      Lcd "Zeitkonst.: "; V ;"      "
    End If
    
    ------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------
    
    Function SigDauer() As Word
    
      Local Z        As Byte                                                    'Allgemeine Zählvariable
      Local V        As Word                                                    'Variable für Signallängenberechnung
    
      Locate 4, 1                                                               'Text positionieren und ausgeben.
      Lcd "Sign.Zeit: Messung"
      Wait 2                                                                    'Meldung 2s lang anzeigen, dann weiter
    
      While V < 1                                                               'Vergleichswert kleiner 1 ?
        For Z = 1 To 10                                                         '10mal Signallänge messen
          Do                                                                    'Solange warten bis das DCF-Signal 0
          Loop Until DCF77Inp = 1                                               'wird.
    
          Timer0 = Preload0                                                     'Dann Timer für Abtastung vorladen und
          Zähler = 0                                                            'Zähler für Signallänge löschen.
    
          Do                                                                    'Solange das DCF-Signal 0 ist Signallängen-
          Loop Until DCF77Inp = 0                                               'zähler hochzählen.
          SigZ(Z) = Zähler                                                      'Messschritte auf dem Lcd-Display anzeigen
          Locate 4, 12
          Lcd "("; Z; ")  "; SigZ(Z)
        Next Z
    
        For Z = 1 To 10                                                         'Nach den 10 Messungen kürzesten Wert fest-
          If SigZ(Z) < SigZ(1) Then                                             'stellen.
            Swap SigZ(1), SigZ(Z)
          End If
        Next Z
    
        If SigZ(1) < 10 Then SigZ(1) = 10                                       'Sicherheitskorrektur, sonst Fehler mögl.
                                                                                'Lcd-Ausgabe speichern.
        V = SigZ(1) / 2                                                         'Diesen Wert mit Faktor 1.5 multiplizieren
        V = V + SigZ(1)                                                         'und als Vergleichswert in Variable able-
      Wend                                                                      'gen.
    
      SigZ(2) = SigZ(1) * 10                                                    'Wert aufbereiten zur LCD-Anzeige
    
      Locate 4, 12                                                              'Text auf Lcd-Display positionieren und
      Lcd SigZ(2); "ms   "                                                      'ermittelten Wert anzeigen.
      Wait 3                                                                    'Text 3s lang anzeigen.
    
      SigDauer = V                                                              'Ermittelten Wert zurückgeben
    
      Return
    
    End Function

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo rogerberglen,

    frage:
    Warum nutzt du nicht die Lib Dcf77. Da ist doch alles schon drin was du benötigst.
    Auch die Abfrage des Dcf_ Status.
    Beispiel Ausgabe Terminal::

    Print "DCF: " ; Time$ ; " " ; Date$ ; " " ; Time(dcf_sec) ; " " ; Date(dcf_day) ; " " ; Bin(dcf_status) ; " " ; Bin(dcf_parity) ; " " ; Bin(dcf_bits) ; " " ; Bdcf_impuls ; " " ; Bdcf_pause '; " " ; db1 ; " " ; db2

    Gruß Fred

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Welche Timer nutzt denn die DCF-77 lib? Gibt diese mir auch wirklich alle Bits 0 - 58 zurück. Denn ich frage da ein paar zusätzliche Sachen ab, nicht nur die Uhrzeit und das Datum.
    Wie Zeitkritisch ist diese fertige Lib in Bezug mit anderen Timern und Interrupts?

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo rogerberglen,

    Timer1 wird belegt. Stellt aber mit aktiv, [Gosub = Sectic] ein Sekundentakt für Folgeanwendungen zu Verfügung. Persönlich finde ich dies auch sehr hilfreich.
    Ja alle Bits können abgefragt werden. Stelle mal ein Printauszug ab welche Infos für mich interessant waren.

    Klicke auf die Grafik für eine größere Ansicht

Name:	Bild1.jpg
Hits:	12
Größe:	81,0 KB
ID:	31035
    Ein zeitkritisches Verhalten mit anderen Timern konnte ich bis dato nicht feststellen. Lib ist ja eine Art Task. Das mit Bit7 an oder ab geschaltet werden kann. Grob gesagt Lib läuft im „Hintergrund“ wenn so eingestellt.

    Gruß Fred

    P.S ich gehe nicht mehr zu Fuß wenn Bascom ein Auto anbietet von A nach B zukommen.
    Ja die Frage bleibt was ist gesünder. Diese muss jeder selber entscheiten.


Seite 2 von 2 ErsteErste 12

Ä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
  •  

12V Akku bauen