Forum: Mikrocontroller und Digitale Elektronik Byte inkrementieren


von Simon (Gast)


Lesenswert?

Hallo, ich habe eine Frage, wie man ein Byte oder auch jede andere 
Variabel am besten inkrementiert um Werte größer 1.

1
while(!stop)
2
{
3
if(val < 255) val++;
4
else stop = 1;
5
}
Das funktioniert ja ohne Probleme.

Wenn ich aber nun den Wert jedes mal um 8 erhöhren möchte,.
1
while(!stop)
2
{
3
if(val < 255) val += 8;
4
else stop = 1;
5
}
Problem an der Sache ist, wenn ich immer 8 hinzuaddiere, lange ich bei 
theoretisch 0, da es zum Überlauf kommt.

0 + 8 = 8;
8 + 8 = 16;
...
248+8 = 256 => 0


Gibt es da eine andere Möglichkeit, als folgendes
1
if(val == 0) val += 7;
2
else if(val < 255) val += 8;
Davon ausgehend, dass die Werte nur in 8er Schritten gesetzt werden.

Alternativ
1
if(val == 0) val += 7;
2
else if(val - 8 <= 255) val += 8;
3
else { val = 255; stop = 1; }

von Georg G. (df2au)


Lesenswert?

Warum fragst du nicht auf 248 ab? Muss es unbedingt 255 sein?

von Simon (Gast)


Lesenswert?

Wie meinste das, ob es umbedingt 255 sein muss?

Ich habe hier einen Ablauf, bei dem von 0 bis 255 geregelt wird über 
einen Taster. Habe das ganze mit Debounce von Peter und der Reply 
Funktion gemacht.

Das inkrementieren um +1 dauert selbst bei 10ms noch zu lang. Würde 
deshalb gerne den Wert schneller inkrementieren. Mir geht es darum, dass 
ggf. etwas "einfacher" zu gestalten.

von Ulrich F. (Gast)


Lesenswert?

Wenn dir Byte nicht mehr reicht, verwende (u)int.

von Andreas H. (ahz)


Lesenswert?

Simon schrieb:
> Gibt es da eine andere Möglichkeit, als folgendesif(val == 0) val += 7;
> else if(val < 255) val += 8;
1
#define INCREMENT 8
2
3
while(!stop)
4
{
5
    if( val-INCREMENT < 255) 
6
        val += INCREMENT ;
7
    else 
8
        stop = 1;
9
}
Hth
Andreas

von Dieter F. (Gast)


Lesenswert?

Simon schrieb:
> Das inkrementieren um +1 dauert selbst bei 10ms noch zu lang

Interessant - welchen Mikrocontroller mit welcher Taktrate hast Du denn 
da?

Die Abfrage auf 248 sollte Dein Problem eigentlich perfekt lösen ...

von Andreas H. (ahz)


Lesenswert?

Andreas H. schrieb:
> if( val-INCREMENT < 255)

Muss natürlich
1
    if( val-INCREMENT <= 255)
sein.

Grüße
Andreas

von Dieter F. (Gast)


Lesenswert?

Was hast Du eigentlich vor? Willst Du eine "Verzögerung" programmieren? 
Dafür gibt es das "delay.."-Statement (nicht so gerne gesehen, da in der 
"delay-Zeitschleife" nichts anderes gemacht werden kann) oder Timer, die 
man entsprechend einsetzen kann.

von Phantomix X. (phantomix)


Lesenswert?

Andreas H. schrieb:
> Andreas H. schrieb:
>> if( val-INCREMENT < 255)
>
> Muss natürlich
>
1
>     if( val-INCREMENT <= 255)
2
>
> sein.
>
> Grüße
> Andreas

Wke wäre es mit
1
    if( val <= 255 - INCREMENT)
Somit sind für INCREMENT < 256 alle Überläufe ausgeschlossen.

von Kai I. (kderh)


Lesenswert?

Oder: Zähler und Ausgabewert-Variablen trennen.

1. Countervar. wirklich nur von 0-32 zählen lassen (so läufts nie über).
2. In jedem Schritt den Endwertvar. +8
3. if (counter==32): Endwert=255 und stop=1 nachträglich zur Korrektur


Natürlich etwas overhead drin, aber vielleicht ists ja schnell genug

von Andreas H. (ahz)


Lesenswert?

Phantomix X. schrieb:
> Andreas H. schrieb:
>>
>> Muss natürlich
>>>     if( val-INCREMENT <= 255)
>> > sein.
>>

Man sollte vieleicht seine Antworten vor dem Posten auch mal lesen und 
nicht parallel am Labortisch rumschrauben :/
Es muss hier natülich +INCREMENT sein.

>
> Wke wäre es mit
>     if( val <= 255 - INCREMENT)
>
> Somit sind für INCREMENT < 256 alle Überläufe ausgeschlossen.

Da der TO explizit von Byteoperationen spricht bin ich von uint8_t 
ausgegangen. Und da sollte der Überlauf wieder nach [0..255] gewrappt 
werden (und immer noch <= 255 sein), oder ?

Anyway, Deine Lösung erscheint mir trotzdem stabiler zu sein :-)

Grüße
Andreas

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.
Lade...