Hallo Günter,
manchmal liegt das Prob im Detail:
Poste doch 'mal deine Änderungen!
Zur Sicherheit: Uhrenquarz 32768 Hz an TOSC1/2 wirklich vorhanden?
Gruß Dirk
muss vorausschicken, dass ich novize bin, also wahrscheinlich ist der fehler einfach zu finden (hoffe ich zumindest)
ich habe die lib von dirk in der version 2.50 in verwendung, samt zugehörigen include-code
auf meinem mega128 mit 16MHz und uhrenquarz + conrad dcf77.
interner pullup, invertierter ausgang des CDF, sauberes DCF-signal (mit oszi geprüft)
Timer ist der 16bit-timer, prescale und stratwert angepasst an die taktfrequenz, interupts an diesen timer1 angepasst, port A0 im code und der LIB eingetragen.
bei inbetriebnahme wird staus.7 auf 1 gesetzt, detto status.2 (seltsam- sofort nach status.7- in der selben sekunde) und status.0 (keine ahnung was der tut)
die variable dcfcounter läuft von 0-256 in etwa 6-7sek, dcfbuffer und dcfparity bleiben auf 0, dcfpulse steht auf 1, dcfpau auf 0, dcfimp auf 1 (beide in der lib enabled).
was sagt euch dieses fehlverhalten? bin ratlos und hoffe auf eure hilfe
grüsse aus wien
günter
Hallo Günter,
manchmal liegt das Prob im Detail:
Poste doch 'mal deine Änderungen!
Zur Sicherheit: Uhrenquarz 32768 Hz an TOSC1/2 wirklich vorhanden?
Gruß Dirk
ja, der uhrenquarz ist mit 32,nochwas kHZ vorhanden, die interne Soft-clock des atmel geht auch brav.
habe das glück mit dem farb-grafik-display relativ viel auf einmal anzeigen zu können, daher sehe ich auch alle angeben des vorigen posts auf einmal.
ich sehe auch, dass ich das signal tatsächlich am pin ankommt zumal ich das signal des input-pins auf einen output mit LED dahinter "hinüberspiegle"
der pin als eingang ist der A0, das reister für die A-ports ist lt. bescheibung des M128 das $19 wenn ich das alles richtig interpretiert habe.
so nun aufgelistet:
deine lib v2.50, register $19, pin0 also port A0 am prozessor
uhrenquarz aus TOSC, softclock läuft auch
timer Timer1 wegen 16bit aufgrund 16MHz prozessortakt
interupt auf Timer1 geändert, prescale auf 8, start auf 15536
signalform des DCF ist so wie's sein soll, timings des DCF habe ich mit Oszi nachgemessen, alles wie es sein soll
wenn ich nicht alles schon 7x nachgeprüft und überlegt hätte, hätte ich nie gepostet, ich habe auch diese thread schon quasi auswendig gelernt aber keinen hinweis darauf gefunden was ich falsch mache.
vielen dank für deine hilfe!
günter
Hallo Günter,
das was du schreibst, klingt alles richtig.
Ich würde als nächstes Folgendes machen:
Nimm einen anderen Eingangspin nicht aus PortA, weil PortA ja zunächst als ADC definiert ist (z.B. Pind.0),- evtl. ist das die Ursache.
Als Timer-Startwert habe ich 15543, aber 15536 müßte auch gehen.
Hier noch meine LIB V2.52, da ist ein Fehler in der Softclock ausgebügelt, der in die V2.50 reingerutscht war:
Viel Erfolg!Code:copyright = W.Krueger comment = DCF77-Decoder und Softclock libversion = 2.52 (D. Ottensmeyer) date = 07.10.2006 statement = ---------------------------------- statement = muss alle 25ms ausgeführt werden ! statement = Neu: komplette Paritätsprüfung statement = Neu: Auswertung der Bits 15..20 statement = Neu: erweiterte Softclock statement = ---------------------------------- [Dcf77_soft] .equ DCF_Port = $10 ;$10 = Portd .equ DCF_Pin = 3 ;3 = Pin 3 .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 Status = r18 ;Bit0 = aktueller DCF Status ;Bit1 = vorheriger DCF Status ;Bit2 = 58 Impulse empfangen ;Bit3 = Parität OK ;Bit4 = Stundenparität OK ;Bit5 = Uhr nach DCF gestellt ;Bit6 = Datum nach DCF gestellt ;Bit7 = Uhr nach DCF stellen .def Impulse = r19 .def Counter = r20 .def Buffer = r21 .def Parity = r22 Dcf77_soft: *lds Status,{Dcfstatus} ;Status laden rcall Softclock ;Softclock bearbeiten bst Status,7 ;Status Uhr nach DCF stellen ? brts Puls0 ;ja -> weiter *sts {Dcfstatus},Status ret ;------------------------------------------------------------------------------- [Dcf77] .equ DCF_Port = $10 ;$10 = Pind .equ DCF_Pin = 3 ;3 = Pin 3 .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 Status = r18 ;Bit0 = aktueller DCF Status ;Bit1 = vorheriger DCF Status ;Bit2 = 58 Impulse empfangen ;Bit3 = Parität OK ;Bit4 = Stundenparität OK ;Bit5 = Uhr nach DCF gestellt ;Bit6 = Datum nach DCF gestellt ;Bit7 = Uhr nach DCF stellen .def Impulse = r19 .def Counter = r20 .def Buffer = r21 .def Parity = r22 Dcf77: *lds Status,{Dcfstatus} ;Status laden bst Status,7 ;Status Uhr nach DCF stellen ? brts Puls0 ;ja -> weiter ret Puls0: *lds Impulse,{Dcfimpulse} ;Variablen laden *lds Counter,{Dcfcounter} *lds Buffer,{Dcfbuffer} *lds Parity,{Dcfparity} in temp1,Dcf_Port ;DCF Port lesen bst temp1,Dcf_Pin ;Status holen bld Status,0 ;aktuellen Status speichern inc Counter ;Impulslänge erhöhen bst Status,0 ;aktuellen 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 Counter,temp1 ;Impulslänge Minimalwert überschritten brcs Puls10 ;nein -> weiter *sts {Dcfpau},Counter ;--------> Minutenimpulslänge speichern für Debug clr Buffer ;Empfangspuffer löschen clr Impulse ;Impulszähler löschen bst Status,3 ;Parität OK ? brtc Puls15 ;Nein -> weiter bst Status,2 ;58 Impulse empfangen ? brtc Puls15 ;Nein -> weiter rcall Stellen ;empfangene Zeit übernehmen Puls5: clt bld Status,2 ;Status 58 Impulse löschen bld Status,3 ;Status Parität OK löschen bld Status,4 ;Status Stundenparität OK löschen Puls10: clr Counter ;Impulslänge löschen rjmp Puls40 ;Ende Puls15: bst Status,4 ;Stundenparität OK ? brtc Puls5 rcall Zeitstellen ;nur Uhrzeit übernehmen rjmp Puls5 Puls20: bst Status,1 ;vorherigen Status prüfen brts Puls40 ;vorheriger Status Low -> Ende ldi temp1,Imp1min ;Minimalwert für "1" Impuls laden cp Counter,temp1 ;Minimalwert unterschritten ? brcs Puls30 ;ja -> weiter *sts {Dcfimp},Counter ;--------> Impulslänge High speichern für Debug cpi Impulse,28 ;beim Paritätsbit Min keine Negation breq Puls25 cpi Impulse,35 ;beim Paritätsbit Std keine Negation breq Puls25 cpi Impulse,58 ;beim Paritätsbit Datum keine Negation breq Puls25 ldi Temp1,1 eor Parity,Temp1 ;Paritätsbit Negation Puls25: sec ;Carry setzen ( "1" empfangen ) ror Buffer ;Carry in Empfangspuffer rcall Auswerten ;Impulse auswerten inc Impulse ;Impulszähler erhöhen rjmp Puls40 ;Ende Puls30: *sts {Dcfimp},Counter ;--------> Impulslänge Low speichern für Debug clc ;Carry löschen ( "0" empfangen ) ror Buffer ;Carry in Empfangspuffer rcall Auswerten ;Impulse auswerten inc Impulse ;Impulszähler erhöhen Puls40: bst Status,0 ;aktuellen Status holen bld Status,1 ;Status speichern *sts {Dcfstatus},Status ;Variablen wieder speichern *sts {Dcfimpulse},Impulse *sts {Dcfcounter},Counter *sts {Dcfbuffer},Buffer *sts {Dcfparity},Parity ret ;------------------------------------------------------------------------------- Softclock: ;muss 40x pro Sekunde aufgerufen werden *lds Temp1,{Dcfhsec} inc Temp1 ;Hundertstel Sek erhöhen cpi Temp1,40 ;1000ms erreicht ? breq Soft10 ;ja -> weiter *sts {Dcfhsec},Temp1 ret ;sonst Ende Soft10: clr Temp1 ;Hundertstel Sek löschen *sts {Dcfhsec},Temp1 *lds Temp1,{_sec} inc Temp1 ;Sekunde erhöhen cpi Temp1,60 ;60 Sekunden erreicht ? breq Soft20 ;ja -> weiter *sts {_sec},Temp1 ret Soft20: clr Temp1 ;Sekunde löschen *sts {_sec},Temp1 *lds Temp1,{_min} inc Temp1 ;Minute erhöhen cpi Temp1,60 ;60 Minuten erreicht ? breq Soft30 ;ja -> weiter *sts {_min},Temp1 ret Soft30: clr Temp1 ;Minute löschen *sts {_min},Temp1 *lds Temp1,{_hour} inc Temp1 ;Stunde erhöhen cpi Temp1,24 ;24 Stunden erreicht ? breq Soft40 ;ja -> weiter *sts {_hour},Temp1 ret Soft40: clr Temp1 ;Stunde löschen *sts {_hour},Temp1 *lds Temp1,{_dayofweek} inc Temp1 ;Wochentag erhöhen cpi Temp1,8 ;letzter Wochentag erreicht ? brne Soft50 ;nein -> weiter ldi Temp1,1 ;Wochentag auf "1" (Montag) Soft50: *sts {_dayofweek},Temp1 *lds Temp1,{_day} ;Tag holen *lds Temp2,{_month} ;Monat holen ldi zl,low(Tagdaten*2) ldi zh,high(Tagdaten*2) ;Anzahl Tage pro Monat holen add zl,Temp2 ;Zeiger auf aktuellen Monat lpm ;Anzahl Tage holen cp Temp1,r0 ;Monatsende erreicht ? brne Soft90 ;nein -> weiter cpi Temp2,2 ;Monatsende Februar ? brne Soft60 ;nein -> weiter clt ;Evtl. Schaltjahr mit 29.2. bld Status,6 ;Status Datum nach DCF gestellt löschen Soft60: cpi Temp2,6 ;Monatsende Juni ? brne Soft70 ;nein -> weiter clt ;Zur Jahresmitte evtl. Schaltsekunde bld Status,5 ;Status Uhr nach DCF gestellt löschen Soft70: ldi Temp1,1 ;Tag auf 1 cpi Temp2,12 ;Jahresende erreicht ? brne Soft100 ;nein -> weiter clt ;Zum Jahreswechsel evtl. Schaltsekunde bld Status,5 ;Status Uhr nach DCF gestellt löschen *lds Temp2,{_year} ;Jahr holen inc Temp2 ;Jahr erhöhen cpi Temp2,100 ;Jahr 100 erreicht ? brne Soft80 ;nein -> Ende clr Temp2 ;Jahr 00 setzen Soft80: *sts {_year},Temp2 ;speichern ldi Temp2,1 ;Monat auf 1 rjmp Soft110 Soft90: inc Temp1 ;Tag erhöhen rjmp Soft110 Soft100: inc Temp2 ;Monat erhöhen Soft110: *sts {_day},Temp1 ;Datum speichern *sts {_month},Temp2 ret Stellen: *lds Temp1,{Dcftemp+2} *sts {_day},Temp1 ;Tag auf empfangenen Tag *lds Temp1,{Dcftemp+3} *sts {_dayofweek},Temp1 ;Wochentag auf empfangenen Wochentag *lds Temp1,{Dcftemp+4} *sts {_month},Temp1 ;Monat auf empfangenen Monat *lds Temp1,{Dcftemp+5} *sts {_year},Temp1 ;Jahr auf empfangenes Jahr set bld Status,6 ;Status Datum nach DCF gestellt setzen Zeitstellen: ldi Temp1,1 ;Hundertstel zurücksetzen *sts {Dcfhsec},Temp1 ;(1. Intervall 25ms kürzer !) clr Temp1 *sts {_sec},Temp1 ;Sekunde auf 0 setzen *lds Temp1,{Dcftemp} *sts {_min},Temp1 ;Minute auf empfangene Minute *lds Temp1,{Dcftemp+1} *sts {_hour},Temp1 ;Stunde auf empfangene Stunde *lds Temp1,{Dcftemp+6} *sts {Dcfflags},Temp1 ;DCF77-Bits 15..20 aktualisieren set bld Status,5 ;Status Uhr nach DCF gestellt setzen ret Tagdaten: .db 00, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;------------------------------------------------------------------------------- Auswerten: cpi Impulse,14 ;14. Impuls brne Aus5 ;nein -> weiter clr Buffer Aus5: cpi Impulse,20 ;20. Impuls brne Aus10 ;nein -> weiter bst Buffer,7 ;Startbit 20 (S) selektieren brtc Aus26 ;Fehler -> Ende lsr Buffer ;Buffer 2x schieben, da 6 Bit lsr Buffer *sts {Dcftemp+6},Buffer ;Temp DCF77-Bits 15..20 schreiben ;Inhalt Buffer -> Bit0 (R) : Reserve-Antenne des DCF77-Senders ; Bit1 (A1): Ankündigung des Wechsels MEZ <-> MESZ ; Bit2 (Z1): \__ Z1/Z2: 10 = MESZ, 01 = MEZ ; Bit3 (Z2): / ; Bit4 (A2): Ankündigung einer Schaltsekunde ; Bit5 (S) : Startbit f. Zeitinformationen (immer 1) clr Buffer clr Parity Aus10: cpi Impulse,27 ;27. Impuls brne Aus15 ;nein -> weiter lsr Buffer ;Buffer 1x schieben, da Minute nur 7 Bit rcall Bcd2dez ;in Dezimal wandeln *sts {Dcftemp},Buffer ;Temp Minute schreiben clr Buffer Aus15: cpi Impulse,28 ;Minuten Parität brne Aus20 clr Temp1 bst Buffer,7 ;Paritätsbit selektieren bld Temp1,0 ;Paritätsbit in Temp1 Bit0 kopieren cp Temp1,Parity ;Minutenparität überprüfen brne Aus26 ;Fehler -> Ende clr Parity clr Buffer Aus20: cpi Impulse,34 ;34. Impuls brne Aus25 ;nein -> weiter lsr Buffer ;Buffer 2x schieben, da Stunde nur 6 Bit lsr Buffer rcall Bcd2dez ;in Dezimal wandeln *sts {Dcftemp+1},Buffer ;Temp Stunde schreiben clr Buffer Aus25: cpi Impulse,35 ;Stunden Parität brne Aus30 clr Temp1 bst Buffer,7 ;Paritätsbit selektieren bld Temp1,0 ;Paritätsbit in Temp1 Bit0 kopieren cp Temp1,Parity ;Stundenparität überprüfen breq Aus27 ;Parität OK -> weiter Aus26: ret ;Fehler -> Ende Aus27: set bld Status,4 ;Bit4 Status setzen (Stundenparität) clr Parity clr Buffer Aus30: cpi Impulse,41 ;41. Impuls brne Aus40 lsr Buffer ;Buffer 2x schieben, da Tag nur 6 Bit lsr Buffer rcall Bcd2dez ;in Dezimal wandeln *sts {Dcftemp+2},Buffer ;Temp Tag schreiben clr Buffer Aus40: cpi Impulse,44 ;44. 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 {Dcftemp+3},Buffer ;Temp Wochentag schreiben clr Buffer Aus50: cpi Impulse,49 ;49. Impuls brne Aus60 lsr Buffer ;Buffer 3x schieben, da Monat nur 5 Bit lsr Buffer lsr Buffer rcall Bcd2dez ;in Dezimal wandeln *sts {Dcftemp+4},Buffer ;Temp Monat schreiben clr Buffer Aus60: cpi Impulse,57 ;57. Impuls brne Aus70 rcall Bcd2dez ;in Dezimal wandeln *sts {Dcftemp+5},Buffer ;Temp Jahr schreiben clr Buffer Aus70: cpi Impulse,58 ;Restparität brne Aus80 set ;T-Bit setzen bld Status,2 ;Bit2 Status setzen (58 Impulse) clr Temp1 bst Buffer,7 ;Paritätsbit selektieren bld Temp1,0 ;Paritätsbit in Temp1 Bit0 kopieren cp Temp1,Parity ;Restparität überprüfen brne Aus90 ;Fehler -> Ende set ;T-Bit setzen bld Status,3 ;Bit3 Status setzen (Parität) Aus80: cpi Impulse,59 ;mehr als 58 Impulse (d.h. Störimpulse) brne Aus90 clt ;T-Bit löschen bld Status,2 ;Bit2 Status löschen (58 Impulse) 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]
Dirk
zunächst mal der grund warum der code zunächst nicht funktioniert hat:
wenn man einen 16MHz-quarz verbaut dann sollte man _nicht_ crystal=8000000 drinstehen haben .....![]()
![]()
![]()
kaum macht man's richtig geht's auch schon (besser)![]()
nun habe ich den fehler gefunden und behoben nur um vor einer neuen ungewissheit zu stehen, die ich mir schon wieder nicht erklären kann.
verwende mittlerweile deine lib 2.52. die statusbits für parity und stundenparity gehen nach einiger zeit beide auf high, das flag für zeit und datum stellen (bit7) steht auch auf high, nur nachdem das flag für 58 impulse nicht kommt wird die zeit natürlcih nicht übernommen (sofern ich den assembler richtig lese).
was ich aber nicht verstehe- der zähler für die impulse läuft bis 255 und nix passiert- eigentlich sollte der doch irgendwann gezielt gelöscht werden?
die frage ist jetzt die- stimmt irgendwo im hauptprogramm von mir was nicht, empfang (schliesse ich eigentl. aus)?, lib (???)
(wieder) ratlose grüße
günter
Hallo Günter,
der Impulszähler darf nicht bis 255 hochzählen!
Ich würde erst nur ein "Minimalprogramm" zur Anzeige ausprobieren. Ich habe mal so ein Kurzprog hier eingestellt,- du müßtest noch deine Timer-Variante anpassen:
Code:'Hauptprogramm: Cls Cursor Off Date$ = "01.01.00" Time$ = "00:00:00" Sekunde = 0 '* HAUPTPROGRAMMSCHLEIFE * Do If Sekunde <> _sec Then Cls Call Showtime() Sekunde = _sec End If If _min = 0 And Dcfstatus.7 = 0 Then '1x pro Stunde: Dcfstatus.5 = 0 'Zeit inaktuell Dcfstatus.6 = 0 'Datum inaktuell End If 'Wenn Uhr oder Datum inaktuell, dann nach DCF stellen: 'Timer0 ist nur aktiv, solange DCF-Empfang läuft!!! If Dcfstatus.5 = 0 Or Dcfstatus.6 = 0 Then Dcfstatus.7 = 1 Enable Timer0 Else Dcfstatus.7 = 0 Disable Timer0 End If Loop End '* ENDE HAUPTPROGRAMM * Sub Showtime() Locate 1 , 1 'Zeile 1: Lcd Time$ 'Uhrzeit Locate 2 , 1 'Zeile 2: Lcd Date$ 'Datum End Sub
weiss jetzt nicht, wie ich den code so poste wie ihr, daher mache ich das so als text.
$regfile = "m128def.dat"
$framesize = 32
$swstack = 256
$hwstack = 64
$lib "dcf77.lib" 'LIB für DCF77
$external Dcf77
Declare Sub Dcf77
Declare Sub Lcd_print(byval Lcd_text As String , Byval Lcd_posx As Byte , Byval Lcd_posy As Byte , Byval Fontsize As Byte , Byval Lcd_fcolor As Byte , Byval Lcd_bcolor As Byte)
'----------------------------------------------------------------------
Lcd_port Alias Portb 'Port B
Ddrb = &B01100110 'Port B: 4 Pins output
Const Kommando = 0 'Eine folgendes Kommando wird durch "1" eingeleitet
Const Parameter = 1 'Eine folgende Parameterübergabe wird durch "0" eingeleitet
Const Rs = 6
Const Cs = 5
Const Sdata = 2
Const Sclk = 1 'd.h. Port B.1
Const Blau = &B00000011 'Vordefinierte Konstanten für die Farbwerte machen das Programmiererleben leichter:
Const Gelb = &B11111100
Const Rot = &B11100000
Const Gruen = &B00011100
Const Schwarz = &B00000000
Const Weiss = &B11111111
Const Hellgruen = &B00111110
Const Dunkelgruen = &B00010100
Const Dunkelrot = &B10100000
Const Dunkelblau = &B00000010
Const Hellblau = &B00011111
Const Orange = &B11111000
'================================================= ==========================
' Includes für DCF77
Config Date = Dmy , Separator = . 'deutsches Datumsformat
Config Clock = Soft 'Softclock aktivieren
' (läuft mit Timer2!)
Config Timer1 = Timer , Prescale = 8 'Timer 40Hz
Const Startwert = 15543 'Für 16MHz
Timer1 = Startwert
On Timer1 Tim1_isr 'Überlauf 40x/s
Enable Interrupts
Disable Timer1 'zunächst ausschalten
'---------------------- Pin für DCF Eingang definieren ---------------------
'Jeder Portpin kann benutzt werden.
'Auch in der "Dcf77.lib" entsprechend anpassen !!!
Config Pind.3 = Input 'DCF77 Eingang
Portd.3 = 1 'Pullup ein
Config Pind.5 = Output
Set Portd.5
Config Pind.7 = Input
Portd.7 = 1
Dim Count As Word
Count = 0
'--------------------- Variablen der DCF77.lib -----------------------------
Dim _dayofweek As Byte , Dcfstatus As Byte , Dcfflags As Byte
'_dayofweek -> 1..7 (Mo..So)
'Dcfstatus -> Bit0: intern Bit4: Stundenparität OK
' Bit1: intern Bit5: Uhr nach DCF gestellt
' Bit2: 58 Impulse empfangen Bit6: Datum nach DCF gestellt
' Bit3: Parität OK Bit7: Uhr nach DCF stellen
' ACHTUNG: Bits 0..4 NUR LESEN!!!
'Dcfflags -> Bit0 (R) : Reserve-Antenne des DCF77-Senders
' Bit1 (A1): Ankündigung des Wechsels MEZ <-> MESZ
' Bit2 (Z1): \__ Z1/Z2: 10 = MESZ, 01 = MEZ
' Bit3 (Z2): /
' Bit4 (A2): Ankündigung einer Schaltsekunde
' Bit5 (S) : Startbit f. Zeitinformationen (immer 1)
'Interne Variablen der DCF77.lib:
Dim Dcfcounter As Byte , Dcfbuffer As Byte , Dcfimpulse As Byte
Dim Dcfparity As Byte , Dcfhsec As Byte , Dcftemp(7) As Byte
Dim Dcfpau As Byte , Dcfimp As Byte 'Nur für Debug!
Dim Helper As String * 3
'---------------------------------------------------------------------------
Dcfstatus = 0
Dcfstatus.7 = 0 'Uhr nach DCF stellen: AUS
Dcfstatus.5 = 1 'Uhrzeit inaktuell
Dcfstatus.6 = 1 'Datum inaktuell
' End für DCF77
'================================================= ==========================
Date$ = "01.01.06"
Time$ = "01:00:00"
Gosub Lcd_init
Gosub Lcd_cls 'Display löschen
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Do 'endless loop
Call Lcd_print( "started" , 1 , 10 , 0 , Weiss , Blau)
' If _min = 0 And Dcfstatus.7 = 0 Then '1x pro Stunde:
If Pind.7 = 0 Then
Dcfstatus.5 = 0 'Zeit inaktuell
Dcfstatus.6 = 0 'Datum inaktuell
End If
'Wenn Uhr oder Datum inaktuell, dann nach DCF stellen:
'Timer1 ist nur aktiv, solange DCF-Empfang läuft!!!
If Dcfstatus.5 = 0 Or Dcfstatus.6 = 0 Then
Dcfstatus.7 = 1
Enable Timer1
Call Lcd_print( "Ena" , 1 , 3 , 0 , Weiss , Blau)
Helper = Str(dcfstatus)
Call Lcd_print(helper , 1 , 4 , 0 , Rot , Weiss)
Else
Dcfstatus.7 = 0
Disable Timer1
Call Lcd_print( "Dis" , 5 , 3 , 0 , Weiss , Rot)
End If
Call Lcd_print(time$ , 1 , 1 , 0 , Weiss , Blau)
Call Lcd_print(date$ , 1 , 2 , 0 , Weiss , Blau)
Helper = Str(dcfstatus)
Call Lcd_print(helper , 1 , 4 , 0 , Rot , Weiss)
Helper = Str(dcfcounter)
Call Lcd_print(helper , 1 , 6 , 0 , Rot , Weiss)
Helper = Str(dcfbuffer)
Call Lcd_print(helper , 6 , 6 , 0 , Rot , Weiss)
Helper = Str(dcfimpulse)
Call Lcd_print(helper , 11 , 6 , 0 , Rot , Weiss)
Helper = Str(dcfparity)
Call Lcd_print(helper , 16 , 6 , 0 , Rot , Weiss)
Helper = Str(dcfpau)
Call Lcd_print(helper , 1 , 7 , 0 , Gruen , Weiss)
Helper = Str(dcfimp)
Call Lcd_print(helper , 6 , 7 , 0 , Gruen , Weiss)
If Pind.3 = 0 Then
Portd.5 = 0
Else
Portd.5 = 1
End If
Loop
End 'end program
'================================================= ==============================
Tim1_isr:
Call Dcf77
Return
die restlichen definitionen für dasd farbdisplay habe ich weggelöscht, weil die tun nichts zur sache. sonst wars das aber.
mit pinD.7 starte ich den DCF, später mal wird das dann über die zeit erfolgen (aber das wäre für die tests jetzt recht unpraktisch)
ich kann mir leider nicht erklären warum der impulse-counter über die 58 hinausläuft obwohl zu diesem zeitpunktdie zwei parity's auf 1 stehen.
vielen dank für allfällige tips
günter
Hallo Günter,
für Codeblöcke kannst du oben "Code" anklicken, dann den Code einfügen und wieder auf "Code" klicken. Am Anfang wird dann (Code) und am Ende (/Code) eingefügt (hier runde Klammern anstelle der eckigen!).
Zu deinem Prog:
1. Ich kann nicht erkennen, wie du Pind.7 beschaltet hast. Wenn er dauerhaft auf GND liegt, müßte der Decoder ständig AN sein und die Zeit irgendwann übernehmen.
2. Die ISR ist nicht richtig! Sie muss so aussehen:
Tim1_isr:
[highlight=red:19a9190e4a]Timer1 = Startwert[/highlight:19a9190e4a]
Call Dcf77
Return
Gruß Dirk
hallo dirk,
vielen dank für deine nachhilfe. kleine ursache, grosse wirkung.
deine letzter tip mit dem startwert war's.
funktioniert bestens!
lg günter
Hallo Günter,
habe auch das Display von Display3000.
Ich würde gern den funktionierenden Code mit Displayansteuerung erben.
Ist es möglich den Code zubekommen?
MfG
Lesezeichen