'-------------------------------------- ' ' DCF77 Uhr mit Mega8 ' '-------------------------------------- $regfile = "m8def.dat" $crystal = 8000000 '$baud = 38400 Config Pind.4 = Output Config Pind.2 = Output ' 'Config LCD ' Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Config Lcd = 16 * 2 'configure lcd screen Initlcd Cursor Off Cls Dim E As Byte Dim D As Byte Dim C As Byte Dim Dow As Byte Dim Count As Byte Dim Countold As Byte Dim Wcount As Word Dim Minute As Byte Dim Stunde As Byte Dim Tag As Byte Dim Wota As Byte Dim Monat As Byte Dim Jahr As Byte Dim Parity As Byte Dim Tagminute(3) As Word Dim Tag_datum(3) As Word Dim Dcfbit0 As Bit Dim Dcfbit1 As Bit Dim Dcfdetect As Bit Dim Error As Bit Dim Sync As Bit Dim Setbit As Bit Dim Outstring As String * 3 Dim Lcdoutstring As String * 14 On Icp1 Oncapture 'Interrupt-Routine Sync = 0 Setbit = 0 Dcfdetect = 0 Set Portd.2 Set Portd.4 Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Rising Enable Icp1 Enable Interrupts 'Interrupts global Locate 1 , 1 Lcd "** DCF-77 Uhr **" Deflcdchar 0 , 21 , 10 , 4 , 10 , 21 , 4 , 4 , 4 ' replace ? with number (0-7) Main: Do Loop Until Dcfdetect = 1 If Countold <> Count Then Gosub Decode If Count = 59 Then Count = 60 Dow = Makedec(wota) Dow = Dow - 1 Outstring = Lookupstr(dow , Wotadata) Lcdoutstring = Outstring Lcdoutstring = Lcdoutstring + " " E = Makedec(tag) Outstring = Str(e) Outstring = Format(outstring , "00") Lcdoutstring = Lcdoutstring + Outstring Lcdoutstring = Lcdoutstring + "." E = Makedec(monat) Outstring = Str(e) Outstring = Format(outstring , "00") Lcdoutstring = Lcdoutstring + Outstring Lcdoutstring = Lcdoutstring + " " E = Makedec(stunde) Outstring = Str(e) Outstring = Format(outstring , "00") Lcdoutstring = Lcdoutstring + Outstring Lcdoutstring = Lcdoutstring + ":" E = Makedec(minute) Outstring = Str(e) Outstring = Format(outstring , "00") Lcdoutstring = Lcdoutstring + Outstring Locate 2 , 1 Lcd Lcdoutstring Gosub Synctest Gosub Nullen Countold = Count End If If Sync = 1 Then Reset Portd.2 Else Set Portd.2 End If Goto Main ' Synctest: D = D + 1 Tagminute(d) = Makedec(stunde) * 60 Tagminute(d) = Tagminute(d) + Makedec(minute) Tag_datum(d) = Makedec(monat) * 30 Tag_datum(d) = Tag_datum(d) + Makedec(tag) If D = 3 Then Tagminute(1) = Tagminute(1) + 2 Tagminute(2) = Tagminute(2) + 1 If Tagminute(1) = Tagminute(2)then If Tagminute(2) = Tagminute(3) Then If Tag_datum(1) = Tag_datum(2) Then If Tag_datum(2) = Tag_datum(3) Then Sync = 1 End If End If End If End If D = 0 End If Return ' ' Interrupt Service ' Oncapture: 'Timer1-Capture Wcount = Timer1 'Erst Wert sichern Timer1 = 0 'Sofort Timer-Reset Wcount = Wcount \ 78 '1/100 Sekunde Count = Count + 1 If Wcount > 150 Then Dcfdetect = 1 Count = 1 Dcfbit1 = 0 Dcfbit0 = 0 End If If Dcfdetect = 0 Then Goto Nextbit If Portd.4 = 0 Then Set Portd.4 Locate 2 , 16 Lcd " " Else Reset Portd.4 Locate 2 , 16 Lcd Chr(0) End If If Wcount < 85 Then Dcfdetect = 0 Sync = 0 Goto Nextbit End If 'Hauptschleife If Wcount < 150 And Dcfdetect = 1 Then Gosub Testbit Nextbit: Return ' ' Decodieren DCF77 Signal ' Decode: Select Case Count Case 1 To 21 'nicht codiert Case 22 To 28 'Code Minute C = Count - 22 If Dcfbit0 = 1 Then Set Minute.c Else Reset Minute.c End If Case 29 If Dcfbit0 = 1 Then Set Parity.3 'Parity Bit Else Reset Parity.3 End If Case 30 To 35 C = Count - 30 If Dcfbit0 = 1 Then Set Stunde.c 'Code Stunde Else Reset Stunde.c End If Case 36 If Dcfbit0 = 1 Then 'Parity Bit Set Parity.4 Else Reset Parity.4 End If Case 37 To 42 C = Count - 37 If Dcfbit0 = 1 Then Set Tag.c Else Reset Tag.c End If Case 43 To 45 C = Count - 43 If Dcfbit0 = 1 Then Set Wota.c Else Reset Wota.c End If Case 46 To 50 C = Count - 46 If Dcfbit0 = 1 Then Set Monat.c Else Reset Monat.c End If Case 51 To 58 C = Count - 51 If Dcfbit0 = 1 Then Set Jahr.c Else Reset Jahr.c End If Case 59 If Dcfbit0 = 1 Then Set Parity.5 Else Reset Parity.5 End If End Select Countold = Count Return ' ' Prüfen ob 0 oder 1 ' Testbit: If Dcfbit1 = 0 And Wcount > 105 Then Dcfbit0 = 1 Dcfbit1 = 1 Elseif Dcfbit1 = 1 And Wcount < 95 Then Dcfbit0 = 0 Dcfbit1 = 0 Elseif Dcfbit1 = 1 And Wcount > 95 Then Dcfbit0 = 1 Elseif Dcfbit1 = 0 And Wcount > 95 Then Dcfbit0 = 0 End If Return ' ' Löschen Variablen für nächsten Durchlauf ' Nullen: Minute = 0 Stunde = 0 Tag = 0 Wota = 0 Monat = 0 Jahr = 0 Parity = 0 Return Wotadata: Data "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"