Forum: Mikrocontroller und Digitale Elektronik Encoder nach Peter und Auswertung


von Klars (Gast)


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

von Falk B. (falk)


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!

von Klars (Gast)


Lesenswert?

Sorry für falsche Forum. Steht doch Projekte und Code drüber?
Warum bin ich nicht selbst drauf gekommen, ich Esel (Selbstkretik). Ist 
zu einfach.
Danke

von W.A. (Gast)


Lesenswert?

Anderer Tip:
1
val &= 0x07;
-> 0..7

von Klars (Gast)


Lesenswert?

Gilt das auch wenn der Wert von -7 bis +7 gehen soll und wenn grösser 
oder kleiner auf 0 soll?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Klars (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von W.A. (Gast)


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.

von PittyJ (Gast)


Lesenswert?

Es gibt immer noch Lehrbücher zu gängigen Programmiersprachen. Die sind 
noch nicht ausgestorben.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Klars (Gast)


Lesenswert?

Danke für eure Hilfe. Werde die Sachen überwachen und kann dadurch auch 
verschiedene Grenzen einstellen
Danke an alle

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.