Nur zur Abschreckung:

Code:
'---------------------------------------------------------------------------------------------------------
'  (c) 2001 Roman Foltyn 29.12.2001
'---------------------------------------------------------------------------------------------------------
'  DCF1.BAS Version 1.01
'  DCF-77 Signal auf INT1 Pin 13 (P3.3) Impulse Low Activ [Conrad Empfänger + Inverter]
'  Port 3.7 Low => Piepser ein  (Volle stunde Pipser) 5 pipse letzte bei 00:00 lang 0.3 sek
'---------------------------------------------------------------------------------------------------------
'
'  V1.01  3.01.2002 10ms Zähler koriegiert 0.99 sek zum 1s ,softwate uhr variable initialisiert
'                   Bei keine DCF signall nach 2,5 sek XTL meldung Beide DCF Zähler begrenz bis 250
'                   Wenn keine DCF empfang parity war auch OK jetz wen kalender werte=0 dan auch keine synchro
'                   Fehler bei KW1 (negative Temp2) Beseitigt.
'---------------------------------------------------------------------------------------------------------
$crystal = 11059200
$large
Config Lcd = 16 * 2                                           'configure lcd display
Cursor Off
'---- Software Uhr Variablen -----------------------------------------------------------------------------
Dim Shsek As Byte , Ssek As Byte , Smin As Byte , Sstd As Byte , Etag As Byte
Dim Stag As Byte , Swta As Byte , Smon As Byte , Sjah As Byte
'---- DCF77 Dekoder Variablen ----------------------------------------------------------------------------
Dim Pointer As Byte , Dmin As Byte , Dstd As Byte,            'DCF Variable
Dim Dtag As Byte , Dwta As Byte , Dmon As Byte , Djah As Byte
Dim Dcf(60) As Byte                                           'array für dcf empfangene impulse
Dim Dcfs As Byte                                              'Variable für zeit zwischen zwei impulse von DCF empfänger
Dim Dcfl As Byte                                              'Variable für DCF impuls dauer in 10ms schritten
Dim Dcferm As Byte                                            'Parity error minuten
Dim Dcfers As Byte                                            'Parity error stunden
Dim Dcferd As Byte                                            'Parity errordatum
Dim Dcferr As Byte                                            'Parity error Globall
Dim I As Byte                                                 'diverse temporare variablen
Dim Temp1 As Byte
Dim Wert As Byte
Dim Par As Byte
'--- Speicher NUR FÜR Piepstone -    ---------------------------------------------------------------------
Dim Pipsen As Byte                                            'merker für erzeugte pipston - eliminiert doppel ton bei DCF synchronisation
'--- Speicher NUR FÜR KW und Jahrestag BERECHNUNG --------------------------------------------------------
Dim Jtag As Integer , Schalt As Byte
Dim Temp2 As Integer
Dim Temp3 As Integer
Dim Temp4 As Byte
Dim Kw As Byte
'---------------------------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------------------
Dcf(0) = 1                                                    'Variablen initialisierung
Dcf(10) = 0
Dcf(20) = 1
Pointer = 0
Dcferr = 1
Shsek = 0
Ssek = 0
Smin = 0
Sstd = 0
Swta = 0
Stag = 0
Smon = 0
Sjah = 0
'Interrupt Configuration ---------------------------------------------------------------------------------
Config Timer2 = Timer , Gate = Internal , Mode = 0            'Reload 16 Bit Modus
On Int1 Int1_int
Set Tcon.2                                                    'flanken steuerung
On Timer2 Timer_2_int
Load Timer2 , 9216                                            '9216 für 11.0592MHz 10 mS takt (Xtal/12/9216=>10ms)
Enable Interrupts                                             'enable interrupt
Enable Int1                                                   'enable int1
Enable Timer2                                                 'enable timer2
Priority Set Timer2                                           'highest priority
Start Timer2                                                  'Timer starten




'#########################################################################################################
'--- Programm Anfang -------------------------------------------------------------------------------------
'#########################################################################################################
Cls
Upperline
Lcd "DCF-77 UHR V1.01"
Lowerline
Lcd "(c) Roman Foltyn"
Wait 2
'____ Hauptprogramm ______________________________________________________________________________________
   Do
      If Shsek = 0 Then Gosub Displayuhr                      'einmall pro sekunde ausgabe auf display
   Loop
