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¨!
Wenn's nicht klappen will, robier's mal damit: http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29
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
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!
"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
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!
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
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!
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
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
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!
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
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?
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?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.