PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit dcf77 code in grösserem Projekt



Wolfgang Nitzschke
25.01.2008, 19:03
Hallo,
ich benutze ein lcd-display für ein project, das mir neben anderen Dingen in der ersten Zeile auch die genaue dcf77 Uhrzeit und Datum anzeigen soll.
Alles funktioniert, wenn ich im Mega8 nur die routine zur darstellung des Datums/Uhrzeit benutze; die softclock wird nach kurzer Zeit auf die dcf77-Zeit aktualisiert. Benutze ich den code aber in meinem Projekt, wird die softclock nicht mehr korrigiert. Woran kanns liegen; kann ein großes Programm die interne dcf-lib behindern? Timer1 wird nur für dcf77 benutzt, timer0 für meinen code.


Config Dcf77 = Pinb.5 , Timer = 1
Config Date = Dmy , Separator = .
Dim Adate As String * 8
Dim Atime As String * 8
Do
...hier mein sonstiger code...
Adate = Date$
Atime = Time$
Locate 1 , 1
Lcd Adate
Locate 1 , 10
Lcd Atime
Loop


Die softuhr des mega8 wird ab Null hochlaufend schön angezeigt, mit meinem code nicht upgedated, ohne ja.
Woran könnte es liegen?
Danke
Wolfgang

mat-sche
25.01.2008, 19:14
Hallo Wolfgang,

leider gibst Du nicht Dein hw/sw stack mit an, auf welche Größe hast Du ihn gesetzt?
Ich hatte auch das Problem, dass die Uhr nicht gestellt wurde.

Config Dcf77 = Pinb.7 , Timer = 1 , Inverted = 0 , Timer1sec = 1 , Update = 1 , Updatetime = 1 , Check = 1 , Debug = 0 ,

gib mal diese Deklaration in Deinem Code mit an. Dann hast Du die Chance über:

Locate 10 , 2 : Lcd Bin(dcf_bits) ; " " ; Bin(dcf_status) ; " "

zu schauen ob die Statusbits ablaufen und ob das DCF77 Protokoll auch richtig empfangen/ausgewertet wird.
Und dann vergrößere mal Deinen hw/sw Stack auf ungefähr:

$hwstack = 250
$swstack = 250
$framesize = 70

Danach lief bei mir die Uhr.

Schau mal ob es was bringt!

Gruß MAT

Wolfgang Nitzschke
25.01.2008, 21:58
Hallo MAT

werde die Stack-Einstellungen mal ausprobieren. Ich hatte die Standard-Werte des Stack und frames von Bascom gelassen, da der Rest meines Programms ja ordnungsgemäß funktionierte.
Wenn ich die dcf-zeit mit Time(dcf_sec) direkt nehme, werden mir Werte angezeigt, die aber zum Teil auch falsch sind. Ich hatte den Verdacht, das mein restlicher code irgendwie die dcf-routine "ausbremst", der empfänger funktioniert ja einwandfrei.
Ich versuchs mal und melde mich wieder.
Danke
Wolfgang

Dirk
25.01.2008, 22:51
Hallo Wolfgang,

zu deinem Codeteil fällt mir ein:
1. Läuft wirklich die Softclock nicht mehr oder erfolgt nur keine Anzeige (weil dein "sonstiger Code" z.B. die DO-LOOP blockiert)?
2. Wie nutzt du den Timer0? Ist die ISR nicht zu lang, so dass andere ISRs nicht ablaufen können?
3. Warum überträgst du Date$ und Time$ in andere Variablen und gibst sie nicht direkt mit LCD Time$ aus?

Also Fragen, die auch deinen restlichen Code betreffen. Da wird die Ursache zu finden sein.

Gruß Dirk

Wolfgang Nitzschke
26.01.2008, 00:30
Hallo Dirk,

1. doch, die softclock läuft
2. Timer0-code beeinflusst die Zeitanzeieg. Stoppe ich den Timer0 oder lösche den code in der ontimer0-routine wird mir die dcf77-Zeit angezeigt.
(code siehe unten)
3. hast recht, geht auch, hab ich geändert, hatte mal Schwierigkeiten beim direkten ausgeben der date$ und time$ im lcd; aber jetzt gehts
übrigens- ich nutze den mega168 mit 3686400-quarz.

heir der ontimer0-code:


Ontimer0:
Incr Tc
If Tc >= 255 Then
Tc = 0
Incr Nf
Upperline
Lcd Date$ ; " " ; Left(time$ , 5)
If Nf > Tt Then 'überprüfen, ob Schleifenanzahl > Testzeit
Nf = 1
For J = 1 To 16
If Check(j) = 0 Then
Sensorfehler(j) = 1
Portd.2 = 1 'Speicher-LED ein
T = Date$ + Left(time$ , 5)
Ausfalldatetime(j) = T
End If
If Check(j) = 2 Then
Check(j) = 2
End If
If Check(j) = 1 Then
Check(j) = 0
End If
Locate 3 , J
Lcd Check(j)
Next J
End If
Locate 2 , 16
Lcd Nf
End If
Return


Gruß
Wolfgang

Dirk
26.01.2008, 11:12
Hallo Wolfgang,

eine ISR sollte so schnell wie möglich ablaufen. Auf jeden Fall sollte man keine LCD-Ausgaben in einer ISR machen. Das dauert viel zu lange und die andere ISR für die DCF-Decodierung wird blockiert.
Du könntest in der ISR z.B. ein Flag setzen, wenn eine Ausgabe auf dem LCD erfolgen soll. Die eigentliche Ausgabe erfolgt dann erst zusammen mit der Uhrzeit in der Hauptschleife.

Gruß Dirk

Wolfgang Nitzschke
26.01.2008, 12:04
Hallo Dirk,

danke für die Antwort, werds mal abändern in der Timer0-ISR.

Bis denn

Wolfgang

Wolfgang Nitzschke
30.01.2008, 17:39
So, habe jetzt meine ISR alle so umgestellt, dass ich keine Timer mehr brauche (außer dem Timer1 fürs DCF77) und alles in der Do-Loop-Schleife des Hauptprogramms untergebracht. Dadurch habe ich den Fehler einkreisen können: Schreibe ich innerhalb von rund zwei Minuten zu oft ins LCD, wird die interne Uhr vom DCF nicht aktualisiert; kommentiere ich die LCD-Ausgaben aus, wird aktualisiert.
Frage: Normalerweise hat der Interrupt des Timers1 doch höchste Priorität und müsste sich durch LCD-Ausgaben nicht beeinflussen lassen. Oder beeinflusst eine LCD-Ausgabe (die ja recht langsam ist) die dcf.lib, sodass diese die interen Uhr nicht aktualisieren kann?
Wer weiß was darüber?
Danke
Wolfgang

Dirk
30.01.2008, 18:06
Hallo Wolfgang,

kann sein, dass die LCD-Ausgabe mit ihren internen Waits die Ursache ist.

Die beste Lösung ist: Nur dann in das LCD schreiben, wenn sich der Inhalt ändert, bei einer Uhr z.B. 1x pro Sekunde.

Gruß Dirk