End



'#########################################################################################################
'Unterprogramme _-----------------------------------------------------------------------------------------
'Timer 2 Interrupt Routine (10ms) ------------------------------------------------------------------------
'bearbeitubgs zeit bei volle minute 1,13ms bei jede aufruf 140µs
'---------------------------------------------------------------------------------------------------------
Timer_2_int:
Incr Dcfs
If Dcfs > 250 Then Dcfs = 250                                 'Zähler begrenzen bis 250
If P3.3 = 0 Then Incr Dcfl                                    'Dcfl impuls Länge zahler in 10ms step
If Dcfl > 250 Then Dcfl = 250                                 'Zähler begrenzen bis 250
'---- Software Uhr ---------------------------------------------------------------------------------------
Incr Shsek                                                    '10 ms addieren
If Shsek = 100 Then                                           'und bei 1 sekunde ssek addieren
   Shsek = 0
   Incr Ssek
End If

If Ssek = 60 Then
   Ssek = 0
   Incr Smin
End If
If Smin = 60 Then
   Smin = 0
   Incr Sstd
End If
If Sstd = 24 Then
   Sstd = 0
   Incr Stag
   Incr Swta
End If
Etag = 32                                                     'berechnung monat ende für softuhr
Schalt = Sjah Mod 4
If Smon = 2 Then                                              'Februar bei schaltjahr berechnen
  If Schalt = 0 Then
      Etag = 30
   Else
      Etag = 29
  End If
End If
If Smon = 2 Then Etag = 29
If Smon = 4 Then Etag = 31
If Smon = 6 Then Etag = 31
If Smon = 9 Then Etag = 31
If Smon = 11 Then Etag = 31
If Stag = Etag Then
   Stag = 1
   Incr Smon
End If
If Smon = 13 Then
   Smon = 1
   Incr Sjah
End If
'-- ACHTUNG NECHSTE ROUTINEN (JAHRESTAG-, KW-, UND PIEPSTONE ROUTINEN) KÖNNEN ENTFÄLEN ! ---------------
'-------------------------------------------------------------------------------------------------------
'---- Berechnung jahrestages und KW (bei keine synchronisation Jtag=0)----------------------------------
'-------------------------------------------------------------------------------------------------------
If Ssek = 0 Then
 If Schalt = 0 Then                                           '31.29.31.30.31.30.31.31.30.31.30.31
  If Smon = 1 Then Jtag = Stag                                '0
  If Smon = 2 Then Jtag = 31 + Stag                           '31
  If Smon = 3 Then Jtag = 60 + Stag                           '31.29.
  If Smon = 4 Then Jtag = 91 + Stag                           '31.29.31.
  If Smon = 5 Then Jtag = 121 + Stag                          '31.29.31.30.
  If Smon = 6 Then Jtag = 152 + Stag                          '31.29.31.30.31.
  If Smon = 7 Then Jtag = 182 + Stag                          '31.29.31.30.31.30.
  If Smon = 8 Then Jtag = 213 + Stag                          '31.29.31.30.31.30.31.
  If Smon = 9 Then Jtag = 244 + Stag                          '31.29.31.30.31.30.31.31
  If Smon = 10 Then Jtag = 274 + Stag                         '31.29.31.30.31.30.31.31.30.
  If Smon = 11 Then Jtag = 305 + Stag                         '31.29.31.30.31.30.31.31.30.31.
  If Smon = 12 Then Jtag = 335 + Stag                         '31.29.31.30.31.30.31.31.30.31.30.
 Else
  If Smon = 1 Then Jtag = Stag                                '0
  If Smon = 2 Then Jtag = 31 + Stag                           '31
  If Smon = 3 Then Jtag = 59 + Stag                           '31.28.
  If Smon = 4 Then Jtag = 90 + Stag                           '31.28.31.
  If Smon = 5 Then Jtag = 120 + Stag                          '31.28.31.30.
  If Smon = 6 Then Jtag = 151 + Stag                          '31.28.31.30.31.
  If Smon = 7 Then Jtag = 181 + Stag                          '31.28.31.30.31.30.
  If Smon = 8 Then Jtag = 212 + Stag                          '31.28.31.30.31.30.31.
  If Smon = 9 Then Jtag = 243 + Stag                          '31.28.31.30.31.30.31.31
  If Smon = 10 Then Jtag = 273 + Stag                         '31.28.31.30.31.30.31.31.30.
  If Smon = 11 Then Jtag = 304 + Stag                         '31.28.31.30.31.30.31.31.30.31.
  If Smon = 12 Then Jtag = 334 + Stag                         '31.28.31.30.31.30.31.31.30.31.30.
 End If
 Temp2 = Jtag - Swta
 If Temp2 < 0 Then Temp2 = 0                                  'Bei negativen werten problemm 
 Temp3 = Temp2 / 7                                            'Volle wochen seit jahres anfang
 Kw = Temp3
 Temp3 = Temp3 * 7                                            'genaue tagesanzahl für volle wochen
 Temp4 = Temp2 - Temp3                                        'Tage in erste KW neues jahr (>4) oder letzte KW altes jahr (<5)
 If Temp4 > 4 Then                                            'wenn tages in jahresanfangswoche >4 dann erste KW in neue Jahr
     Kw = Kw + 2                                              'addieren erste woche und aktuelle woche
 End If
 If Temp4 < 5 Then                                            'wenn Tages in jahresanfangswoche <5 dann alle diese tage in letzte KW altes Jahr
      Kw = Kw + 1
 End If
 If Schalt = 0 Then
    Temp2 = Jtag - Swta                                       'wenn in altes jahr letzte woche noch bis mittwoch dann 1 KW
      If Temp2 > 362 Then Kw = 1
 Else
    Temp2 = Jtag - Swta                                       'wenn in altes jahr letzte woche noch bis mittwoch dann 1 KW
    If Temp2 > 361 Then Kw = 1                                'letzte Jahres tage können auch in neue Jahr 1 woche eintretten
 End If
