DCF-77 läßt sich nicht auswerten
Einen guten Tag!
Versuche schon seit einiger Zeit dabei die Uhrzeit usw. mit dem DCF-77 und meinem Microcontroler zu verwenden. Ich habe das Board myavr mit einem ATMega8 und den Bascom-Compilerr als Freeware.
Hier im Forum habe ich den ein oder andern Code gefunden der eigentlich laufen sollte. Eine Echtzeituhr habe ich nicht. Hat hier jemand einen Code, mit dem man das DCF-77 Signal auswerten und auf dem Display meines Boards darstellen kann. Als DCF-77 Decoder habe ich das Teil con Conrad. Dieses hat einen invertierenden und ein nicht-invertiernden Ausgang. Entsprechend der Beschreibung kann man amDCF-77 Decoder noch einen Pull-up Wiederstand anschließen.
Mit dem DebuggerProgramm, welches "albundy" hier im Forum eingestellt hat, kommt auch bei Pausenlänge = 0 und bei Impulslänge = 1 raus. Den Code den ich verwende ist auch von "albundy" .
Die Ports sowohl in der Hauptprogramm als auch in der Lib habe ich geändert (Portc.1) mit Pinc $13 in der Lib. Die geänderte Lib habe ich compiliert und anschließend auch das Haußtprogramm.
Die Lib liegt im entsprechenden Lib-Ordner von Bascom.
Was kann da noch falsch sein!!!!
Danke schonmal hier
Martin
PS: Auch nochmals Danke an "albundy" der mir bereits einiges an Hilfestellungen gegeben hat.
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von albundy
Hallo Martin,
Zitat:
Ein teil funktioniert! Im Debuggermodus werden Zeiten angezeigt.
'---> Die Impulslänge sollte zwischen 2 und 8 liegen
'---> Die Pausenlänge sollte zwischen 70 und 90 liegen
'---> Der Impulszähler sollte gleichmässig im Sekundentakt bis 59 hochzählen
'---> Die Parität sollte ab dem 36.Impuls auf "1" gehen
was genau stimmt davon, und was nicht ?
Hallo AlBundy
Ich habe ein Modul von Reichelt. Mit deiner Lib komme ich gut klar. Die Zeit wird aber nicht synchr.
Folgende Debug Ausgaben:
Impulslänge: immer 1
Pausenlänge zwishcen 72 und 74
Impulszähler: zählt schön bis 59 und setzt sich bei Minutendurchgang auf Null
Pari: geht nie auf 1
Imp_OK: geht nie auf 1
Was kann ich noch tun?
Die Soft Uhr läuft schön hoch. War schon bei ein paar Stunden.
In der Anlage das Datenblatt und das Listing. Der Empfänger hat schon mit dem Programm von Wastl (decodiert nicht mit Timer, sondern auf Anforderung mit Taster in einem Sub) funktioniert. Nur leider ist der MC dann für mind. 1 Minute blockiert.
Code:
'*******************************************************************************
'* DEMO für DCF77 Library *
'* *
'* Funktion der Library im "Readme.txt" *
'*******************************************************************************
$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
$baud = 19200
'-------------------------------------------------------------------------------
Config Pind.6 = Output
'----- GLCD --------------------------------------------------------------------
'Config GLCD Backlight
Config Pind.5 = Output 'Pin for PWM Signal
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
Dim Dimmen As Byte
'Config GLCD KS0108
'First we define that we use a graphic GLCD
'The dataport is the portname that is connected to the data lines of the LCD
'The controlport is the portname which pins are used to control the lcd
'CE =CS1 Chip select first chip
'CE2=CS2 Chip select second chip
'CD=Data/instruction
'RD=Read
'RESET = reset
'ENABLE= Chip Enable
$lib "glcdKS108.lib"
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 1 , Ce2 = 0 , Cd = 5 , Rd = 4 , Reset = 2 , Enable = 3
'-------------------------------------------------------------------------------
'GLCD Initialisieren und Licht an
Dimmen = 128 ' Wert für die Helligkeit der LED Beleuchtung
'Compare1a = Dimmen 'PWM Signal
Setfont Font6x8 'Schrifgröße setzen
Cls 'LCD löschen
'-------------------------------------------------------------------------------
$lib "dcf77.lib"
$external Dcf77
Declare Sub Dcf77
Config Timer0 = Timer , Prescale = 1024 'Timer für 40Hz (25ms)
Const Startwert = 56
Timer0 = Startwert
On Timer0 Tim0_isr 'Überlauf alle 25ms
Enable Interrupts
Enable Timer0
'------------------------ Pin für DCF Eingang definieren -----------------------
' jeder Portpin kann benutzt werden.
' Auch in der "Dcf77.lib" entsprechend anpassen !!!
Config Pind.3 = Input 'DCF 77 Eingang
'Set Porta.7 'Pullup einschalten
'--------------------- Variablen für DCF Routine -------------------------------
Dim Status As Byte , Zaehler As Byte , Buffer As Byte , Impuls As Byte
Dim H_sek As Byte , Sekunde As Byte , T_min As Byte , T_std As Byte
Dim Minute As Byte , Stunde As Byte , Wotag As Byte , Tag As Byte
Dim Monat As Byte , Jahr As Byte , Pari As Byte , Pau As Byte , Imp As Byte
'-------------------------------------------------------------------------------
'------------ Wichtig bei internem RC Oszillator !!! ---------------------------
'Osccal = 184 'int. Oszillator kallibrieren
'-------------------------------------------------------------------------------
'******************** HAUPTPROGRAMM ********************************************
Do
If Stunde < 10 Then Lcdat 1 , 1 , "0" ; Stunde ; ":" Else Lcdat 1 , 1 , ; Stunde ; ":"
If Minute < 10 Then Lcdat 1 , 19 , "0" ; Minute ; ":" Else Lcdat 1 , 19 , ; Minute ; ":"
If Sekunde < 10 Then Lcdat 1 , 37 , "0" ; Sekunde ; Else Lcdat 1 , 37 , ; Sekunde
'If H_sek > 20 Then 'Doppelpunkt blinken lassen
' Locate 1 , 12
' Lcd " "
'End If
If Status.3 = 1 And Status.4 = 1 Then
' Lcdat 2 , 1 , ; Lookupstr(wotag , Wochentag) ; ", "
If Tag < 10 Then Lcdat 2 , 19 , " " ; Tag ; "." Else Lcdat 2 , 19 , ; Tag ; "."
If Monat < 10 Then Lcdat 2 , 37 , " " ; Monat ; "." Else Lcdat 2 , 37 , ; Monat ; "."
Lcdat 2 , 55 , "20"
If Jahr < 10 Then Lcdat 2 , 67 , "0" ; Jahr Else Lcdat 2 , 67 , ; Jahr
End If
'Loop
'---------------------- nur für DEBUG nötig ------------------------------------
'Cls
'Do
'Debounce Pinb.1 , 0 , Uhrzeit , Sub
If Imp > 0 Then
Lcdat 4 , 1 , "Impulslaenge: " ; Imp
If Imp < 6 Then Lcdat 4 , 85 , " = 0" Else Lcdat 4 , 85 , " = 1"
End If
Lcdat 5 , 1 , "Pausenlaenge: "
If Pau < 10 Then Lcdat 5 , 85 , "0" ; Pau ; Else Lcdat 5 , 85 , ; Pau
Lcdat 6 , 1 , "Impulszaehler: "
If Impuls < 10 Then Lcdat 6 , 91 , "0" ; Impuls Else Lcdat 6 , 91 , ; Impuls
Lcdat 7 , 1 , "Pari=" ; Status.4 ; " Imp_OK=" ; Status.3
Loop
'---> Die Impulslänge sollte zwischen 2 und 8 liegen
'---> Die Pausenlänge sollte zwischen 70 und 90 liegen
'---> Der Impulszähler sollte gleichmässig im Sekundentakt bis 59 hochzählen
'---> Die Parität sollte ab dem 36.Impuls auf "1" gehen
End
'*************** ENDE HAUPTPROGRAMM ********************************************
'------------------------ Interrupt Routine ------------------------------------
Tim0_isr:
Timer0 = Startwert
If Pind.3 = 0 Then
Reset Portd.6
Else
Set Portd.6
End If
Call Dcf77
Return
'------------------------ Daten für Wochentag ----------------------------------
Wochentag:
Data " " , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"
$include "font6x8.font"
Bei der lib ist nur der Port angepasst.
Grüße Eisbaeeer
gelöst - Reichelt DCF77 Empfänger
So Leute
Der DCF Empfang funktioniert jetzt auch mit dem Reichelt Decoder, der das DCF Signal als positive Flanke an seinem Port ausgibt.
Was habe ich gemacht?
Pind.3 als Eingangsport benutzt und negiert.
Mit der lib von RN-Wissen und der Soft Clock sieht man dann sehr schön ab der 15. Sekunde, ob der Decoder funktioniert.
------------ edit ---------------------------------------
So, nächstes Problem erkannt.
Ich steuere meine Hintergrundbeleuchtung mit PWM an. Die PWM mache ich mit Timer1, das DCF mit Timer2.
Bentze ich PWM, geht die DCF nicht. Kommentiere ich die PWM aus, funktioniert alles prima.
Laut Oszi kommt kein Signal mehr von dem Decoder. Ich vermute mal, dass der PWM "brutale" Oberwellen wirft.
Ich bleibe dran.
------------ edit ---------------------------------------
So, jetzt geht auch PWM Signal. Es lag an den Timer Einstellungen für PWM. Ausserdem sollte der DCF Empfänger wirklich mehr als 10cm weg vom Controllerboard und GLCD Anzeige liegen, sonst hat der Decoder kein Empfang mehr.
Eisbaeeer