mech. Rotary Encoder entprellen

Gast #40749
Lesenswert?
• ▲
▼
Hi

Ich habe ein Programm geschrieben, mit dem ich ein Rotary Encoder
auswerten kann. Mein Problem ist, dass ich nicht genau weiss, wie man
diesen nun entprellt! Wenn ich das Programm laufen lasse, leuchtet
nämlich nur jedes 2. LED! Ich nehme an, dass dieser Effekt am prellen
des Encoder's liegt?

Wie ihr im Codeanhang sieht, möchte ich die Interrupts, Timer usw. frei
behalten und habe es mit Polling gelöst!

Vielen Dank für die Hilfe¨!
Angehängte Dateien:
Gast #40752
Lesenswert?
• ▲
▼
Rechtsdrehung:
    ___    ____    ____    ____    ___
___    ____    ____    ____    ___     Spur A

  ___    ____    ____    ____    ___
_    ____    ____    ____    ___    ___Spur B



Prinzip:

       |1|0
1. alt=0x00   -> Bit 1 löschen, danach links schieben:
   neu=0x01      alt=0x00
                 neu=0x01  -> XOR verknüpfen
               = state=0x01 Wenn state<1 war es eine Linksdrehung

                 sonst state-Register dekrementieren und überprüfen
                 ob state>=1 Wenn grösser gleich 1 = Rechtsdrehung,
                 sonst = Linksdrehung!!!



Linksdrehung:


  ___    ____    ____    ____    ___
_    ____    ____    ____    ___    ___Spur A

   ___    ____    ____    ____    ___
___    ____    ____    ____    ___     Spur B


Prinzip: genau gleicher Ablauf!
Angehängte Dateien:
Gast #40754
Lesenswert?
• ▲
▼
Sicher gibt es ein Unterschied!

sobald das Resultat von state = 0  ist, dann war es eine Linksdrehung!

Die Drehrichtungserkennung funktioniert auch, nur wird immer ein LED
übersprungen!!!

Ich möchte nicht einfach ein Code übernehmen, ich möchte ihn auch
verstehen!
#40755
Lesenswert?
• ▲
▼
Vielleicht kann ich Deinen Code verstehen, wenn Du den Unterschied auch
hinschreibst und nicht nur: "Prinzip: genau gleicher Ablauf!"


Mein Code funktioniert so:

alt->neu:
0->1: +1
1->3: +1
3->2: +1
2->0: +1
0->2: -1
2->3: -1
3->1: -1
1->0: -1

wobei:
0 = 00b
1 = 01b
3 = 11b
2 = 10b

Z.B. 3->2 entspricht dem Tabellenoffset 1011b = 11d und der 12. Eintrag
in der Tabelle ist eine "-1". Die Tabelle hat 16 Einträge (Offset
0..15).

Da oben steht aber "3->2: +1" !
Wieder einen Dreckfuhler entdeckt, es ist eben genau andersrum. Macht
aber nichts, einfach die beiden Drähte vertauschen und alles stimmt
wieder.


Peter
Gast #40756
Lesenswert?
• ▲
▼
Es wird die genau gleiche Verzweigung gemacht wie oben!!!

Schau bitte mal das Struktogramm im Anhang von meiner Beschreibung an!
Ich habe es durchgespielt, theoretisch müsste es funktionieren!
Gast #40758
Lesenswert?
• ▲
▼
Aha, ich dachte, die *.wmf - Files kann man auf jedem Word öffnen !
sorry! Also bei mir gehts (Einfügen->Grafik)

Habe jetzt noch ein JPEG angehängt!

Hoffentlich klappts...

Vielen Dank!
Izaord
#40760
Lesenswert?
• ▲
▼
Word habe ich, wußte aber nicht, daß es sowas öffnen kann.

Trotzdem bin ich der Meinung, daß Dein Code falsch ist. Probier doch
einfach mal die 8 möglichen Übergänge durch.

Der Gray-Code läßt sich eben nicht so einfach auswerten, deshalb habe
ich es mit der Tabelle gemacht.

D.h. mit einem Trick gehts auch ohne Tabelle. Ist sogar kürzer, aber
eben nicht so gut verständlich.