End If
'Jtag => Jahrestag ab Jahresanfang
'Kw   => Berechnete KW (Kalender Woche)


'---------------------------------------------------------------------------------------------------------
'--- PIPSTONE BEI VOLLE STUNDE 56 bis 59 Kurz und bei 00 Lang  -------------------------------------------
'---------------------------------------------------------------------------------------------------------
If Ssek > 55 And Ssek < 60 Or Ssek = 0 Then
   If Ssek = 0 Then
     If Smin = 0 Then
       If Shsek > 0 And Shsek < 30 Then
        If Pipsen = 0 Then
         P3.7 = 0
         Pipsen = 1                                           'blokiert null sekunden piepsen (Bei DCF übernahme)
        End If
       Else
        P3.7 = 1
       End If
     End If
   Else
     If Smin = 59 Then
       If Shsek > 0 And Shsek < 10 Then
        P3.7 = 0
        Pipsen = 0                                            'schaltet null skunden piepsen wieder an
       Else
        P3.7 = 1
       End If
     End If
   End If
Else
 P3.7 = 1                                                     'Bei andere falle Piepston abschalten
End If
'---------------------------------------------------------------------------------------------------------
Return

'---------------------------------------------------------------------------------------------------------
'---- Interrupt1 Routine (DCF77 Empfanger INPUT LOW=>125 bis131ms INPUT HIGH=>227 bis 229ms --------------
'---- Interrupt Dauer 51 µs und bei DCF Decodieren (Volle minute) 8,5ms ----------------------------------
'---------------------------------------------------------------------------------------------------------

Int1_int:
If Dcfs < 202 And Dcfs > 196 Then                             'Minutensprung finden und DCF Dekodieren
                                                              'ACHTUNG bei andere empfänger eventuell anpassen
      If Dcfl > 17 Then                                       'Signall low oder high in DCF Array speichern
        Dcf(60) = 1                                           'wert von parity Date "58"bit noch speichern
      Else
        Dcf(60) = 0
      End If
   Shsek = 0
   Ssek = 0
    Gosub Dcfdecode                                           'DCF signall decodieren
   Pointer = 0
End If
Incr Pointer
                                                              'Kleiner 170ms => LOW  Grösser 170ms => High
If Dcfl > 17 Then                                             'Signall low oder high in DCF Array speichern
        Dcf(pointer) = 1
