Archiv verlassen und diese Seite im Standarddesign anzeigen : DCF-77 läßt sich nicht auswerten
martin66119
09.01.2007, 14:57
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.
Hallo martin66119,
vielleicht hilft der Wiki-Artikel bei der Umsetzung auf deine Hardware?
https://www.roboternetz.de/wissen/index.php/DCF77-Decoder_als_Bascom-Library
Gruß Dirk
Hallo Martin,
sind denn jetzt Impulse an Portc.1 zu messen ?
Hallo ich habe dieses Programm auf dem Board von myAVR am laufen.
Es ist aber die Aenderung ohne Uhrenquarz.glaube vom Dirk. Hat auf 1Std
ca 2Sek vorlauf. Als EingangPort habe ich allerdings Portb.1
Weiß leider nicht wie ich es dir senden kann,da ich ein Anfaenger bin.Hast du den den Startwert auf 166 gesetzt ? Im Programm stand der auf 61.
Einen Dank auch an schreibern der Code.
Gruß raggy
SprinterSB
09.01.2007, 18:12
Hardwaremässig ist folgendes zu beachten:
1: Schaltnetzteile stören idR den DCF77-Empfang. Übliche Entstörmaßnahmen (LC-Glieder, etc) bleiben wirkungslos. Vermultich weil das Potential der Gesamtschaltung im EM-Feld schwingt. Einzige Abhilfe ist ein anderes Netzteil verwenden oder Erdung der Schaltung.
2: Die Ausgänge des Conrad-Moduld 641138 sind open collector NPN. Es ist also ein PullUp erforderlich. Große ist AFAIR R_pu >= VCC/5mA
martin66119
09.01.2007, 22:02
Zur Überprüfung der Pulse habe ich mit einem Digitalmulti am Ausgangs des DCF-Moduls gemessen (ich weiß, das ist keine gute Messung; Oszi müßte her). Auf jedenfall hat sich der Anzeigewert periodisch verändert im Bereich etwas über 0V bis knapp unter 5 Volt. Das Modul scheint also zu funktioneren.
DIe anderen Vorschläge habe ich noch nicht überprüft. Werde ich morgen machen.
Gruß
Martin
Zur Überprüfung der Pulse habe ich mit einem Digitalmulti am Ausgangs des DCF-Moduls gemessen (ich weiß, das ist keine gute Messung; Oszi müßte her). Auf jedenfall hat sich der Anzeigewert periodisch verändert im Bereich etwas über 0V bis knapp unter 5 Volt.
das ist schon ausreichend, dann sind Impulse vorhanden.
was SprinterSB über den Pullup Widerstand geschrieben hat ist zwar sachlich richtig, wird aber in meinem Fall nicht benötigt, da ich den internen Pullup benutze.
Somit müsste jetzt der Impulszähler im Debugmodus hochzählen ?
SprinterSB
10.01.2007, 10:43
Naja, ob intern oder extern. PullUp ist PullUp ;-)
martin66119
10.01.2007, 11:28
Danke für die Hilfe!
Ein teil funktioniert! Im Debuggermodus werden Zeiten angezeigt.
Im Anzeigemodus der Uhr wir aber weiterhin nur die Softclock angezeigt.
Die uhrzeit wir nicht auf den DCF-Wert gebracht. Wie lange kann es dauern bis die Uhr mit dem DCF-Signal synchron läuft.
Martin
Hallo Martin,
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 ?
Wie lange kann es dauern bis die Uhr mit dem DCF-Signal synchron läuft.
wenn alle Bedingungen stimmen, nach max. 2 Minuten.
@SprinterSB
ich wollte damit nur verhindern, daß noch zusätzlich ein externer Widerstand eingebaut wird.
martin66119
11.01.2007, 09:19
Einen guten Morgen "albundy"
Leider bin ich erst jetzt dazugekommen nachzuschauen was mit den Impulsen ist.
Impulslänge: Schwankt zwischen 1 und 4
Pausenlänge: recht stabil auf 72
Impulszähler: Zählt von hoch kommt aber meist nur bis ca. 10 ab und an bis knapp über 50
Parität: Ist entsprechen Impulszähler > 36 = 1
D.h. für mich es gibt irgendwo Störungen oder die Ferritantenne ist schlecht ausgerichtet.
Danke nochmal für deine guten und auch immer freundliche Hilfe
Martin
martin66119
11.01.2007, 09:40
So wie es aussieht, hat ein Bildschirm in der Nähe das Signal gestört.
Im Debugmodus laufen alle Zähler so hoch, wie du es geschrieben hast.
Nun teste ich mal die "Zeitanzeige". Und siehe da, alles bestens.
Nochmals Danke für deine Gedult.
Gruß
Martin
@Dirk
Hallo Dirk,
habe alles genau wie im Wiki beschrieben, in die einzelnen Dateien gespeichert, wenn ich die Decodertest.bas compilieren will bekomme ich
folgende Fehlermeldung:
Error: 261 Line: 0 Array expected [DCF77BUFFER], in File:
Benutze die Bascom Version 1.11.8.3 Build 010 als Vollversion
IDE Version 1.11.8.4
Was mache ich da falsch??
Gruß
kwalter
Hier mal meine Code mit Pinb.1 für myAVR Board
$regfile = "m8def.dat" 'ATmega 32
$crystal = 3686400 'Quarz: 8 MHz
$baud = 9600
$hwstack = 32 'hardware stack
$swstack = 8 'software stack
$framesize = 24 'frame space
Config Date = Dmy , Separator = . 'deutsches Format für Datum
Config Clock = Soft
Disable Timer2 'ausgeschaltet lassen
$lib "K_DCF.lib" 'LIB für DCF77
$external Dcf77
Declare Sub Dcf77
'################################################# ##########################
'Hauptprogramm:
'LCD konfigurieren:
Wait 1
'Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 2 'LCD 164A
'Startmeldung:
Cls
Lcd "* RNBFRA V1.22 * "
Wait 5
Cls
Config Timer0 = Timer , Prescale = 1024 'Timer 40Hz
Const Startwert = 166'61 'Für 8MHz
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_soft.lib" entsprechend anpassen !!!
Config Pinb.1 = Input 'DCF 77 Eingang ***Alt Pind.3 **
Set Portb.1 'Pullup ein Alt***Portd.3****
Declare Sub Showstatus()
Declare Sub Showtime()
'------------------- Variablen für DCF Routine -----------------------------
Dim Status As Byte , Zaehler As Byte , Buffer As Byte , Impuls As Byte
Dim H_sek As Byte , T_min As Byte , T_std As Byte , Wotag As Byte
Dim Pari As Byte , Pau As Byte , Imp As Byte
Dim I As Byte
'---------------------------------------------------------------------------
'Hauptprogramm:
Cls
Cursor Off
Date$ = "01.01.00"
Time$ = "00:00:00"
Status.7 = 0 'Uhr nach DCF stellen: AUS
Status.5 = 0 'Uhr wurde nicht gestellt
I = 0
'****************** HAUPTPROGRAMMSCHLEIFE **********************************
Cls
Do
'Cls
Call Showtime()
Call Showstatus()
If _min = 58 And Status.7 = 0 Then Status.5 = 0 '1x pro Stunde nach DCF stellen
If Status.5 = 0 Then Status.7 = 1 Else Status.7 = 0 'Zeit nicht aktuell: Stellen!
Wait 1
Loop
End
'************* ENDE HAUPTPROGRAMM ******************************************
Sub Showstatus() 'Status anzeigen
If I = 0 Then I = 1 Else I = 0
Locate 1 , 1
If Status.5 = 1 Then
Lcd " **DCF-Soft Clock** "
Else
Lcd " ***Soft Clock*** *"
End If
Locate 2 , 21
If Status.7 = 1 Then
Lcd "DCF:On "
Else
Lcd "DCF:Off"
End If
Locate 2 , 29
If Status.4 = 1 And I = 0 Then
Lcd " Signal"
Else
Lcd " "
End If
End Sub
'---------------------------------------------------------------------------
Sub Showtime()
Locate 2 , 5
Lcd Time$
If Status.5 = 1 Then
Locate 1 , 23
Wotag = Dayofweek()
Lcd Lookupstr(wotag , Wochentag) ; ". "
Lcd Date$
End If
End Sub
'---------------------- Interrupt Routine DCF77 ----------------------------
Tim0_isr:
Timer0 = Startwert
Call Dcf77
Return
'################################################# ##########################
'Programm Ende:
End
'---------------------- Daten für Wochentag --------------------------------
Wochentag:
Data "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"
'################################################# ##########################
copyright = W.Krueger
comment = DCF 77 Decoder
libversion = 2.00 (D. Ottensmeyer)
date = 09.04.2006
statement = ----------------------------------
statement = muss alle 25ms ausgeführt werden !
statement = ----------------------------------
[Dcf77]
Dcf77:
.equ DCF_Port = $16 ;$16 = Pinb
.equ DCF_Pin = 1 ;1 = Pin 1
.equ Imp0min = 70 ;minimale Länge des Minutenimpulses
.equ Imp1min = 6 ;minimale Länge des "1" Impulses
;alles darunter wird als "0" Impuls gewertet
.def Temp1 = r16
.def Temp2 = r17
.def Temp3 = r18
.def Minute = r19
.def Stunde = r20
.def Status = r21
;Bit0 = aktueller DCF Status
;Bit1 = vorheriger DCF Status
;Bit2 = Uhr synchronisieren
;Bit3 = 59 Impulse empfangen
;Bit4 = Parität OK
;Bit5 = Uhr wurde 1x gestellt
;Bit7 = Uhr nach DCF stellen
.def Impuls = r22
.def Zaehler = r23
.def Buffer = r24
.def Pari = r25
;------------------------------------
*lds Status,{Status} ;Status laden
rcall Softuhr ;Softuhr bearbeiten
bst Status,7 ;Status Uhr nach DCF stellen ?
brts Puls0 ;ja -> weiter
*sts {Status},Status
ret
Puls0:
*lds Impuls,{Impuls} ;Variablen laden
*lds Zaehler,{Zaehler}
*lds Buffer,{Buffer}
*lds Pari,{Pari}
in temp1,Dcf_Port ;DCF Port lesen
bst temp1,Dcf_Pin ;Status holen
bld Status,0 ;aktuellen Status speichern
inc Zaehler ;Impulslänge erhöhen
bst Status,0 ;akuellen Status prüfen
brts Puls20 ;Status Low -> weiter
bst Status,1 ;vorherigen Status prüfen
brtc Puls40 ;vorheriger Status Low -> Ende
ldi temp1,Imp0min ;Minutenimpuls Minimalwert laden
cp Zaehler,temp1 ;Impulslänge Minimalwert überschritten
brcs Puls10 ;nein -> weiter
*sts {Pau},Zaehler ;--------> Minutenimpulslänge speichern für Debug
clr Buffer ;Empfangspuffer löschen
clr Impuls ;Impulszähler löschen
bst Status,4 ;Parität OK ?
brtc Puls5 ;Nein -> weiter
bst Status,3 ;59 Impulse empfangen ?
brtc Puls5 ;Nein -> weiter
set
bld Status,2 ;Status Uhr synchronisieren setzen
Puls5:
clt
bld Status,3 ;Status 59 Impulse löschen
bld Status,4 ;Status Parität OK löschen
Puls10:
clr Zaehler ;Impulslänge löschen
rjmp Puls40 ;Ende
Puls20:
bst Status,1 ;vorherigen Status prüfen
brts Puls40 ;vorheriger Status Low -> Ende
ldi temp1,Imp1min ;Minimalwert für "1" Impuls laden
cp Zaehler,temp1 ;Minimalwert unterschritten ?
brcs Puls30 ;ja -> weiter
*sts {imp},Zaehler ;--------> Impulslänge Height speichern für Debug
cpi Impuls,28 ;beim Paritätsbit Min keine Negation
breq Puls25
cpi Impuls,35 ;beim Paritätsbit Std keine Negation
breq Puls25
ldi Temp1,1
eor Pari,Temp1 ;Paritätsbit Negation
Puls25:
sec ;Carry setzen ( "1" empfangen )
ror Buffer ;Carry in Empfangspuffer
inc Impuls ;Impulszähler erhöhen
rcall Auswerten ;Impulse auswerten
rjmp Puls40 ;Ende
Puls30:
*sts {imp},Zaehler ;--------> Impulslänge Low speichern für Debug
clc ;Carry löschen ( "0" empfangen )
ror Buffer ;Carry in Empfangspuffer
inc Impuls ;Impulszähler erhöhen
rcall Auswerten ;Impulse auswerten
Puls40:
bst Status,0 ;aktuellen Status holen
bld Status,1 ;Status speichern
*sts {Status},Status ;Variablen wieder speichern
*sts {Impuls},Impuls
*sts {Zaehler},Zaehler
*sts {Buffer},Buffer
*sts {Pari},Pari
ret
;-------------------------------------------------------------------------------
Softuhr:
*lds Temp1,{H_Sek}
*lds Temp2,{_sec}
*lds Minute,{_min}
*lds Stunde,{_hour}
bst Status,2 ;Status Uhr synchronisieren ?
brtc Soft10 ;nein -> weiter Softuhr
clt
bld Status,2 ;Status Synchron löschen
bst Status,7 ;Status Uhr nach DCF stellen ?
brtc Soft10 ;nein -> nicht neu stellen
set
bld Status,5 ;Status Uhr 1x gestellt setzen
clr Temp1 ;Hundertstel löschen
clr Temp2 ;Sekunde löschen
*lds Minute,{T_Min} ;Minute auf empfangene Minute
*lds Stunde,{T_Std} ;Stunde auf empfangene Stunde
rjmp Soft20 ;empfangene Zeit übernehmen
Soft10:
inc Temp1 ;Hundertstel Sek erhöhen
cpi Temp1,40 ;1000ms erreicht ?
brne Soft20 ;nein -> Ende
clr Temp1 ;Hundertstel Sek löschen
inc Temp2 ;Sekunde erhöhen
cpi Temp2,60 ;60 Sekunden erreicht ?
brne Soft20 ;nein -> Ende
clr Temp2 ;Sekunde löschen
inc Minute ;Minute erhöhen
cpi Minute,60 ;60 Minuten erreicht ?
brne Soft20 ;nein -> Ende
clr Minute ;Minute löschen
inc Stunde ;Stunde erhöhen
cpi Stunde,24 ;24 Stunden erreicht ?
brne Soft20 ;nein -> Ende
clr Stunde ;Stunde löschen
*lds Temp3,{_day}
inc Temp3 ;Tag erhöhen
cpi Temp3,29 ;Tag 29 erreicht ?
brlo Soft19 ;bis 28 -> Ende
clt ;ab 29 -> Hat Monat 29,30,31 Tage ?
bld Status,5 ;Status Uhr 1x gestellt löschen
; set ;Datum nach DCF stellen !
; bld Status,7 ;Status Uhr nach DCF stellen setzen
cpi Temp3,32 ;Tag 32 erreicht ?
brne Soft19 ;nein -> Ende
ldi Temp3,1 ;Tag 1 setzen
*sts {_day},Temp3
*lds Temp3,{_month}
inc Temp3 ;Monat erhöhen
cpi Temp3,13 ;Monat 13 erreicht ?
brne Soft18 ;nein -> Ende
ldi Temp3,1 ;Monat 1 setzen
*sts {_month},Temp3
*lds Temp3,{_year}
inc Temp3 ;Jahr erhöhen
cpi Temp3,100 ;Jahr 100 erreicht ?
brne Soft17 ;nein -> Ende
clr Temp3 ;Jahr 00 setzen
Soft17:
*sts {_year},Temp3
rjmp Soft20
Soft18:
*sts {_month},Temp3
rjmp Soft20
Soft19:
*sts {_day},Temp3
Soft20:
*sts {H_Sek},Temp1
*sts {_sec},Temp2
*sts {_min},Minute
*sts {_hour},Stunde
ret
;-------------------------------------------------------------------------------
Auswerten:
cpi Impuls, 21 ;21. Impuls
brne Aus10 ;nein -> weiter
clr Buffer
clr Pari
Aus10:
cpi Impuls, 28 ;28. Impuls
brne Aus15 ;nein -> weiter
lsr Buffer ;Buffer 1x schieben, da Minute nur 7 Bit
rcall Bcd2dez ;in Dezimal wandeln
*sts {T_Min},Buffer ;Temp Minute schreiben
clr Buffer
Aus15:
cpi Impuls, 29 ;Minuten Parität
brne Aus20
clr Temp3
bst Buffer,7 ;Paritätsbit selektieren
bld Temp3,0 ;Paritätsbit in Temp3 Bit0 kopieren
cp Temp3,Pari ;Parität überprüfen
brne Aus26 ;Fehler -> Ende
clr Pari
clr Buffer
Aus20:
cpi Impuls, 35 ;35. Impuls
brne Aus25 ;nein -> weiter
lsr Buffer ;Buffer 2x schieben, da Stunde nur 6 Bit
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {T_Std},Buffer ;Temp Stunde schreiben
clr Buffer
Aus25:
cpi Impuls, 36 ;Stunden Parität
brne Aus30
clr Temp3
bst Buffer,7 ;Paritätsbit selektieren
bld Temp3,0 ;Paritätsbit in Temp3 Bit0 kopieren
cp Temp3,Pari ;Parität überprüfen
breq Aus27 ;Pari OK -> weiter
Aus26:
ret ;Fehler -> Ende
Aus27:
set ;T-Bit setzen
bld Status,4 ;Bit4 Status setzen (Parität)
clr Buffer
Aus30:
cpi Impuls,42 ;42. Impuls
brne Aus40
lsr Buffer ;Buffer 2x schieben, da Tag nur 6 Bit
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {_day},Buffer ;Tag schreiben
clr Buffer
Aus40:
cpi Impuls,45 ;45. Impuls
brne Aus50
lsr Buffer ;Buffer 5x schieben, da Wochentag nur 3 Bit
lsr Buffer
lsr Buffer
lsr Buffer
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {WoTag},Buffer ;Wochentag schreiben
clr Buffer
Aus50:
cpi Impuls,50 ;50. Impuls
brne Aus60
lsr Buffer ;Buffer 3x schieben, da Monat nur 5 Bit
lsr Buffer
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {_month},Buffer ;Monat schreiben
clr Buffer
Aus60:
cpi Impuls,58 ;58. Impuls
brne Aus70
rcall Bcd2dez ;in Dezimal wandeln
*sts {_year},Buffer ;Jahr schreiben
clr Buffer
Aus70:
cpi Impuls,59 ;59. Impuls
brne Aus80
set ;T-Bit setzen
bld Status,3 ;Bit3 Status setzen (59 Impulse)
Aus80:
cpi Impuls,60 ;bei mehr als 59 Impulsen (Störimpulse)
brne Aus90
clt ;T-Bit löschen
bld Status,3 ;Bit3 Status löschen (59 Impulse)
bld Status,4 ;Bit4 Status löschen (Parität)
Aus90:
ret
;-------------------------------------------------------------------------------
Bcd2dez:
mov Temp1,Buffer
andi Temp1,$0F
Bcd10:
subi Buffer,$10
brcs Bcd20
subi Temp1,$F6
rjmp Bcd10
Bcd20:
mov Buffer,Temp1
ret
[end]
Das DCF-Modul Klemme 1=Gnd, 2=5V, 3=Frei, 4= pinb.1
Kein wiederstand !
brauch auch keinen Uhrenquarz
hast Du auch mit myAVRquikProg das Fusebit verstellt.
Guß raggy
Hallo,
ich habe das gleiche Problem. Die Meldung:
Error: 261 Line: 0 Array expected [DCF77BUFFER], in File:
Woran könnte das bitte liegen? Hat es jemand von Euch herausbekommen?
Gruß
Richard
@Dirk
Hallo Dirk,
habe alles genau wie im Wiki beschrieben, in die einzelnen Dateien gespeichert, wenn ich die Decodertest.bas compilieren will bekomme ich
folgende Fehlermeldung:
Error: 261 Line: 0 Array expected [DCF77BUFFER], in File:
Benutze die Bascom Version 1.11.8.3 Build 010 als Vollversion
IDE Version 1.11.8.4
Was mache ich da falsch??
Gruß
kwalter
Hallo Leute,
Error: 261 Line: 0 Array expected [DCF77BUFFER], in File:
Diese Fehlermeldung hat mich auch genervt. Ihre Ursache konnte ich nicht herausfinden, weil das Array ordnungsgemäß definiert ist.
Auf jeden Fall wird alles korrekt kompiliert und läuft.
Gruß Dirk
Hier mal meine Funkuhr mit dem Conrad Modul + Thermometer DS1820.
http://img440.imageshack.us/img440/1516/funkuhrue6.th.jpg (http://img440.imageshack.us/my.php?image=funkuhrue6.jpg)
Hallo,
verwendest Du die Library 4.0 ?
Könntest Du mir eventuell die Codes senden?
auf
flexoprint@gmx.net
Gruß
Richard
[quote="matlen"]Hier mal meine Funkuhr mit dem Conrad Modul + Thermometer DS1820.
Hallo,
Die 4-er Version geht bs auf die blöde Meldung des Compilers einwandfrei. Die muss man einfach ignorieren.
Viele Grüße
Rici
Eisbaeeer
02.09.2007, 21:25
Hallo Martin,
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.
'************************************************* ******************************
'* 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
Hallo Eisbaeeer,
ich entdecke da alte Teile meines DCF-Decoders, der auf dem Vorbild von albundy aufgebaut war.
Am besten, du nimmst die neueste Version aus der Wiki:
https://www.roboternetz.de/wissen/index.php/DCF77-Decoder_als_Bascom-Library
... oder ab Bascom 1.11.8.7 den "eingebauten" DCF-Decoder.
Gruß Dirk
Eisbaeeer
04.09.2007, 07:09
Hallo Dirk
Danke für deine Antwort. Ich glaube, ich habe bis jetzt bald jede Variante ausprobiert, die es an DCF Decordern gibt. Bei der LIB von roboternetz bin ich auch schon hängen geblieben.
Ich werde mich jetzt mal auf die LIB von dir festbeißen. Wenn andere von DCF Decodern sprechen, wird immer der Pullup aktiviert. Der DCF Decoder von Reichelt arbeitet aber genau anders herum. Er gibt einen 5V Impuls an seinem Ausgang und zieht den Port nicht auf null.
Aber das kann ja nicht das Problem sein. einfach die Werte Impuls und Pausenzeiten vertauschen oder mit einem 2. Port negieren.
Der Decoder funktioniert auch so weit, denn das Testprogramm ohne Timer stellt mir die Uhr perfekt.
So on, aber das ist bis jetzt die härteste Nuss. Da war der DS18S20 eine Kleinigkeit dagegen.
Grüße Eisbaeeer
peterfido
05.09.2007, 14:33
ich würde das nicht mit einem 2. negieren. Ich habe auch einen solchen DCF Empfänger und habe ihn über einen Optokoppler an den Eingang des uC geschaltet. Eine andere Möglichkeit wäre noch ein Pull-Down Widerstand. Als Lib nehme ich die Bascom interne, wobei ich mir diese etwas angepasst habe, da ich bei Minutenimpuls die Sekunden auf 1 stelle und dann etwas warte, da ich ziemlich viele Funktionen nutze, welche Zeitabhängig sind.
Config Dcf77 = Pind.7 , Timer = 1 , Inverted = 0 , Check = 1 , Update = 0 , Debug = 0 , Gosub = Sectic
Eisbaeeer
05.09.2007, 15:19
Der Decoder funktioniert auch so weit, denn das Testprogramm ohne Timer stellt mir die Uhr perfekt.
An dem Optokoppler liegt es meines erachtens nicht.
Das Signal am Oszi ist astrein.
Ich hab heute morgen schnell die lib von RN-Wissen angepasst und musste feststellen, dass noch irgend wo im Programm der Pullup am Portd.3 aktiv ist. Vieleicht auch noch in der LIB. Bin noch nicht dazugekommen, da weiterzusuchen.
Hat jemand auf die Schnelle die neue lib von Bascom?
Eisbaeeer
Eisbaeeer
05.09.2007, 21:23
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.