Forum: Compiler & IDEs mech. Rotary Encoder entprellen


von Izoard (Gast)


Angehängte Dateien:

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¨!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn's nicht klappen will, robier's mal damit:
http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29

von Peter D. (peda)


Lesenswert?

Es kann es so nicht gehen.
Nach "alt^neu" weißt Du zwar, daß sich was geändert hat, aber nicht
mehr die Richtung, denn:

alt^neu = neu^alt


Ein funktionierendes Beispiel findest Du hier:

http://www.mikrocontroller.net/forum/read-4-37992.html


Peter

von Izoard (Gast)


Angehängte Dateien:

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!

von Peter D. (peda)


Lesenswert?

"Prinzip: genau gleicher Ablauf!"

Ganz genau, kein Unterschied mehr zwischen vor und zurück !


Ich sehe gerade, in meinem Beispiel ist ein Dreckfuhler, richtig heißt
es:

0->1->3->2->0: "+1"
0->2->3->1->0: "-1"


Peter

von Izoard (Gast)


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!

von Peter D. (peda)


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

von Izoard (Gast)


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!

von Peter D. (peda)


Lesenswert?

Ich habe leider keinen *.WMF-Betrachter.


Peter

von Izoard (Gast)


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

von Izoard (Gast)


Angehängte Dateien:

Lesenswert?

jetzt aber!

von Peter D. (peda)


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

von Izoard (Gast)


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!

von Peter D. (peda)


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

von Izoard (Gast)


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?

von Izoard (Gast)


Angehängte Dateien:

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?

von Izoard (Gast)


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!

von tubbu (Gast)


Lesenswert?

hallo, ich habe einen drehschalter, bei dem bei einer rechtsdrehung die
beieden bits immer gleich sind (beide high, oder beide low) und bei
einer linksdrehung unterschiedlich

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.