Else
        Dcf(pointer) = 0
End If
Dcfs = 0
Dcfl = 0
Return
'---------------------------------------------------------------------------------------------------------
'--- DCF77 DEKODIER SOFTWARE  ----------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------------------
Dcfdecode:
Dmin = 0                                                      'DCF minuten info
Dstd = 0                                                      'DCF Stunden info
Dtag = 0                                                      'DCF Tag info
Dwta = 0                                                      'DCF Wochen Tag info
Dmon = 0                                                      'DCF Monat info
Djah = 0                                                      'DCF Jahr info
Dcferm = 0                                                    'Minuten Patity error löschen
Dcfers = 0                                                    'Stunden Patity error löschen
Dcferd = 0                                                    'Datum Patity error löschen
Par = 0                                                       'Parity=0
For I = 1 To 8                                                'scann Array für minuten
  Pointer = I + 22
    If Dcf(pointer) = 1 Then
        If I = 1 Then
          Dmin = Dmin + 1
          Par = Par + 1
        End If
        If I = 2 Then
          Dmin = Dmin + 2
          Par = Par + 1
        End If
        If I = 3 Then
          Dmin = Dmin + 4
          Par = Par + 1
        End If
        If I = 4 Then
          Dmin = Dmin + 8
          Par = Par + 1
        End If
        If I = 5 Then
          Dmin = Dmin + 10
          Par = Par + 1
        End If
        If I = 6 Then
          Dmin = Dmin + 20
          Par = Par + 1
        End If
        If I = 7 Then
          Dmin = Dmin + 40
          Par = Par + 1
        End If
        If I = 8 Then
        Par = Par + 1
        End If
    End If
        Dcferm = Par Mod 2                                    'parity minuten test
Next I
Par = 0
For I = 1 To 7                                                'scann Array für Stunden
  Pointer = I + 30
    If Dcf(pointer) = 1 Then
        If I = 1 Then
          Dstd = Dstd + 1
          Par = Par + 1
        End If
        If I = 2 Then
          Dstd = Dstd + 2
          Par = Par + 1
        End If
        If I = 3 Then
          Dstd = Dstd + 4
          Par = Par + 1
        End If
        If I = 4 Then
          Dstd = Dstd + 8
          Par = Par + 1
        End If
        If I = 5 Then
          Dstd = Dstd + 10
          Par = Par + 1
        End If
        If I = 6 Then
          Dstd = Dstd + 20
          Par = Par + 1
        End If

        If I = 7 Then
        Par = Par + 1
        End If
    End If
        Dcfers = Par Mod 2                                    'parity stunden test
Next I

Par = 0
For I = 1 To 23                                               'scann Array für Tag bis Jahr
  Pointer = I + 37
    If Dcf(pointer) = 1 Then
        If I = 1 Then
          Dtag = Dtag + 1
          Par = Par + 1
        End If
        If I = 2 Then
          Dtag = Dtag + 2
          Par = Par + 1
        End If
        If I = 3 Then
          Dtag = Dtag + 4
          Par = Par + 1
        End If
        If I = 4 Then
          Dtag = Dtag + 8
          Par = Par + 1
        End If
        If I = 5 Then
          Dtag = Dtag + 10
          Par = Par + 1
        End If
        If I = 6 Then
          Dtag = Dtag + 20
          Par = Par + 1
        End If
        If I = 7 Then
          Dwta = Dwta + 1
          Par = Par + 1
        End If
        If I = 8 Then
          Dwta = Dwta + 2
          Par = Par + 1
        End If
        If I = 9 Then
          Dwta = Dwta + 4
          Par = Par + 1
        End If
        If I = 10 Then
          Dmon = Dmon + 1
          Par = Par + 1
        End If
        If I = 11 Then
          Dmon = Dmon + 2
          Par = Par + 1
        End If
        If I = 12 Then
          Dmon = Dmon + 4
          Par = Par + 1
        End If
        If I = 13 Then
          Dmon = Dmon + 8
          Par = Par + 1
        End If
        If I = 14 Then
          Dmon = Dmon + 10
          Par = Par + 1
        End If
        If I = 15 Then
          Djah = Djah + 1
          Par = Par + 1
        End If
        If I = 16 Then
          Djah = Djah + 2
          Par = Par + 1
        End If
        If I = 17 Then
          Djah = Djah + 4
          Par = Par + 1
        End If
        If I = 18 Then
          Djah = Djah + 8
          Par = Par + 1
        End If
        If I = 19 Then
          Djah = Djah + 10
          Par = Par + 1
        End If
        If I = 20 Then
          Djah = Djah + 20
          Par = Par + 1
        End If
        If I = 21 Then
          Djah = Djah + 40
          Par = Par + 1
        End If
        If I = 22 Then
          Djah = Djah + 80
          Par = Par + 1
        End If
        If I = 23 Then
          Par = Par + 1
        End If
    End If
        Dcferd = Par Mod 2                                    'parity test für letzte daten block
