Funkuhrmodul FUM DCF U an ATmega32 mit Datum und Zeitausgabe auf einem I2C-Display

 
Funkuhrmodul FUM oben Funkuhrmodul FUM unten
   

Das Funkuhrmodul FUM DCF U ist eine komplette Funkuhrempfangs- und Auswerteeinheit mit serieller Datenausgabe.
Die dekodierte und geprüfte Zeitinformation bildet die interne Zeitbasis für das Modul und wird am Modul-Ausgang X4 (RS232-OUT) bereitgestellt. Mit entsprechender Pegelanpassung läßt ssich das Modul direkt mit der seriellen Schnittstelle des PCs verbinden. Die geprüfte Zeitinformation wird im Klartext einschließlich Statusinformationen ausgegeben. Der Funkempfang wird automatisch gestartet. Das Funkuhrmodul xxx U verfügt zusätzlich über einen Spannungscontroller, der die anliegende Spannung überwacht und das Ergebnis über das Protokoll ausgibt.
Die Betriebsspannung beträgt 1,8 bis 3V. Ein einfacher LM317 mit 2 Widerständen beschaltet erzeugt aus einer Eingansspannung von 5 bis 37V die benötigten 3V.
Der Pin X3 - RS232 - IN scheint ein 3V Eingang zu sein, also niemals mit einer echten RS-232 Schnittstelle (+/- 12V Pegel) verbinden. Ich habe ihn in meiner Schaltung freigelassen. Die Baudrateneinstellung ist ein wenig eigenwillig, nur 300 Baud reichen nicht. Die Schnittstelle ist auf 300 Baud, 7 Bits, GERADE Parität und 2 Stopbits einzustellen.
Das macht der Befehl: Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 2 , Databits = 7 , Clockpol = 0


DCF77 Antenne

Links die 60mm lange auf 77,5kHz abgestimmte Antenne.
Sie ist im Lieferumfang des Funkmoduls nicht enthalten

Das folgenden BASCOM Programm liest das Funkuhrmodul aus und zeigt Zeit, Datum und Statusinformation auf einem I2C-Display an. Über den Print Befehl kann diese Information auf die serielle Schnittstelle des ATmega32 ausgegeben und über ein Funkmodul weitergereicht werden.
   

' Programm: Funkuhrmodul DCF an RS232
' Version: V1.1
' Author: Peter Plischka
' Copyright ©2008 by Peter Plischka
' Web: plischka.at
' Datum: 31.05.2008
'
' Funkuhrmodul FUM DCF direkt an RS232 (+/- 12V) von ATMega32 (Pollin-Board) angeschlossen
' VDD FUM = 1,8 bis 3.0V über LM317 (Eingangsspannung 5 - 37V)
'
' Schnittstelle auf 300 Baud, 7 Bits, GERADE Parität und 2 Stopbits einstellen
' DSUB-9 male Funkuhrmodul
' Pin3 Ausgang FUM = Pin X4 (RS232 - OUT)
' Pin5 Masse = Pin X2 (GND)
'
' Das Modul sendet: 120804631050823
' Zeit WT Datum Status
' 120804 6 310508 23
' Ausgabe der Zeit und Datumsinformation auf einem 16*2 I2C-Display
'
' Änderung : Zeitstring mit 300 Baud 7E2 auf RS232 ausgeben

'----------------- Init
$regfile = "m32def.dat"
$hwstack = 128
$swstack = 128
$framesize = 128
$crystal = 16000000 '
$baud = 300
Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 2 , Databits = 7 , Clockpol = 0
'----------------- Ende Init

'----------------- Leds
Config Pind.6 = Output 'LED 1
Config Pind.5 = Output 'LED 2
Led1 Alias Portd.6
Led2 Alias Portd.5
'----------------- Ende Leds

'--------------------------Für I2C LCD -----------------------------------------
Config Scl = Portc.0
Config Sda = Portc.1
Const Pcf8574_lcd = &H70 'Basisadresse PCF8574AP
$lib "Lcd_i2c.lib" 'I2C Treiber für das LCD
Dim _lcd_e As Byte 'Um auch LCDs mit 2 Controllern nutzen zu können.
_lcd_e = 128 'Für LCDs mit 1 Controler
Waitms 200 'WICHTIG! ggf. erhöhen
Config Lcd = 16 * 2
'-------------------------------------------------------------------------------

'----------------- Variablen
Dim Zeichenspeicher As String * 20 , Zeitspeicher As String * 20 , Datumspeicher As String * 20
Dim Dcf_std As String * 2 , Dcf_min As String * 2 , Dcf_sec As String * 2
Dim Dcf_jahr As String * 2 , Dcf_mon As String * 2 , Dcf_tag As String * 2 , Dcf_wtag As String * 2
Dim Dcf_bit16_19 As String * 2 , Dcf_status As String * 2
Dim Rx_data As String * 20
Dim E_byte As Byte , E_flag As Byte
Dim Dcf_sec_byte As Byte , I As Byte
Dcf_sec_byte = 99
'----------------- Ende Variablen

'----------------- UART vorbereiten
On Urxc Empfang 'ISR Empfangsroutine
Enable Urxc
Enable Interrupts
'----------------- Ende UART vorbereiten

Cls
'----------------- Mainprogramm
Do

If E_flag = 3 Then 'Empfangsstring komplett

Zeichenspeicher = Rx_data
Dcf_std = Mid(zeichenspeicher , 1 , 2) : Dcf_min = Mid(zeichenspeicher , 3 , 2) : Dcf_sec = Mid(zeichenspeicher , 5 , 2)
Dcf_wtag = Mid(zeichenspeicher , 7 , 2)
Dcf_tag = Mid(zeichenspeicher , 8 , 2) : Dcf_mon = Mid(zeichenspeicher , 10 , 2) : Dcf_jahr = Mid(zeichenspeicher , 12 , 2)
Dcf_bit16_19 = Mid(zeichenspeicher , 14 , 1) : Dcf_status = Mid(zeichenspeicher , 15 , 1)
Zeitspeicher = Dcf_std
Zeitspeicher = Zeitspeicher + ":"
Zeitspeicher = Zeitspeicher + Dcf_min
Zeitspeicher = Zeitspeicher + " "
Zeitspeicher = Zeitspeicher + Dcf_sec
Datumspeicher = Dcf_tag
Datumspeicher = Datumspeicher + "."
Datumspeicher = Datumspeicher + Dcf_mon
Datumspeicher = Datumspeicher + "."
Datumspeicher = Datumspeicher + "20"
Datumspeicher = Datumspeicher + Dcf_jahr

Rx_data = "" 'Befehl löschen
E_flag = 0 'Empfang neu setzen
End If

If Dcf_sec_byte <> Val(dcf_sec) Then
Dcf_sec_byte = Val(dcf_sec)
Led2 = 0
Locate 1 , 1 : Lcd Zeitspeicher
Locate 2 , 1 : Lcd Datumspeicher
Locate 2 , 13 : Lcd Dcf_bit16_19
Locate 2 , 15 : Lcd Dcf_status
Print Zeitspeicher
Led2 = 1
End If
' Dcf_sec_byte = Val(dcf_sec)
Loop
End
'----------------- Ende Mainprogramm

'----------------- Empfang
Empfang:
Led1 = 0
E_byte = Udr
Select Case E_byte
Case 13 : E_flag = 3 '"ENTER" = Empfang komplett
Case Else : Rx_data = Rx_data + Chr(e_byte)
End Select
Led1 = 1
Return
'----------------- Ende Empfang