Differenz zwischen Variablen / Überlauf

Gast #1280635
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... :-)
Gast #1280647
>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...
Persönliche Seite #1280668
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.