Zeitanzeige mit DCF77

Hier können Sie ihre eigenen Projekte vorstellen
Antworten
Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Zeitanzeige mit DCF77

Beitrag von Heinrichs » So 10. Jun 2012, 18:13

Für wenige Euro lassen sich inzwischen Funkuhrmodule erstehen, welche die vom Zeitsignalsender DCF77 in der Nähe von Frankfurt ausgesendeten Langwellensignale empfangen und in TTL-ähnliche Signale umsetzen können. Innerhalb einer Minute wird ein Datenpaket ausgesendet; dieses besteht aus einzelnen Bits, welche im Abstand von einer Sekunde gesendet werden: Ein langer Puls (200 ms) steht dabei für eine 1 und ein kurzer Puls (100 ms) für eine 0.

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.

dcf1_klein.jpg
DCF1-Modul von Pollin
dcf1_klein.jpg (10.37 KiB) 24692 mal betrachtet

Der Baustein hat lediglich 4 Anschlüsse:

dcf1_pins_klein.jpg
Pins beim DCF1-Modul
dcf1_pins_klein.jpg (5.1 KiB) 24692 mal betrachtet
dcf1_pinnbelegung.jpg
Pinbelegung beim DCF1
dcf1_pinnbelegung.jpg (39.64 KiB) 24692 mal betrachtet

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

Bei Inbetriebnahme unserer Funkuhr muss beachtet werden: Das DCF1-Modul braucht gegebenenfalls ein paar Minuten, um sich korrekt einzuschwingen. Die erste Anzeige wird in der Regel auch nicht korrekt sein, weil das Programm ja nur selten seine Arbeit beginnt, wenn gerade das Bit 0 empfangen wird.

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.

.
Dateianhänge
DCF-Paket1.zip
PDF-Datei und BAS-Source
(129.7 KiB) 1588-mal heruntergeladen
dcf77a.zip
Video mit DCF77-Signalen
(896.75 KiB) 2409-mal heruntergeladen
Zuletzt geändert von Heinrichs am Mo 24. Sep 2018, 12:48, insgesamt 4-mal geändert.

M-5
Beiträge: 1
Registriert: Do 21. Nov 2013, 16:15

Re: Zeitanzeige mit DCF77

Beitrag von M-5 » So 24. Nov 2013, 21:20

Hallo Hr. Heinrichs.

Kurze Frage:
"...Die Datenleitung DATA schließen wir an PORTD.3 an. Dadurch können durch die DATA-Signale INT1-Interrupts ausgelöst werden. (Der Eingang PortB.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.)..."

Ist INT0 nicht auf PortD.2 anstatt wie beschrieben auf PortB.2?

Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Re: Zeitanzeige mit DCF77

Beitrag von Heinrichs » So 1. Dez 2013, 18:54

Hallo,

völlig richtig! Es muss natürlich PortD.2 sein. Vielen Dank für den Hinweis!

G. Heinrichs

Antworten