Peter
Gast #40761
Lesenswert?
• ▲
▼
00->10 : +1
10->11 : +1
11->01 : +1
01->00 : +1

00->01 : -1
01->11 : -1
11->10 : -1
10->00 : -1

Nun meine Rechnung (auf alle übergänge Anwendbar):

am Beispiel: 11->01

alt: 11 (alt Register Bit1 löschen und links schieben!)
neu: 01

alt2: 10
neu:  01
state = alt2 XOR neu = 0b11 = 3

Jetzt kommt die Verzweigung:
Wenn state >=1 ist, wird state nochmals dekrementiert, Wenn dann state
immer noch >=1 ist, war es eine Rechtsdrehung! Sonst links!



Bsp. 10->00 :

alt: 10 (alt Register Bit1 löschen und links schieben!)
neu: 00

alt2: 00
neu:  00
state= alt2 XOR neu = 0b00 = 0

Jetzt kommt die Verzweigung:
Wenn state >=1 ist, wird state nochmals dekrementiert, Wenn dann state
immer noch >=1 ist, war es eine Rechtsdrehung! Sonst links!



Das funktioniert bei allen übergängen!
#40762
Lesenswert?
• ▲
▼
Ich glaub, jetzt hab ichs kapiert. Das entspricht aber nicht Deinem
Code.

"Wenn state >=1 ist, wird state nochmals dekrementiert, Wenn dann
state
immer noch >=1 ist, war es eine Rechtsdrehung! Sonst links!"

Ist zwar undurchsichtig und umständlich aber nicht der Fehler.
Das sollte wohl im Klartext heißen:
if( state >= 2 )


Das "return" verleitet oft zu Fehlern, deshalb sollte man es
möglichst vermeiden. In Deinem Fall verhindert es die Ausführung von
"alt = neu;" am Ende.


Ein anderer hübscher "return"-Fehler ist das vergessene ";":

if( a == b )
  return
test();

Da hab ich ewig dran gesucht, da ja keine Fehlermeldung erzeugt wird,
aber test() wird zu oft ausgeführt.


Mein Fazit:
Return ist Teufelszeug, kommt gleich nach rekursiven Funktionen.


Peter
Gast #40763
Lesenswert?
• ▲
▼
Hey vielen Dank für die suuper Hilfe...

Stimmt, ich habe die Verzweigung abgeändert, ich konnte die IF -
Verzweigungen nicht verschachteln!
Ich bin noch am C-lernen...

Versuche jetzt die Verzweigung ohne Return! Geht das überhaupt? Gibt es
noch andere Verzweigungsmöglichkeiten?
Gast #40764
Lesenswert?
• ▲
▼
Ich bin jetzt dann am verzweifeln!

Ich kann mein Code (im Anhang) ohne Probleme im AVR Studio 4
simulieren! (hab schon 10 mal das ganze Programm durchgespielt)
Doch wenn ich es auf mein 8515 lade, wird beim Lauflicht immer eine LED
übersprungen. Ich dachte es sei wegen dem Prellen der Kontakte!
Darum habe ich, sobald neu != alt ist eine Verzögerung eingebaut und
lese der neue Wert nach dem Delay nochmal ein! -> Das ist doch
entprellt? (t=10ms)!
Auch jetzt geht das simulieren! Doch in Echtzeit klappt es nicht, dann
wird nicht mal mehr die Richtung erkannt!

Kann mir jemand helfen? Geht mein Prinzip doch nicht?
Angehängte Dateien:
Gast #40765
Lesenswert?
• ▲
▼
Soo nun habe ich den Fehler! Habt ihr eine Lösung um den Bug zu beheben
oder muss ich eine ganz neue Lösung finden? Ich möchte am liebsten
schon bei Polling bleiben und keine Interrupts, timer oder so was
brauchen!

die  Fehlüberlegung:

1. "Rastpunkt"
  ___________
__               Spur A

    __________
__             Spur B


Prinzip: genau gleicher Ablauf!


Das Programm merkt jetzt ein Wechsel von 00->10 und sehr kurze Zeit
danach ein Wechsel von 10->11!!! Das bedeutet, es überspringt einen
Zustand!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.