Forum: Compiler & IDEs Differenz zwischen Variablen / Überlauf


von Hundertvolt (Gast)


Lesenswert?

Hallo zusammen,

mal ne Frage: Ich hab hier folgendes Stück Code:
1
    
2
    if (Beginn < Ende)                    // kein Überlauf während der Messung
3
      {
4
      Calc = Ende - Beginn;                // Rückgabewert der Messung berechnen
5
      }
6
    else                          // Timerüberlauf während der Messung
7
      {
8
      Calc = 0xFFFF - Beginn + Ende;            // Rückgabewert der Messung berechnen
9
      }

alle 3 Varialen sind unsigned short int.

Der Sinn des ganzen: Ich messe mit einem Mega32 die Kapazität eines 
Feuchtesensors mit einem Timer Capture Interrupt auf dem 16bit Timer1. 
Eine Messung dauert zwischen 1/5 und 1/6 der Gesamtzählzeit bis zum 
Überlauf, fängt aber irgendwo an und hört irgendwo auf. Mit dem Code 
habe ich einen Timer-Überlauf während einer Messung abgefangen. Geht 
wunderprächtig.

Jetzt hab ich mir gedacht, wäre es nicht viel einfacher, die ganze 
If-Abfrage sein zu lassen und das ganze ausschließlich mit
1
 
2
Calc = Ende - Beginn;

zu machen? Falls dazwischen ein Timerüberlauf war, gibt es halt bei der 
Subtraktion einen Überlauf (bzw. einen "Unterlauf" ;-) ), aber am Ende 
steht dann ja doch wieder der Betrag der Differenz in der Variable - 
oder?

Der einzige Unterschied zu vorher ist dann, wenn ich richtig liege, dass 
dann halt der Overflow-Flag im Statusregister gesetzt ist, aber das 
interessiert ja nicht weiter.

Lieg ich da falsch, ist das schlechter Stil, oder klappt das so? Würde 
halt schön viel Code sparen, weil ich einige solche Stellen im Programm 
hab... :-)

von STK500-Besitzer (Gast)


Lesenswert?

>oder klappt das so?

Ja.
Du hast einen beschränkten Zahlenraum. Wenn man da eine größere Zahl von 
einer kleineren subtrahiert, fängt man wieder "von oben" an.
In Büchern über Digitaltechnik wird auch gerne ein Zahlenkreis benutzt.
Einfach mal Zahlen von 0 bis 15 (der Reihe nach) in einem Kreis anordnen 
(z.B. im Uhrzeigersinn). Addiert man nun Zahlen, dann ist die Richtung 
im Uhrzeigersinn. Subtrahiuert man sie, ist die Richtung gegen den 
Uhrzeigersinn.
Man kann auch Zahlen im Binärformat nehmen...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hundertvolt schrieb:
> Hallo zusammen,
>
> mal ne Frage: Ich hab hier folgendes Stück Code:
>
>
1
>     if (Beginn < Ende)                    // kein Überlauf während der
2
> Messung
3
>       {
4
>       Calc = Ende - Beginn;                // Rückgabewert der Messung
5
> berechnen
6
>       }
7
>     else                          // Timerüberlauf während der Messung
8
>       {
9
>       Calc = 0xFFFF - Beginn + Ende;            // Rückgabewert der
10
> Messung berechnen
11
>       }
>
> alle 3 Varialen sind unsigned short int.
>
> Der Sinn des ganzen: Ich messe mit einem Mega32 die Kapazität eines
> Feuchtesensors mit einem Timer Capture Interrupt auf dem 16bit Timer1.
> Eine Messung dauert zwischen 1/5 und 1/6 der Gesamtzählzeit bis zum
> Überlauf, fängt aber irgendwo an und hört irgendwo auf. Mit dem Code
> habe ich einen Timer-Überlauf während einer Messung abgefangen. Geht
> wunderprächtig.
>
> Jetzt hab ich mir gedacht, wäre es nicht viel einfacher, die ganze
> If-Abfrage sein zu lassen und das ganze ausschließlich mit
>
>
1
> Calc = Ende - Beginn;
2
>
>
> zu machen?

Oben steht jedoch das da:
1
if (Beginn < Ende)            // kein Überlauf
2
    Calc = Ende - Beginn;     // Rückgabewert der Messung
3
else                          // Timerüberlauf während der Messung
4
    Calc = Ende - Beginn -1;  // Rückgabewert der

Die Rechnungen gehen modulo 2**16, und da ist -1 = 65535 = 0xffff

Johann

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.