www.mikrocontroller.net

Forum: Compiler & IDEs Differenz zwischen Variablen / Überlauf


Autor: Hundertvolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

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

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
 
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... :-)

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hundertvolt schrieb:
> Hallo zusammen,
>
> mal ne Frage: Ich hab hier folgendes Stück Code:
>
>
>     if (Beginn < Ende)                    // kein Überlauf während der
> Messung
>       {
>       Calc = Ende - Beginn;                // Rückgabewert der Messung
> berechnen
>       }
>     else                          // Timerüberlauf während der Messung
>       {
>       Calc = 0xFFFF - Beginn + Ende;            // Rückgabewert der
> Messung berechnen
>       }
>
> 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
>
>
> Calc = Ende - Beginn;
> 
>
> zu machen?

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

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

Johann

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.