Die Bedeutung der einzelnen Bits ergibt sich aus folgender Tabelle:
Code: Alles auswählen
Bit Bedeutung Wert
0 Start einer neuen Minute immer 0
1-14 Wetterdaten von Meteotime (verschlüsselt!)
...
20 Beginn der Zeitinformation immer 1
21 Minuten (Einer) 1 entspricht 1 Minute
22 Minuten (Einer) 1 entspricht 2 Minuten
23 Minuten (Einer) 1 entspricht 4 Minuten
24 Minuten (Einer) 1 entspricht 8 Minuten
25 Minuten (Zehner) 1 entspricht 10 Minuten
26 Minuten (Zehner) 1 entspricht 20 Minuten
27 Minuten (Zehner) 1 entspricht 40 Minuten
28 Parität Minuten (Prüfbit)
29 Stunden (Einer) 1 entspricht 1 Stunde
30 Stunden (Einer) 1 entspricht 2 Stunden
31 Stunden (Einer) 1 entspricht 4 Stunden
32 Stunden (Einer) 1 entspricht 8 Stunden
33 Stunden (Zehner) 1 entspricht 10 Stunden
34 Stunden (Zehner) 1 entspricht 20 Stunden
35 Parität Stunden (Prüfbit)
36 ...
Die restlichen Bits stellen u. A. Informationen zum Datum dar. Das Bit 59 wird nicht ausgesendet. Dadurch entsteht eine Pause zwischen zwei Signalen, welche länger als 1 Sekunde ist. Diese Pause markiert das Ende einer Minute.
Die Pulsfolge lässt sich recht einfach mit einem Mikrocontroller auswerten und auf einem LCD ausgeben. Wie das geht, soll hier am Beispiel des Funkuhr-Moduls DCF1 von Pollin gezeigt werden. Die folgenden 3 Abbildungen entstammen der Pollin-Anleitung.
Der Baustein hat lediglich 4 Anschlüsse:
Die Spannungsversorgung erfolgt über die Anschlüsse GND (Masse) und VCC (2 bis 3 Volt). Keineswegs darf der Baustein mit 5 Volt betrieben werden; er könnte dadurch zerstört werden. Wir stellen deswegen das Potentiometer auf der Attiny-Platine zuerst mithilfe eines Spannungsmessgerätes auf 3 Volt ein und schließen erst dann das DCF1-Modul an dieses Poti an (VCC an Poti-Ausgang, GND an Masse der Platine). Ebenso wird der PON-Eingang (Power-On) an Masse angeschlossen. Laut Pollin-Anleitung wird das DCF1-Modul durch eine negative Flanke am PON-Eingang eingeschaltet. Meine Erfahrung zeigt aber, dass es ausreicht, diesen Eingang von vorne herein auf 0 zu legen.
Die Datenleitung DATA schließen wir an PORTD.3 an. Dadurch können durch die DATA-Signale INT1-Interrupts ausgelöst werden. (Der Eingang PortD.2, welcher INT0-Interrupts auslöst, kann auf der Attiny-Platine nicht benutzt werden, weil er zum Entprellen des Tasters Ta0 über einen Kondensator an Masse angeschlossen ist; dieser Kondensator würde die DATA-Signale verfälschen.) Die Verbindung zu PortD.3 darf aber erst hergestellt werden, wenn das Programm auf dem Attiny bereits läuft - erkennbar an der LCD-Ausgabe “DCF-Zeit”; ansonsten wird der Bootloader aktiviert.
Einzelheiten zum Programm kann man den Kommentaren zum Sourcecode entnehmen. Dieser ist bewusst einfach gehalten und kann bei Bedarf leicht ausgebaut werden.
Code: Alles auswählen
' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Gibt Stunden, Minuten und Sekunden an LCD aus.
' DCF1 von Pollin an Attiny:
' VDD an +2,5V (!)
' GND an Masse
' PON an Masse
' DATA an PortD.3 <-Kabel-> D3 (Eingang; INT1; >>>Doch<<< Pull-Up)
' Das Kabel von DATA nach D3 darf erst nach dem Einschalten des
' Mikrocontrollers gesetzt werden; sonst täuscht der DCF-Baustein ein
' Drücken von Ta1 vor -> Probleme beim Bootloader!
' LCD an PortB
' LED zur Kontrolle an PortD.6
' Antenne horizontal und senkrecht zum DCF-Sender
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$baud = 9600
'**********************************************************
'******************* Deklarationen ************************
Dim Werte(40) As Byte
Dim Zaehler As Byte
Dim Minuten As Byte
Dim M1 As Byte
Dim S1 As Byte
Dim Stunden As Byte
Dim Sekunden As Byte
Dim Zeit As String * 8
Declare Sub Auswerten()
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B00001000 'PortD. 3 auf high legen
Config Lcd = 16 * 2 'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.6
Cursor Off
Enable Int1 'vgl. BASCOM-Hilfe...
Config Int1 = Rising
Enable Interrupts
On Int1 Signal
Config Timer1 = Timer , Prescale = 1024
'**********************************************************
'******************** Hauptprogramm ***********************
Wait 3
Cls
Lcd "DCF-Zeit:"
Zaehler = 0
Minuten = 0
Stunden = 0
Sekunden = 0
Do
Loop
'**********************************************************
'******************* Unterprogramme ***********************
Sub Auswerten()
'Hier werden die Minuten und Stunden aus den Bits 22 bis 34 berechnet
Minuten = Werte(21)
M1 = Werte(22) * 2
Minuten = Minuten + M1
M1 = Werte(23) * 4
Minuten = Minuten + M1
M1 = Werte(24) * 8
Minuten = Minuten + M1
M1 = Werte(25) * 10
Minuten = Minuten + M1
M1 = Werte(26) * 20
Minuten = Minuten + M1
M1 = Werte(27) * 40
Minuten = Minuten + M1
Stunden = Werte(29)
S1 = Werte(30) * 2
Stunden = Stunden + S1
S1 = Werte(31) * 4
Stunden = Stunden + S1
S1 = Werte(32) * 8
Stunden = Stunden + S1
S1 = Werte(33) * 10
Stunden = Stunden + S1
S1 = Werte(34) * 20
Stunden = Stunden + S1
'Anzeige auf LCD
Locate 2 , 1
If Stunden < 10 Then Lcd "0"
Lcd Stunden ; ":"
If Minuten < 10 Then Lcd "0"
Lcd Minuten ; ":"
End Sub
'**********************************************************
'******************Interruptroutinen***********************
Signal:
Portd.6 = 1 'Sekundenblinker
Waitms 150
Portd.6 = 0
Zaehler = Zaehler + 1
'Wenn kurzes Signal (100 ms), dann jetzt Pind.3 = 0 -> logisch 0, sonst logisch 1
'Nur die ersten 36 Bits zur späteren Auswertung speichern
If Zaehler <= 36 Then
If Pind.3 = 0 Then Werte(zaehler) = 0 Else Werte(zaehler) = 1
End If
'Timer1 gibt die Zeit seit dem letzten INT1-Interrupt (minus 150 ms) an.
'Bei der 59. Sekunde gibt es kein Signal, also wird beim nächsten INT1-Interrupt
'[Minute voll] die Zeit von 1 s überschritten;
'dann ist eine Auswertung der empfangenen Bits fällig.
If Timer1 > 6000 Then 'also nach mehr als ca. 1,5 s
Call Auswerten() 'nur bei voller Minute auswerten, anzeigen und
Zaehler = 0 'Zähler zurücksetzen
End If
'Bei jedem INT1-Interrupt:
Timer1 = 0 '
Sekunden = Zaehler
Locate 2 , 7
If Sekunden < 10 Then Lcd "0"
Lcd Sekunden
Return
Wichtig ist auch, eine günstige Lage für die Ferrit-Antenne zu finden. Sie sollte senkrecht zu der Verbindungslinie zwischen Standort der Uhr und dem Sender nahe Frankfurt liegen. Als kleine Hilfe zur Kontrolle kann man sich über eine LED an PortD.6 das Empfangssignal anzeigen lassen: Bei gutem Empfang sollte die Leuchtdiode im Sekundenrhythmus aufblinken; kurze Lichtblitze stehen für Nullen, etwas längere für Einsen.
.