Encoder nach Peter und Auswertung

Gast #4825647
Lesenswert?
• ▲
▼
Hallo Gemeinde
ich verwende das Programm von Peter zur Auswertung Encoder. Soweit ist 
mit die Sache klar. Zusätzlich habe ich ein Display angeschlossen und 
lasse mir die Werte anzeigen.
1
for(;;)
2
  {
3
    val += encode_read4();          // lesen 1,2 oder 4 Schritt Encoder
4
    LEDS = val;
5
    Anzeige(val);  
6
  }
Auswertung erfolgt damit:
1
int8_t encode_read4( void )        // lesen vier Schritt Encoder = langsam
2
  {
3
  int8_t val;
4
  cli();
5
  val = enc_delta;
6
  enc_delta = val & 3;
7
  sei();
8
  return val >> 2;
9
  }


Dabei kann val einen positiven oder negativen Wert unterschiedlicher 
Grösse annehmen.
So einen grossen Wert brauche ich nicht. Möchte einfach wissen ob 
positiv oder negativ bzw. eine Begrenzung auf ca. 8 Werte und dann 
wieder auf null. Habe leider kein Plan dazu.
LG Kl
#4825668
Lesenswert?
• ▲
▼
@ Klars (Gast)

>So einen grossen Wert brauche ich nicht. Möchte einfach wissen ob
>positiv oder negativ bzw. eine Begrenzung auf ca. 8 Werte und dann
>wieder auf null. Habe leider kein Plan dazu.

Tja, was hast du denn außer Copy & Paste sonst gemacht?
Auch ein Programmieranfänger kann eine Variable auf +/-8 begrenzen.
Kleiner Tip:

if (val >8) . . .

Außerdem bist du im falschen Unterforum, siehe Überschrift!
Gast #4826431
Lesenswert?
• ▲
▼
Gebe ich das so ein, kommen die Zahlen 0 - 7, danach springt es zurück
auf 0. Damit bekomme ich negativen Zahlen mehr und der Encoder geht 
wunderbar.

W.A. schrieb:
> val &= 0x07;
-> 0..7

Versteh leider denn Sinn der Zeile nicht so ganz. Besonders wenn ich 
z.B.
val &= 0x04 eingebe. Möchte je nach Programm Teil unterschiedliche 
Zahlen ausgeben, von 2 bis 5.
LG KI
Moderator (Firma: Titel) Persönliche Seite #4826597
Lesenswert?
• ▲
▼
Klars schrieb:
> Versteh leider denn Sinn der Zeile nicht so ganz.
Hier geht es um Bitmanipulation in C.Dazu muss man wissen, was der 
Operator & macht, für Fortgeschrittene dann auch &= sowie dass 0x07 
binär 00000111 ist. Und deshalb die oberen 5 Bits auf 0 gesetzt und die 
unteren 3 unverändert gelassen werden.

> Besonders wenn ich z.B. val &= 0x04 eingebe.
Ja, das ist auch recht sinnlos wenn man ein wenig darüber nachdenkt...

Klars schrieb:
> Möchte je nach Programm Teil unterschiedliche Zahlen ausgeben, von 2 bis 5
Dann musst du einfach eine obere und eine untere Grenze überwachen. Das 
sind 2 Zeilen Code...
Gast #4826652
Lesenswert?
• ▲
▼
Lothar M. schrieb:
> W.A. schrieb:
>> Anderer Tip:   val &= 0x07;  -> 0..7
> Das stimmt aber nur, wenn val unsigned ist. Bei einer signed Variablen
> wird hier eigentlich auf -4..+3 begrenzt und dann wird -1 zu 7, -2 zu 6
> usw...

Das wage ich mal zu bezweifeln. -4 kannst du nicht mit den unteren drei 
Bit darstellen.
Auch bei einer signed Variablen wird auf 0..7 begrenzt. Der Wert -4 kann 
bei reinem inc/dec nie auftreten. Und ja, -1 wird zu 7, von 7 gehts bei 
einem "++" wieder auf 0.

Klars schrieb:
> Versteh leider denn Sinn der Zeile nicht so ganz. Besonders wenn ich
> z.B.
> val &= 0x04 eingebe.

Das scheint mir auch. 0x04 ist als Maskierung zur zyklischen 
Einschränkung des Wertebereichs nicht zu gebrauchen.

> Möchte je nach Programm Teil unterschiedliche Zahlen ausgeben,
> von 2 bis 5.

Das funktioniert mit einer Maskierung auch nicht. Beschreibe einfach mal 
genau, was du wirklich möchtest und nicht kleckerweise irgendwelche 
neuen Randbedingungen.
Moderator (Firma: Titel) Persönliche Seite #4826700
Lesenswert?
• ▲
▼
W.A. schrieb:
> Das wage ich mal zu bezweifeln. -4 kannst du nicht mit den unteren drei
> Bit darstellen.
Richtig, das stimmt natürlich für eine Wortbreite von 8 Bit. Ich war da 
ein wenig auf FPGAs mit beliebigen Wortbreiten ausgerutscht. Da würde 
ein 3 Bit breites "Wort" tatsächlich auf -4..+3 begrenzen. Allerdings 
bräuchte man dafür auch keine Maske... ;-)

PittyJ schrieb:
> Es gibt immer noch Lehrbücher zu gängigen Programmiersprachen. Die sind
> noch nicht ausgestorben.
Daran hatte ich auch schon gedacht. Aber ich hatte auch gedacht, da 
kommt Klars selber drauf...

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