@ Knickohr
Kannst Du dein Code mal hier anhängen...
Will mich nicht extra in dem anderen Forum anmelden.
Druckbare Version
@ Knickohr
Kannst Du dein Code mal hier anhängen...
Will mich nicht extra in dem anderen Forum anmelden.
Hallo,
gerade frisch compiliert ;)
Thomas
Hallo Knickohr,
Was hast Du für einen Uhrenquarz (Reichelt Bestnr. ??? ;) ) und wie und wo wird der angeschlossen.
Habe ich noch nie verwendet.
Habe an meiner Steuerung nur ein Standard 8MHz Quarz mit den 2 22pF C´s
Gruß
Papsi
TOSC1 und TOSC2
und dann das Config Soft ... nicht vergessen. Dann mußt Du aber für den DCF77-Decoder einen anderen Timer verwenden und die Lib anders "anspringen". Steht im Wiki ganz genau beschrieben oder auch hier vorher im Beitrag.
Den Quarz, den ich verwende, wirst Du nicht so ohne weiteres bekommen. Ist ein SMD-Uhrenquarz mit militärischen Spezifikationen. Aber der von Conrad, Reichelt, blahbha Uhrenquarz mit 32768Hz tut es auch ;)
Thomas
kann man sich diese Ominöse dcf77 lib auch runterladen oder muss man die sich zusammenkopieren
geht das auch mit dem pollin DCF modul das ja erst nach 2bis 20min gestartet werden kann mitels schalter via portpin des controllers
@magic33:
Welche "Ominöse dcf77 lib" meinst du? Wenn du die aus RN-Wissen meinst, dann habe ich die 'mal angehängt, damit du nicht kopieren must.Zitat:
kann man sich diese Ominöse dcf77 lib auch runterladen oder muss man die sich zusammenkopieren
Wenn du die neueren BASCOM-Versionen hast, würde ich stattdessen die "eingebaute" DCF-Funktion nehmen.
Die Lib aus RN-Wissen hat keine Funktion zum Einschalten eines DCF-Moduls. Das ist ja aber einfach zu machen: Immer wenn Status.7 gleich 1 ist, muss der Decoder eingeschaltet werden.Zitat:
... geht das auch mit dem pollin DCF modul das ja erst nach 2bis 20min gestartet werden kann mitels schalter via portpin des controllers
Wenn du die Bascom-Funktion nimmst, gibt es einen Parameter (SWITCHPOWER), mit dem du einen Portpin schalten kanst.
Gruß Dirk
P.S.: Das Pollin-DCF-Modul braucht übrigens eine kleine Treiberstufe (Transistor) zum Anschluß an den uC.
Danke für die schnelle info
Hallo,
bin neu hier. Kann mir jemand sagen,
wie ich an die Library von albundy
bezw. die Tipps von hrei rankomme?
Hook
Eigentlich brauchst du die ja gar nicht, da Bascom mittlerweile eine eigene Lib eingebettet hat.
Musst nur einbinden und laut Hilfe in Bascom damit arbeiten.
Bertl100
Vielen Dank für die rasche Antwort!
Habe eine DCF-Uhr mit BASCOM laufen.
Das Problem ist die Störunganzeige:
eine Unterbrechung des DCF-Signals
wird nicht sicher angezeigt.
Besitze BASCOM 1..11.9.3
Hook
Hallo Hook,
Fast alles ist in diesem irre langen Thread zu finden:Zitat:
Kann mir jemand sagen, wie ich an die Library von albundy bezw. die Tipps von hrei rankomme?
https://www.roboternetz.de/phpBB2/viewtopic.php?t=18073
Gruß Dirk
Hallo Dirk,
ließt Du noch mit in diesem Beitrag ? Ich habe einen Bug in der lib gefunden, gerade eben ...
Das Jahr arbeitet offensichtlich nicht korrekt. Es ist auf 01.01.16 gesprungen. Ich verwende die Version 4.00 vom 25.11.2006. Oder hab ich ein Update verpennt ?
Ach ja, ein Gutes Neues Euch allen ;)
Thomas
UUps. Muss ich mir ansehen!Zitat:
Das Jahr arbeitet offensichtlich nicht korrekt. Es ist auf 01.01.16 gesprungen. Ich verwende die Version 4.00 vom 25.11.2006.
Gruß Dirk
P.S.: Ich war zu beschäftigt, um den Jahreswechsel am uC zu verfolgen.
Hallo Dirk,
das Problem liegt wahrscheinlich in einer Zuweisung von oder in eine HEX-Variable.
1 und 0 für das Jahr 10 ergibt in einer HEX-Variablen ja 16
Nur so eine Vermutung, ich suche auch mal, ob ich selbst was finde. Von ASM hab ich Null Ahnung.
Thomas
Prosit Neujahr!
Hab das selbe Problem. Meine DCF Variable der Softclock "_year" ist auch auf 16 gesprungen. Wäre auch an einer Lösung interessiert.
Grüße Eisbaeeer
Hallo zusammen,
kleiner Workaround und nur das, mehr ist es nicht !
Wird vermutlich die nächsten 10 Jahre damit funktionieren ;)Code:If Dcfstatus.7 = 1 Then ' prüfe auf korrekten DCF77-Empfang
If Dcfstatus.5 = 1 And Dcfstatus.6 = 1 Then ' wenn OK, DCF77 disablen
Temp_byte = _year ' temporärer Workaround, da DCF77_4.lib fehlerhaft
If Temp_byte > 15 Then
Temp_byte = Temp_byte - 6
_year = Temp_byte
End If
Disable Timer4
Dcfstatus.7 = 0
End If
End If
Thomas
Leute,
erster Kurz-Test heute:
An der Softclock liegts nicht. Die zählt (ohne DCF-Empfang!) sauber vom Jahr 2009 (31.12., 23:59:59) hoch zum 1.1.10, 00:00:00.
Da ich den Jahreswechsel verpasst habe, muss ich einen DCF-Encoder (damit kann ich jedes DCF-Protokoll vortäuschen) anstelle des Empfängers anschließen und den Jahreswechsel 2009-2010 simulieren.
Kann etwas dauern ...
Ich berichte weiter.
Gruß Dirk
Hallo Dirk,
mein Verdacht liegt bei der Decodierung des DCF-Signals. Da muß irgendwas schief gehen.
Wieso einen Encoder ? Du mußt doch einfach nur die Uhr falsch stellen und dann mit dem DCF-Empfänger neu synchonisieren lassen. Da siehste dann, das die Uhr immer wieder auf das Jahr 16 springt.
Der Jahreswechsel nach 2010 interessiert doch nicht mehr, der ist vorbei ;)
Thomas
So Leute,
der Fehler war, dass das Jahr nicht von BCD nach DEZ umgewandelt wurde. In den letzten 10 Jahren war das kein Problem. O:)
Hier die Lib fürs neue Jahrzehnt:
Gruß DirkCode:copyright = D. Ottensmeyer
comment = DCF77-Decoder und Softclock
libversion = 4.10
date = 01.01.2010
statement = ----------------------------------
statement = Version 4.10:
statement = Jahr: BCD->DEZ-Fehler korrigiert!
statement = Version 4.00:
statement = Komplette Paritätsprüfung
statement = Auswertung der DCF77-Bits 15..20
statement = NEU: DCF77-Bit 20 - Prüfung!
statement = NEU: Schaltsekunde decodiert!
statement = NEU: DCF77-Bits 0..14 erfasst!
statement = NEU: Plausibilitäts-Check!
statement = NEU: Validitäts-Zähler!
statement = ----------------------------------
[Dcf77_soft]
;Eingang für DCF77-Empfänger-Anschluss:
.equ PIND = &H10 ;Pind
.equ PIND3 = 3 ;3 = Pin 3
;Timer-Interruptfrequenz:
.equ ISR_freq = 40 ;40 Hz
;Grenzwerte für Pausenzeit-Zähler (/ ISR_freq [s]):
.equ LastBit0Max = 79 ;LastBit 0 obere Zeitgrenze + 1
.equ LastBit_Mid = 75 ;LastBit-Grenze
.equ LastBit1Min = 71 ;LastBit 1 untere Zeitgrenze
.equ DataBit0Max = 39 ;Datenbit 0 obere Zeitgrenze + 1
.equ DataBit_Mid = 35 ;Datenbit-Grenze
.equ DataBit1Min = 31 ;Datenbit 1 untere Zeitgrenze
.equ Spike_Limit = 3 ;Störimpulsgrenze
;Validitäts-Zähler Limit:
.equ Val_Limit = 1 ;Jedes Telegramm ist gültig
.def Status = r16
;Bit0 = 15. Impuls erreicht
;Bit1 = Minutenparität OK
;Bit2 = Stundenparität OK
;Bit3 = Parität OK
;Bit4 = 58 Impulse empfangen
;Bit5 = Gültiges DCF77-Telegramm
;Bit6 = Softclock nach DCF gestellt
;Bit7 = DCF-Decoder EIN
.def Counter = r17
.def Parity = r18
.def Impulse = r19
.def Shifter = r20
Dcf77_soft:
*lds Status,{Dcfstatus} ;Status laden
rcall Softclock ;Softclock bearbeiten
rjmp dcf77_start
;-------------------------------------------------------------------------------
[Dcf77]
$EXTERNAL Dcf77_soft
Dcf77:
*lds Status,{Dcfstatus} ;Status laden
dcf77_start:
*lds Counter,{DCF77Counter} ;Pausenzeit-Zähler laden
*lds Parity,{DCF77Parity} ;Fehler-Flag + 1-Zähler laden
sbis PIND,PIND3 ;Input-Pin für DCF-Empfänger
rjmp dcf77_5 ;low: Bit auswerten!
inc Counter ;high: Pausenzeit zählen!
brne dcf77_3
dcf77_1:
sbr Parity,&B10000000 ;Fehler-Flag setzen
*sts {DCF77Parity},Parity
andi Status,&B11000000 ;Statusbits 0..5 löschen
dcf77_2:
clr Counter ;Pausenzeit-Zähler zurücksetzen
dcf77_3:
*sts {DCF77Counter},Counter
*sts {Dcfstatus},Status
dcf77_4:
ret
dcf77_5:
tst Counter ;Auswertung fertig?
breq dcf77_4 ;ja: Ende!
*lds Impulse,{DCF77Impulse} ;nein: Auswerten!
*lds Shifter,{DCF77Shifter}
*lds ZL,{DCF77TAL}
*lds ZH,{DCF77TAH}
cpi Counter,LastBit0Max ;LastBit 0 obere Zeitgrenze + 1
brsh dcf77_1 ;überschritten: Fehler
cpi Counter,LastBit_Mid ;LastBit-Grenze
brlo dcf77_6
rjmp dcf77_20 ;75..78 = LastBit0
dcf77_6:
cpi Counter,LastBit1Min ;LastBit 1 untere Zeitgrenze
brlo dcf77_7
rjmp dcf77_19 ;71..74 = LastBit1
dcf77_7:
sbrc Parity,7 ;wenn Fehler aufgetreten, ...
rjmp dcf77_2 ;... dann Abbruch!
cpi Counter,Spike_Limit ;Störimpulsgrenze
brlo dcf77_2 ;Störimpuls wird ignoriert
cpi Counter,DataBit0Max ;Datenbit 0 obere Zeitgrenze + 1
brsh dcf77_1 ;überschritten: Fehler
cpi Counter,DataBit1Min ;Datenbit 1 untere Zeitgrenze
brlo dcf77_1 ;unterschritten: Fehler
*sts {DCF77Databit},Counter ;DataBit0/1-Pausenlänge für Debug
cpi Counter,DataBit_Mid ;Datenbit-Grenze
brlo dcf77_8 ;Bit1!
cpi Impulse,20 ;DataBit = 0 (35..38):
breq dcf77_2 ;Bit 20 = 0: Abbruch!
cpi Impulse,58 ;P3 (= 0) bei Schaltsekunde?
breq dcf77_2 ;Abbruch: LastBit 59 (= 0) folgt!
rjmp dcf77_10 ;andere 0-Bits: weiter
dcf77_8: ;DataBit = 1 (31..34):
cpi Impulse,21 ;DCF77-Bits 0..20 (= 1)?
brlo dcf77_9 ;keine Parität!
inc Parity ;sonst alle 1-Bits zählen
*sts {DCF77Parity},Parity
cpi Impulse,28
breq dcf77_10 ;Minutenparitätsbit nicht addieren!
cpi Impulse,35
breq dcf77_10 ;Stundenparitätsbit nicht addieren!
cpi Impulse,58 ;P3 (= 1) bei Schaltsekunde?
breq dcf77_2 ;Abbruch: LastBit 59 (= 0) folgt!
dcf77_9:
ld Counter,Z ;Counter = aktuelle DCF77Buffer Zelle
add Counter,Shifter ;addiere 1 an der aktuellen Bitposition
st Z,Counter ;zurückspeichern
dcf77_10:
lsl Shifter ;Shifter auf nächste Bitposition
*sts {DCF77Shifter},Shifter
cpi Impulse,7
brlo dcf77_16 ;DCF77-Bits 0..7 Zyklus
breq dcf77_15 ;letztes Bit 0..7 Zyklus
cpi Impulse,14
brlo dcf77_16 ;DCF77-Bits 8..14 Zyklus
brne dcf77_11
andi Status,&B11000111 ;Statusbits 3..5 löschen
sbr Status,&B00000001 ;Status 15. Impuls erreicht setzen
rjmp dcf77_15 ;letztes Bit 8..14 Zyklus
dcf77_11:
cpi Impulse,20
brlo dcf77_16 ;DCF77-Bits 15..20 Zyklus
breq dcf77_15 ;letztes Bit (DCF77-Bit 20)
cpi Impulse,28
brlo dcf77_16 ;Minuten-Zyklus
breq dcf77_17 ;Minutenparität
cpi Impulse,35
brlo dcf77_16 ;Stunden-Zyklus
breq dcf77_17 ;Stundenparität
cpi Impulse,41
brlo dcf77_16
breq dcf77_12 ;letztes Bit TAG
cpi Impulse,44
brlo dcf77_16
breq dcf77_12 ;letztes Bit WOCHENTAG
cpi Impulse,49
brlo dcf77_16
breq dcf77_12 ;letztes Bit MONAT
cpi Impulse,57
brne dcf77_16 ;nicht letztes Bit JAHR
dcf77_12: ;DCF77Buffer Zelle in DEZ wandeln:
ld Counter,Z ;Counter = aktuelle DCF77Buffer Zelle
mov Shifter,Counter ;Counter (BCD)
andi Shifter,&H0F
dcf77_13:
subi Counter,&H10
brcs dcf77_14
subi Shifter,&HF6
rjmp dcf77_13
dcf77_14: ;-> Shifter (DEZ)
st Z,Shifter ;DEZ in Zelle zurückspeichern
cpi Impulse,57
breq dcf77_16 ;letztes Bit JAHR
dcf77_15: ;aktuelle DCF77Buffer Zelle fertig:
ldi Shifter,1 ;Bitposition zurücksetzen
adiw ZL,1 ;nächste DCF77Buffer Zelle
*sts {DCF77Shifter},Shifter
*sts {DCF77TAL},ZL ;Adresse der nächsten Zelle speichern
*sts {DCF77TAH},ZH
dcf77_16:
inc Impulse ;nächstes DCF77-Bit
*sts {DCF77Impulse},Impulse
rjmp dcf77_2
dcf77_17: ;Parität Min./Std. Auswertung:
sbrc Parity,0
rjmp dcf77_2 ;Parität Fehler: Abbruch!
cpi Impulse,28 ;Minutenparität?
brne dcf77_18 ;nein: Stundenparität (35)
sbr Status,&B00000010 ;Status Minutenparität OK setzen
rjmp dcf77_12
dcf77_18:
sbr Status,&B00000100 ;Status Stundenparität OK setzen
rjmp dcf77_12 ;Parität Min./Std. OK
dcf77_19: ;Telegramm Ende:
inc Parity ;LastBit = 1
dcf77_20: ;LastBit = 0
*sts {DCF77Lastbit},Counter ;LastBit0/1-Pausenlänge für Debug
cpi Impulse,58 ;58 DCF77-Bits erfasst?
brne dcf77_21 ;unvollständig: weiter
sbr Status,&B00010000 ;ja: Status 58 Impulse empfangen setzen
dcf77_21:
andi Parity,&B10000001
brne dcf77_22 ;Paritäts- oder sonst. Fehler aufgetreten?
sbr Status,&B00001000 ;nein: Status Parität OK setzen
dcf77_22:
mov Counter,Status
andi Counter,&B00011111 ;Status Bits 0..4?
cpi Counter,&B00011111 ;alle 5 Bits = 1?
breq dcf77_24
dcf77_23:
clr Shifter ;Validitäts-Zähler zurücksetzen
rjmp dcf77_25 ;Fehler: Softclock NICHT stellen!
dcf77_24: ;Plausibilitäts-Check:
ld Counter,Z ;Jahr (0..99)
cpi Counter,100
brsh dcf77_23 ;> 99: Nicht plausibel!
ld Counter,-Z ;Monat (1..12)
tst Counter
breq dcf77_23
cpi Counter,13
brsh dcf77_23
ld Counter,-Z ;Wochentag (1..7)
tst Counter
breq dcf77_23
cpi Counter,8
brsh dcf77_23
ld Counter,-Z ;Tag (1..31)
tst Counter
breq dcf77_23
cpi Counter,32
brsh dcf77_23
ld Counter,-Z ;Stunde (0..23)
cpi Counter,24
brsh dcf77_23
ld Counter,-Z ;Minute (0..59)
cpi Counter,60
brsh dcf77_23
adiw ZL,5 ;Pufferzeiger auf Jahr zurücksetzen
sbr Status,&B00100000 ;Status Gültiges DCF77-Telegramm setzen
*lds Shifter,{DCF77Val_cnt} ;Validitäts-Zähler laden
inc Shifter ;Zähler erhöhen
cpi Shifter,Val_Limit ;Stand Validitäts-Zähler?
brlo dcf77_25 ;< Val_Limit: Softclock NICHT stellen!
ldi Shifter,Val_Limit ;Zähler wird nicht > Val_Limit!
sbrs Status,7 ;Status DCF-Decoder EIN/AUS?
rjmp dcf77_25 ;AUS: Softclock NICHT stellen!
;Softclock nach DCF stellen:
loadadr _year,X ;Zeiger auf Softclock-Variablen
ld Counter,Z ;Jahr = DCF77Buffer(9)
st X,Counter ;in _year sichern
ld Counter,-Z ;Monat = DCF77Buffer(8)
st -X,Counter ;in _month sichern
ld Counter,-Z ;Wochentag = DCF77Buffer(7)
*sts {_dayofweek},Counter ;in _dayofweek sichern
ld Counter,-Z ;Tag = DCF77Buffer(6)
st -X,Counter ;in _day sichern
ld Counter,-Z ;Stunde = DCF77Buffer(5)
st -X,Counter ;in _hour sichern
ld Counter,-Z ;Minute = DCF77Buffer(4)
st -X,Counter ;in _min sichern
clr Counter
st -X,Counter ;_sec zurücksetzen
*sts {Dcf77hsec},Counter ;Sek.-Bruchteile zurücksetzen
ld Counter,-Z ;DCF77-Bits 15..20 = DCF77Buffer(3)
*sts {Dcfflags},Counter ;in Dcfflags sichern
ld Counter,-Z ;DCF77-Bits 8..14 = DCF77Buffer(2)
*sts {Dcf77bits8_14},Counter ;in Dcf77bits8_14 sichern
ld Counter,-Z ;DCF77-Bits 0..7 = DCF77Buffer(1)
*sts {Dcf77bits0_7},Counter ;in Dcf77bits0_7 sichern
sbr Status,&B01000000 ;Status Softclock nach DCF gestellt setzen
dcf77_25:
andi Status,&B11111000 ;Statusbits 0..2 löschen
rjmp dcf77_26
;-------------------------------------------------------------------------------
[Dcf77_init]
$EXTERNAL Dcf77_soft
Dcf77_init: ;DCF77-Variablen Reset
clr Shifter ;Validitätszähler zurücksetzen
andi Status,&B11000000 ;Statusbits 0..5 löschen
dcf77_26:
*sts {Dcfstatus},Status ;Status speichern
*sts {DCF77Val_cnt},Shifter ;Validitäts-Zähler speichern
loadadr DCF77Buffer,Z ;Adresse DCF77Buffer
mov Parity,ZL
mov Impulse,ZH
loadadr DCF77Counter,Z ;Adresse DCF77Counter
ldi Counter,12
clr Shifter
dcf77_27: ;DCF77Counter..DCF77Buffer = 0
st Z+,Shifter
dec Counter
brne dcf77_27
inc Counter
st Z+,Counter ;DCF77Shifter = 1
st Z+,Parity ;Adresse DCF77Buffer -> DCF77TAL/AH
st Z,Impulse
ret
;BASCOM-Variablen für die Dcf77.lib:
;DCF77counter: Pausenzeit-Zähler
;DCF77parity: Fehler-Flag (Bit 7) + 1-Bit-Zähler
;DCF77impulse: Aktuelle DCF77-Bitnummer
;DCF77buffer(9): Zeit-Zwischenspeicher
;(Inhalt: DCF77-Bits 0..7, DCF77-Bits 8..14, DCF-Flags (= DCF77-Bits 15..20),
; Minute, Stunde, Tag, Wochentag, Monat, Jahr)
;DCF77shifter: Bitposition in der aktuellen DCF77Buffer Zelle
;DCF77tal: Zeiger (low) auf die aktuelle DCF77Buffer Zelle
;DCF77tah: Zeiger (high) auf die aktuelle DCF77Buffer Zelle
;Dcf77hsec: Sekunden-Bruchteile
;Dcf77bits0_7: DCF77-Bits 0..7
;Dcf77bits8_14: DCF77-Bits 8..14
;Dcf77val_cnt: Validitäts-Zähler
;Dcf77lastbit: LastBit-Pausenlänge für Debug
;Dcf77databit: DataBit-Pausenlänge für Debug
;-------------------------------------------------------------------------------
Softclock:
*lds Counter,{Dcf77hsec}
inc Counter ;Sek.-Bruchteile erhöhen
cpi Counter,ISR_freq ;1000ms = 1s erreicht?
breq Soft_10 ;ja: weiter
*sts {Dcf77hsec},Counter
ret ;sonst Ende
Soft_10:
clr Counter ;Sek.-Bruchteile löschen
*sts {Dcf77hsec},Counter
*lds Counter,{_sec}
inc Counter ;Sekunde erhöhen
cpi Counter,60 ;60 Sekunden erreicht?
breq Soft_20 ;ja: weiter
*sts {_sec},Counter
ret
Soft_20:
clr Counter ;Sekunde löschen
*sts {_sec},Counter
*lds Counter,{_min}
inc Counter ;Minute erhöhen
cpi Counter,60 ;60 Minuten erreicht?
breq Soft_30 ;ja: weiter
*sts {_min},Counter
ret
Soft_30:
clr Counter ;Minute löschen
*sts {_min},Counter
*lds Counter,{_hour}
inc Counter ;Stunde erhöhen
cpi Counter,24 ;24 Stunden erreicht?
breq Soft_40 ;ja: weiter
*sts {_hour},Counter
ret
Soft_40:
clr Counter ;Stunde löschen
*sts {_hour},Counter
*lds Counter,{_dayofweek}
inc Counter ;Wochentag erhöhen
cpi Counter,8 ;letzter Wochentag erreicht?
brne Soft_50 ;nein: weiter
ldi Counter,1 ;Wochentag auf "1" (Montag)
Soft_50:
*sts {_dayofweek},Counter
*lds Counter,{_day} ;Tag holen
*lds Shifter,{_month} ;Monat holen
ldi zl,low(Daysofmonth*2)
ldi zh,high(Daysofmonth*2) ;Anzahl Tage pro Monat holen
add zl,Shifter ;Zeiger auf aktuellen Monat
lpm ;Anzahl Tage holen
cp Counter,r0 ;Monatsende erreicht?
brne Soft_90 ;nein: weiter
cpi Shifter,2 ;Monatsende Februar (wg. Schaltjahr)?
brne Soft_60 ;nein: weiter
cbr Status,&B01000000 ;Status Softclock nach DCF gestellt löschen
Soft_60:
cpi Shifter,6 ;Monatsende Juni (wg. Schaltsekunde)?
brne Soft_70 ;nein: weiter
cbr Status,&B01000000 ;Status Softclock nach DCF gestellt löschen
Soft_70:
ldi Counter,1 ;Tag auf 1
cpi Shifter,12 ;Jahresende (+ wg. Schaltsekunde)?
brne Soft_100 ;nein: weiter
cbr Status,&B01000000 ;Status Softclock nach DCF gestellt löschen
*lds Shifter,{_year} ;Jahr holen
inc Shifter ;Jahr erhöhen
cpi Shifter,100 ;Jahr 100 erreicht?
brne Soft_80 ;nein: Ende
clr Shifter ;Jahr 00 setzen
Soft_80:
*sts {_year},Shifter ;speichern
ldi Shifter,1 ;Monat auf 1
rjmp Soft_110
Soft_90:
inc Counter ;Tag erhöhen
rjmp Soft_110
Soft_100:
inc Shifter ;Monat erhöhen
Soft_110:
*sts {_day},Counter ;Datum speichern
*sts {_month},Shifter
ret
Daysofmonth:
.db 00, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
[end]
Hallo Dirk,
DANKE :)
War das wirklich alles ?
brlo dcf77_16
breq dcf77_12 ;letztes Bit MONAT
cpi Impulse,57
brne dcf77_16 ;nicht letztes Bit JAHR
Da habe ich heute Morgen auch schon drüber gestutzt ;) Nur wußte ich nicht, obs dann überhaupt noch funktioniert.
Thomas
--- EDIT -----
Hab die Posts oben glatt übersehen oder wurden eben erst hinzugefügt. Werde die neue Lib ausprobieren.
Ja, BCD und DEC. Bin ich auch schon drübergestolpert.
Grüße Eisbaeeer
@Knickohr:
Ja, das war alles. Dadurch wird auch das Jahr noch durch die BCD-DEZ-Umwandlung gejagt. Alle anderen Werte müssen da schon durch.
@Eisbaeeer:
EDIT: Ok, viel Spaß beim Testen!
Gruß Dirk
Hi. jep, bin ganz gelassen. Großes Lob an deinen Code. Ist sehr übersichtlich geschrieben und durchaus nachvollziehbar. Alles kommentiert. Kann man sich als Vorbild nehmen!Zitat:
Zitat von Dirk
Danke nochmal für deine Mühe!
Grüße Eisbaeeer
Jepp, funzt !
Danke nochmal.
Thomas
Hallo
Bei mir findet er die Einsprungmarke dcf77_init nicht mehr. Ich hab die Lib über diese Einsprungmarke nach dem rn-wissen wiki damals programmiert.
Includiert sind ist die dcf77_softwareuhr.bas (wie im Anhang). Die LIB ist im Bascom eingespielt. Aufgerufen wird das ganze über den Timer:
Spiele ich die "alte" lib ein, funktioniert der Aufruf der dcf77_init.Code:'------[ Interrupt Routine DCF77 ]----------------------------------------------
Tim2_isr:
Timer2 = Startwert
Call Dcf77_init
Return
Sehr merkwürdig.
Grüße Eisbaeeer
Hallo Eisbär,
der Init passiert ganz am Anfang von Deinem Programm. Der Timer-Interrupt macht nur einen Call Dcf77
ThomasCode:...
'Const Startwert = 61 ' für Timer 8-bit
Const Startwert = 40536 ' für Timer 16 bit
...
Declare Sub Dcf77
Declare Sub Dcf77_init
'Declare Sub Dcf77_soft
...
Config Timer4 = Timer , Prescale = 8 ' Timer für 40Hz (25ms) 8-bit
'Config Timer4 = Timer , Prescale = 1024 ' Timer für 40Hz (25ms) 16-bit
Timer4 = Startwert
'On Timer4 Timer_dcf77 ' Überlauf alle 25ms, funktioniert nicht !
On Ovf4 Timer_dcf77 ' Überlauf alle 25ms
...
Beginn: ' Wird angesprungen bei komplettem Reset
Disable Timer4 ' Timer für DCF77 noch disablen
Call Dcf77_init ' DCF77 initialisieren
...
Enable Timer4
...
Timer_dcf77: ' Timer zur DCF77-Decodierung
Timer4 = Startwert
Call Dcf77
Return
Hallo
Ich glaube es selber nicht. Den genauen Fehler habe ich nicht gefunden. Aber jetzt funktioniert die LIB. Beim code kopieren von dem Thread ist wohl irgendwo ein Fehler unterlaufen. Um den Fehler einzugrenzen hab ich die "alte" Lib hergenommen und nur die paar Zeilen ergänzt und siehe da, sie funktioniert wieder.
Ich hab die Dateien aber mit einem Programm verglichen. Kein Unterschied zu finden.
Viele Grüße Eisbaeeer
Hallo Eisbär,
ich hatte auch einen seltsamen Effekt ! Ich habs aber genau umgekehrt gemacht. Ich wollte die neuen Zeilen in die alte LIB kopieren, danach gings nicht mehr.
Nun gut, dann habe ich eben die neue LIB genommen und meine Anpassungen für den PIN und PORT neu gemacht. Alles OK; die LIB tut wieder seit Vorgestern Abend.
Thomas
Ich hatte so ein Phänomen schon einmal. Das liegt meist an den PHP Code Srcipten der Foren. Könnte mal jemand die funktionierende LIB als Anhang hier posten. Der Code compiliert jetzt zwar bei mir, aber irgend wo ist noch der Hund drin. Ich bekomme bis dcfstatus.4 alle gesetzt, dcfstatus.6 , 6 kommt dann nicht.
Wäre mir eine Hilfe. Danke.
Aber klar doch, allerdings ist die LIB schon von mir auf meine Ports und Pins angepaßt worden ;)
Thomas
Danke, funzt jetzt auch.
Grüße Eisbaeeer
@Knickohr
Klar, indem man das Array in der Lib korrekt adressiert.Zitat:
Kann man den doofen Array expected [DCF77BUFFER] noch irgendwie ausmerzen ? Ist doof, immer die Fehlermeldung im Compiler zu sehen.
Ersetze "Loadadr DCF77Buffer,Z" mit "Loadadr DCF77Buffer(1),Z
und schon gibt es keine Fehlermeldung mehr. =D>
Hi,
ich habe da ein Problem wo ich hoffe das ihr mir helfen könnt. Ich benutze die super DCF77 libary die hier vorgestellt wurde. Funktioniert auch bestens. In der Anwendung die ich brauche kann ich die softclock nur Nachts mit DCF aktualisieren. Natürlich kommt es da ich keinen Quarz drann habe (so genau muss es nun auch nicht sein) zu ungenauigkeiten bis zum nächsten DCF Empfang.
Problem ist nur das es 10sec pro Stunde sind, was dann doch recht heftig ist (warum auch immer das so krass hier ist). Egal ob interner 8Mhz RC oder externer 8MHz Quarz. Wo bzw wie kann ich das denn ein wenig nachkorrigieren. Im Prinzip müsste ich doch den Timer nur etwas weniger Zählen lassen pro Umlauf??!!
Wäre super wenn mir da jemand helfen könnte,
Grüße und Danke,
Lars
EDIT: Ich passe einfach den Startwert an, richtig?? Ist mir gerade aufgefallen als ich nochmal über den code gelesen habe.
Hallo,
warum machst Du dann den 32kHz Uhrenquarz nicht auch n och dran und läßt die Uhr darüber laufen ?
Dann sind es in mehreren Tagen vielleicht mal eine Sekunde. Die DCF dient dann nur zum Einstellen der Softclock.
Thomas
Hi,
na ja hat zwei Gründe....erstens ist die Platine schon fertig und hat den Uhrenquarz natürlich nicht vorgesehen. Anderer Punkt ist das fast alle Pins belegt sind....sprich es in meinem Fall auch echt ungünstig wäre wenn ich die beiden Quarzpins wieder freigeben müsste. Wenn ich es verhindern kann würde ich es zumindest :D
Habe den Startwert erst um eins niedriger gemacht....da war die Uhr 10s zu langsam. Jetzt mache ich bei jedem Umlauf eimal 61 und einmal 60....dann läuft sie ziemlich genau. Bzw genau genug für meine Anwendung. Auf die Sekunde am Tag kommt es hier ja auch nicht an. Andere Möglichkeit wäre die Uhr auf den Timer1 zu machen wo ich genauer einstellen könnte......aber den brauche ich für andere Sachen.
Oder jemand noch eine andere idee außer den Startwert so zu modifizieren?
Grüße und Danke,
Lars
Hallo,
meine Uhr läuft an einem Tag mehrere Sekunden oder gar Minuten vor. Habe einen Uhrenquarz an dem Atmega 1280 angeschlossen (TOSC1 und TOSC2 bzw. Pin PG3 und PG4). Nur wie Nutze ich diesen? Was muss ich einstellen? Wenn ich in der include Datei nur statt DCF77-soft nur DCF77 einstelle, dann bekomme ich gar nichts mehr angezeigt. Habt verständnis dass ich diesen 20 Seiten Thread nicht durchgelesen habe und die Antwort irgendwo da drin ist.
Keiner eine Idee?
Uhrenquarz und DCF habe ich persönlich noch nicht auf einem Atmega verwendet. Ich nutze meist einen DS1307. Nicht nur wegen der batteriegepufferten Gangreserve. Allerdings weicht dieser trotz Uhrenquarz auch etwas ab (Vielleicht sollte ich nicht immer nur die Sonderangebote kaufen). Die DCF Routine fragt den DCF-PIN mehrmals pro Sekunde ab. Config Clock = Soft setzt nur die Variablen. Den Rest (die komplette Uhr) muß selbst programmiert werden. Ob es bei DCF auch so ist, weiß ich nicht. Ich nutze für DCF die Bascom internen Routinen. Wenn die Uhr etwas abweicht, hilft eine manuelle Timerkorrektur. Die Abweichung sollte aber stets gleich bleiben. Dies geht aber nicht über den internen Takt. Dafür benötigst Du einen Quarz oder Quarzoszillator.
Bei DCF sollte die Uhr aber öfter gestellt werden. So große Abweichungen sprechen für schlechten Empfang.
Bei mir stellt die sich jede Stunde. Nur habe ich gerade einen Einbauort, wo die Uhr nicht immer empfang hat. In der Nacht ist der Empfang gut am Tag eher Mäßig bis schlecht bis unmöglich. Deswegen benötige ich einen Uhrenquarz. Denn sonst geht die innerhalb eines Tages mehrere Minuten nach. Nur weis ich nicht wie ich den Uhrenquarz in der DCF77 Routine verwenden soll. Im Wiki steht von DCF77_soft ersetzen durch nur DCF77 aber dann zeigt bei mir die Uhr gar nichts mehr an.
Da wird z.B. ein Schaltnetzteil oder Netzgerät den Empfang stören. Wenn die Uhr nachgeht, würde ich mit den Timereinstellungen / bzw. der Crystal-Angabe spielen. Wichtig ist externer Takt.