- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: Problem mit dcf77 code in grösserem Projekt

  1. #1

    Problem mit dcf77 code in grösserem Projekt

    Anzeige

    Praxistest und DIY Projekte
    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.
    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

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    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

  3. #3
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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

  5. #5
    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:
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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

  7. #7
    Hallo Dirk,

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

    Bis denn

    Wolfgang

  8. #8
    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

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test