Nochmal Probleme mit Time() ...

Hendrik
2007-07-24
2007-07-24
  • Hendrik - 2007-07-24

    Nochmal zum Block Time() ...

    dieser hat laut Anleitung einen Maxwert von 49d17h2m47s295ms (4194967295 ms)

    was passiert dann nach 49 Tagen -> er wird auf 0 gesetzt

    als Beispiel der Block m_t aus Oscat 1.7 ..

    ( check for rst input )

    IF rst OR et >= tmax THEN

    init := FALSE;
    
    startup := FALSE;
    
    pt := t#0ms;
    
    et := t#0ms;
    

    END_IF;

    ( avoid timers to start when input is true at startup )

    IF NOT startup THEN

    edge := in;
    
    startup := TRUE;
    

    END_IF;

    ( read system timer )

    tx := TIME();

    ( edge trigger rising and falling edge )

    IF in XOR edge THEN

    edge := in;
    
    (* rising edge starts measurement *)
    
    IF in THEN
    
        init := TRUE;
    
        start := Tx;
    
    (* falling edge stops measurement *)
    
    ELSIF init THEN
    
        stop := Tx;
    
        pt := stop - start;
    
    END_IF;
    

    END_IF;

    IF init AND in THEN

    et := Tx - start; ELSE et := t#0ms;
    

    END_IF;

    was passiert nun, wenn die steigende Flanke bei Time():=49d17h2m47s295ms kommt -> dann wird diese in Start gespeichert

    Danach kommt die fallende Flanke nach dem Reset des Timers, also bei Time():=500ms.

    Dann erfolgt die Berechnung der Differenz aus: et := Tx - start -> dies wäre dann Tx:=500ms - 49d17h2m47s295ms

    -> dabei kommt es sicher zum Ãœberlauf ...

    Viele Grüße

    Hendrik

     
  • hugo - 2007-07-24

    ja es kommt zu einem überlauf.

    jedoch ist das ergebnis einer subtraktion wieder richtig.

    probiere es einfach aus:

    setzte eine dword variable var_1 auf 0. ziehe davon 10 ab.

    setzte ein zweite dword variable var_2 auf 10.

    errechne nun das ergebnis var2 - var 1 und du bekommt genau die 20 die der differenz zwischen var 1 und var 2 entsprechen.

    eine subtraktion funktioniert auch bei überlauf, andere dinge wie vergelich größer kleiner oder addition jedoch nicht.

    deshalb benutzen wir in oscat immer nur das ergebnis der subtraktion endwert - startwert. das geht immer, auch bei überlauf.

     

Log in to post a comment.