AVR verhalten bei min und max von Werten

OP #1350909
Lesenswert?

Ich hänge gerade ein bisschen fest. Habe mehrere Dreh-Encoder, die je 
einen Wert hoch bzw runter-regeln sollen. Die Werte haben einen Minimal- 
und einen Maximalwert und verhalten sich unterschiedlich bei erreichen 
dieser Werte.
Manche sollen bei "Überlauf" einfach am entsprechenden oberen oder 
unteren Ende des Wertebereichs "festgehalten" werden, andere sollen eine 
Art modulo haben und bei durchschreiten des einen Limits einfach ans 
andere ende Gesetzt werden.
Bsp:
1. +1 -> 1 2 3 4 5 6 6 6 6 6 6 6  -1 -> 5 4 3 2 1 1 1 1 1
2. +1 -> 1 2 3 4 5 6 1 2 3 4 5 6  -1 -> 5 4 3 2 1 6 5 4 3

Hier ein auszug aus dem Code
1
//graytab is static signed char, die codeaufschlüsselung funktioniert, es wird korrekt hoch bzw runtergezählt bis eben zum Überlauf
2

3
  {
4
    if ((*(device->mem->value) + ((device->increment) * graytab[graycode[i]])) < (device->min))
5
    {
6
      if (device->modulo)
7
      {
8
        *(device->mem->value) = (device->max);
9
      }
10
      else 
11
      {
12
        *(device->mem->value) = (device->min);
13
      }
14
    }
15
    else if ((*(device->mem->value) + ((device->increment) * graytab[graycode[i]])) > (device->max))
16
    {
17
      if (device->modulo)
18
      {
19
        *(device->mem->value) = (device->min);
20
      }
21
      else
22
      {
23
        *(device->mem->value) = (device->max);
24
      }
25
    }
26
    else
27
    {
28
      *(device->mem->value) = ((*(device->mem->value) + ((device->increment) * graytab[graycode[i]])));
29
    }

Das ganze funktioniert aber noch nicht so recht, zb ist min 0 und der 
Wert wird aber bis -1 runtergezählt und beim hochzählen geht er bis 19 
(max ist 20) und springt dann wieder auf -1.
Gibt es grundsätzlich für dieser Zweck elegantere Lösungen (abgesehen 
vom % Operator, der Funktioniert dafür auch nicht richtig weil 
0-Durchlauf beim runterzählen nicht erkannt wird)
#1351035
Lesenswert?

Phillip Hommel schrieb:
> Ok, stimmt ist dann besser lesbar. Geht das von der Struktur her auch
> noch besser, gibts vllt schon Funktionen die das können?

Wenn du dir eine schreibst, gibt es sie :-)

Aber ansonsten kann man auch an der Lesbarkeit noch feilen
1
  newValue = *(device->mem->value) + (device->increment) * graytab[graycode[i]];
2

3
  if( newValue > device->max )
4
    newValue = device->modulo ? device->min : device->max;
5
    
6
  if( newValue < device->min )
7
    newValue = device->modulo ? device->max : device->min;
8
    
9
  *(device->mem->value) = newValue;
OP #1351075
Lesenswert?

Klar dagegen sage ich ja gar nichts. Habe deine Version auch direkt mal 
übernommen wenns ok ist ;)
In diesem Fall denke ich ist die durchschaubarkeit auch trotzdem 
gewährleistet.
Mein Projektchen nimmt übrigens schon ganz gut Form an, Eure Hilfe hier 
war wirklich Gold wert. Ich scheue mich auch nicht mehr vor Zeigern 
sondern habe sie echt zu schätzen gelernt ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren