AVR verhalten bei min und max von Werten

OP #1350909
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)
Gast
aussagekräftigerName = *(device->mem->value) + ((device->increment) * 
graytab[graycode[i]]));

das dann vor dem ersten if
bei den ifs dann nur noch aussagekräftigerName verwenden
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;
Phillip Hommel schrieb:
> Aber
> abgesehen davon ist die Version von Karl Heinz deutlich schöner und
> kürzer als meine.

Genau das ?: ist es, was diesen Code kurz macht.
Und manchmal gewinnt ein Code durch die kürzere Schreibweise, solange 
man es nicht übertreibt.
OP
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

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.