www.mikrocontroller.net

Forum: Compiler & IDEs mech. Rotary Encoder entprellen


Autor: Izoard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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¨!

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Izoard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe leider keinen *.WMF-Betrachter.


Peter

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Izoard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
jetzt aber!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Izoard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: tubbu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.