-         
Ergebnis 1 bis 4 von 4

Thema: DCF77 frage...

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360

    DCF77 frage...

    Anzeige

    Code:
    $crystal = 4000000
    $regfile = "m32def.dat"
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
    Config Lcdbus = 4
    
    Config Pind.2 = Input                                       'extern INT0
    
    ' Empfangsstatus auf LED ausgeben, damit man sieht,
    ' ob der AVR auch arbeitet
    Config Pina.0 = Output
    
    Set Portd.2
    Set Porta.0
    
    ' Wert des Prescaler durch Testen ermittelt.
    Config Timer0 = Timer , Prescale = 256                      '4000000 / 256 = 15625 Hz
    Const Startwert = 100                                       'Überlauf 256 - Startwert 100 = 156  ( 15625 Hz / 156 = 100,1 Hz ) => 10ms
    Load Timer0 , Startwert
    
    Dim I As Byte
    Dim J As Byte
    Dim K As Byte
    
    Dim Impuls As Byte
    Dim Pause As Integer
    Dim Sekunde As Byte
    Dim Wert As Byte
    Dim Paritaet As Byte
    Dim Checker As Byte
    Dim Wochentag As String * 14
    Dim Temp As String * 2
    
    Wochentag = "MoDiMiDoFrSaSo"                                ' String mit Kuerzel der Wochentage
    
    Dim Werte_bit(6) As Byte
    Dim Werte_start(6) As Byte
    Dim Minute(42) As Byte                                      ' Enthaelt die Sekunden-Impulse 0 und 1
    
    ' Arrays für Startposition und Laenge der Daten im Array Minute()
    Werte_start(1) = 4                                          'Minuten
    Werte_bit(1) = 6
    Werte_start(2) = 12                                         'Stunden
    Werte_bit(2) = 5
    Werte_start(3) = 19                                         'Tag
    Werte_bit(3) = 5
    Werte_start(4) = 25                                         'Wochentag
    Werte_bit(4) = 2
    Werte_start(5) = 28                                         'Monat
    Werte_bit(5) = 4
    Werte_start(6) = 33                                         'Jahr
    Werte_bit(6) = 7
    
    Impuls = 0
    Pause = 0
    Sekunde = 0
    Checker = 0
    ' Checker = 0 : Start
    ' Checker = 1 : Aktuelle Messung nicht erfolgreich
    ' Checker = 2 : Daten schenen in Ordnung zu sein
    
    Config Int0 = Falling                                       '-> bei negiertem DCF-Signal,
                                             'sonst Config Int0 = Rising !!!
    Enable Interrupts
    Enable Int0
    Enable Timer0                                               'enable the interrupt
    
    On Int0 Zaehle Nosave
    On Ovf0 Tim0_isr                                            'Überlauf alle 10ms
    
    Cls
    Cursor Off
    
    Lcd "-- --.--.-- --:--:--"                                  ' Display bei Start
    
    Do                                                          'endless loop
      nop
    Loop
    
    End                                                         'end program
    
    
    ' Routine zaehlt Sekunden und wertet Impuls- und Pausenzeit aus.
    Zaehle:
       'Für Debug eingebaut: (zeigt Impuls und Pausenlänge)
       'Locate 3 , 1 : Lcd "Imp: " ; Impuls
       'Locate 3 , 10 : Lcd "Pau: " ; Pause
    Incr Sekunde
       If Sekunde > 18 Then
             K = Sekunde - 18
             If Impuls > 17 Then
                Minute(k) = 1
             Else
                Minute(k) = 0
             End If
       End If
       Locate 1 , 19
       Wert = Makebcd(sekunde)                                  ' Umweg ueber BCD, dann fuehrende 0
       Lcd Bcd(wert)                                            ' Sekunde anzeigen
             If Pause < 300 And Pause > 200 Then                'Minutenanfang
                      If Checker = 0 Then                       ' Checker-Flag setzen
                      Checker = 1
                      Else
                      Checker = 2
                      Gosub Check_parity
                      End If
             Sekunde = 0                                        ' Sekunde 0 setzen
             Locate 1 , 19
             Lcd "00"                                           ' und anzeigen
             End If
       If Checker = 2 Then
          Gosub Dekoder
          Checker = 1
       End If
    Impuls = 0
    Pause = 0
    Return
    
    ' Timer incrementiert die Zaehler
    Tim0_isr:
    Load Timer0 , Startwert
             If Pind.2 = 0 Then
             Incr Impuls
             Set Porta.0
             Else
             Incr Pause
             Reset Porta.0
             End If
    Return
    
    
    ' Ueberprufung der empfangenen Daten
    Check_parity:
    Locate 4 , 1
    Lcd Sekunde                                                 ' Debug-Ausgabe bei schlechtem Empfaenger
    
    ' Stimmt die Zahl der Sekunden?
    If Sekunde <> 59 Then
       Checker = 1
    End If
    
    'pruefe Minutenparitaet
    Paritaet = 0
    For I = 4 To 10
       Paritaet = Paritaet + Minute(i)
    Next I
    Paritaet = Paritaet And 1
    If Paritaet <> Minute(11) Then
       Checker = 1
    End If
    
    Paritaet = 0
    
    'pruefe Stundenparitaet
    For I = 12 To 17
       Paritaet = Paritaet + Minute(i)
    Next I
    Paritaet = Paritaet And 1
    If Paritaet <> Minute(18) Then
       Checker = 1
    End If
    'Lcd Checker
    
    'pruefe Rest
    Paritaet = 0
    For I = 19 To 40
       Paritaet = Paritaet + Minute(i)
    Next I
    Paritaet = Paritaet And 1
    If Paritaet <> Minute(41) Then
       Checker = 1
    End If
    'Lcd Checker
    
    Return
    
    
    
    ' Daten im Minuten-Array dekodieren und ausgeben.
    Dekoder:
    ' Schleife, weil kompakter
    For K = 1 To 6
       Wert = 0
       J = Werte_start(k) + Werte_bit(k)
       For I = J To Werte_start(k) Step -1
          Shift Wert , Left
          Wert = Wert + Minute(i)
       Next I
       J = Werte_start(k)
       Minute(j) = Wert
    Next K
    
    ' Wochentag aus String schneiden.
    K = Minute(25) * 2
    K = K - 1
    Temp = Mid(wochentag , K , 2)
    
    ' Raus damit, aufs LCD
    Locate 1 , 1
    Lcd Temp ; " " ; Bcd(minute(19)) ; "." ; Bcd(minute(28)) ; "." ; Bcd(minute(33))
    Lcd " " ; Bcd(minute(12)) ; ":" ; Bcd(minute(4))
    
    Return
    Ich habe hier obrigen Code gefunden.

    Was muss ich machen:
    -wenn ich das ganze mit 10 MHz betreiben will?
    -Stunde, Minute und Tag als Variable verwenden will mit denen ich z.B.
    if hour = 10.35 then
    ...
    machen will.


    Mfg

    EDE

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    $crystal = 10000000 und
    Code:
    Config Timer0 = Timer , Prescale = 256                      '4000000 / 256 = 15625 Hz 
    Const Startwert = 100                                       'Überlauf 256 - Startwert 100 = 156  ( 15625 Hz / 156 = 100,1 Hz ) => 10ms 
    Load Timer0 , Startwert
    neu ausrechnen. Und alles andere was irgendwie die 4MHz als Grundlage hatte oder Werte die für 4MHz ausgerechnet waren.
    Ich hab den Code mal flüchtig überschaut und nix weiter gefunden. Das ist aber keine Garantie. Du kannst ja nochmal genau schauen ob solche Werte nochmal vorkommen.
    Die Anpassung aller anderen Zeitrelevanten Aufgaben übernimmt Bascom selbst dadurch das du mit $crystal= 10000000 die 10MHz eingestellt hast. Das wären dann Aufgaben wie RS232 oder ähnliches was automatisch angepasst werden würde.

    If stunden = 10 then
    if minuten = 35 then
    mach das
    end if
    end if
    ?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    hallo

    ich würde
    if hour=10 and minute=35 then
    machen. sieht sauberer aus im code

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360
    danke is ja perfekt

Berechtigungen

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