Next I
Dcferr = Dcferm + Dcfers                                      'Globale Parity error erzeugen
Dcferr = Dcferr + Dcferd

If Djah = 0 Then Return                                       'bei keine empfang parity ist auch OK aber
If Dwta = 0 Then Return                                       'DCF signall ist auch faisch
If Dmon = 0 Then Return
If Dtag = 0 Then Return
If Dcferr = 0 Then                                            'wenn daten ok dann softuhr setzen
   Shsek = 0                                                  '0.01s und sekunden synchronisieren
   Ssek = 0
   Smin = Dmin                                                'Alle DCF dekodierte werte in softuhr übernemen
   Sstd = Dstd
   Stag = Dtag
   Swta = Dwta
   Smon = Dmon
   Sjah = Djah
End If
Return




'---------------------------------------------------------------------------------------------------------
'--- LCD DISPLAY ANZEIGE ROUTINE --- KANN DURCH USER BELIEBIG GEENDERT WERDEN ----------------------------
'---------------------------------------------------------------------------------------------------------
Displayuhr:                                                   'softuhr anzeigen
If Dcfs > 240 Then Dcferr = 1                                 'wenn keine impulse von DCF empfanger auch Parity error setzen

Upperline                                                     'uhr zeit zeigen
 If Sstd < 10 Then
   Lcd "0" ; Sstd ; ":" ;
 Else
   Lcd Sstd ; ":" ;
 End If
 If Smin < 10 Then
   Lcd "0" ; Smin ; ":" ;
 Else
   Lcd Smin ; ":" ;
 End If
 If Ssek < 10 Then
   Lcd "0" ; Ssek ;
 Else
   Lcd Ssek ;
 End If
                                                               'Wochentag decodieren
 If Swta = 0 Then                                             'wenn noch keine daten dann Synchro
   Lcd " SYNCHRO";
 End If
 If Swta = 1 Then
   Lcd "  MO";
 End If
 If Swta = 2 Then
   Lcd "  DI";
 End If
 If Swta = 3 Then
   Lcd "  MI";
 End If
 If Swta = 4 Then
   Lcd "  DO";
 End If
 If Swta = 5 Then
   Lcd "  FR";
 End If
 If Swta = 6 Then
   Lcd "  SA";
 End If
 If Swta = 7 Then
   Lcd "  SO";
 End If
 If Dcferr = 0 Then
Lcd " DCF  ";                                                 'DCF OK
Else
Lcd " XTL  ";                                                 'Wenn keine DCF synchro dann Quarz UHR Modus
End If
Lowerline
 If Stag < 10 Then
   Lcd "0" ; Stag ; "." ;
 Else
   Lcd Stag ; "." ;
 End If
  If Smon < 10 Then
   Lcd "0" ; Smon ; "." ;
 Else
   Lcd Smon ; "." ;
 End If
 If Sjah < 10 Then
   Lcd "200" ; Sjah ;
 Else
   Lcd "20" ; Sjah ;
 End If
If Jtag > 0 Then
     If Kw > 9 Then
      Lcd "  KW" ; Kw ;
    Else
      Lcd "  KW0" ; Kw ;
    End If
Else
  Lcd " QUARZ"
End If
Return
Hier übrigens ein Thread der zufällig "dcf77-empfang mit bascom...?" heißt:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=2991

und hier der Interessante Link: http://www.mcselec.com/an_122.htm

Viel Spaß

MFG Moritz