Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Timerüberlauf Kategorie: Programmierung (von nitram - 30.06.2009 7:10)
Als Antwort auf Re: Timerüberlauf von Detlef - 29.06.2009 20:48
Ich nutze:
C164CI-ControllerBoard, eigenes Board, OSOPT V3.0, OSOPT V3.1
> > > Hallo,
> > > ich habe mal eine Frage zur Timervariable.
> > >
> > > Die Systemtimervariable ist vom Typ long und wird ca. alle 24 Tage überlaufen. Die Frage ist, wie geht
> > > man mit dieser Variable nun um? Ich habe beispielsweise zyklische Ã?berwachungen programmiert,
> > > wo sich ein Proze� solange schlafen legt, bis system.timer() + X überschritten ist. Funktioniert auch
> > > prima, gehe aber nun davon aus, da� in einem ünglücklichen Moment das Ganze auch mal
> > > nach hinten losgehen kann.
> > > Wie kann man diese Variable überhaupt sicher verwenden?

ja kann man, warum auch nicht :-)

> > > Kann man diese evtl. auch wieder zurücksetzen?

ja kann man, macht aber keinen Sinn...

> > Zurück setzen / verändern geht da nicht.

> >
> > Ich habe einen ähnlichen Anwendungsfall wie Du. Bei mir ist es eine Spannungsfrei Schaltung für
> > Rolladenmotore.
> >
> > Ich habe eine zweite Variable (eigener Timer) genommen, welche im Sekundentakt hochgezählt wird.
> > Diese benutze ich das als eigene Timer Variable. Um hier jetzt einen Ã?berlauf zu verhindern, wird die
> > eigene Timervariable immer um 4.00 Uhr zurückgesetzt. Die Wahrscheinlichkeit, das früh um 4.00 Uhr
> > Rolläden bedient werden, ist bei mir unwahrscheinlich. Aber man könnte auch hier noch entgegen
> > wirken, und den Rolladen Thread einfach um 4.00 aussetzen.
> >
> > Ob diese Lösung bei Dir anwendbar ist, weis ich nicht. Vielleicht hilfst irgendwie als Lösungsansatz.
> >
> >
> > Rene
>
> Hallo Rene
> vielen Dank für die Antwort.
> inst ja mal interessant, ein Anwendungsfall des Threads mit dem Timer ist tatsächlich auch die
> Jalantriebe wieder spannungsfrei zu schalten...
>
> Habe jetzt erstmal folgenden Lösungsansatz gewählt, frage mich aber, ob das nicht auch eleganter
> geht.
>
>       if (Aktzeit[a] <= system.timer() and Aktzeit[a]-360000000 < Aktzeit[a])      
>        or (((Aktzeit[a]-360000000) > system.timer()) and Aktzeit[a] > 360000000)    
>
> Aktzeit[a] wird durch andere Funktionsteile gesetzt, und ist system.timer() + eine Wartezeit X.
>
> Normalerweise reicht ja der Vergleich
>
>     Aktzeit[a] <= system.timer()
>
> um ein Ereignis auszulösen, aber wegen des Zählerumlaufs habe ich das um
>  
>    Aktzeit[a]-360000000 < Aktzeit[a] erweitert. Dieser Ausdruck bleibt nämich negativ, wenn
>
> Aktzeit[a] umgelaufen ist.
>
> Au�erdem wir sofort ausgelöst, wenn Aktzeit[a] - 100 Stunden immernoch grö�er ist als
> system.timer() obwohl Aktzeit[a] schon grö�er ist als 100 Stunden. dann ist nämlich
> system.timer() umgelaufen, und das Ereignis mu� sofort ausgelöst werden.

Timerabfragen sollten eigentlich immer nach folgenden Schema ablaufen:


long timer;
 timer=system.timer();
 loop
 {
  ...
  if  system.timer()-timer>=500 // Ist die Wartezeit von 500ms um??
   {
    timer=system.timer(); // Timerwert speichern
    ... // mach etwas
   }
 }


Solange der Datentyp vom Typ long sind, passiert nichts.

nitraM
 


    Antwort schreiben


Antworten:

Re: Timerüberlauf (von Detlef - 30.06.2009 9:54)
    Re: Timerüberlauf (von Detlef - 30.06.2009 11:24)
Re: Timerüberlauf (von Detlef - 30.06.2009 8:12)
    Re: Timerüberlauf (von Detlef - 30.06.2009 8:36)
    Re: Timerüberlauf (von nitram - 30.06.2009 8:30)
        Re: Timerüberlauf (von reneforster - 30.06.2009 15:01)
            Re: Timerüberlauf (von nitram - 30.06.2009 21:16)
        Re: Timerüberlauf (von Detlef - 30.06.2009 9:21)
        Re: Timerüberlauf (von Detlef - 30.06.2009 8:45)