Forum: Mikrocontroller und Digitale Elektronik Drehgeber - (wiedereinmal)


von jaja...derhenne (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
habe einen Drehgeber mit A und B Signal (2 Bit) an PD2 und PD3
angeschlossen und möchte einen counter rauf oder runterzählen.
Dafür wird die erste Stellung einmal eingelesen und der Gray-Code in
Binär-Code umgewandelt, danach wird erneut die Position eingelesen und
dann mit der alten verglichen.
Bei der Gray/Binär-Umwandlung wird das MSB (Bit 1)so wie es ist
übernommen und das LSB(Bit 0) durch XOR-Verknüpfung des LSB mit dem MSB
bestimmt.

Der Code funktioniert aber nicht so, wie ich es möchte.
Muss man einen Timer-Interrupt dafür starten ??
Wenn ja, warum ?
Vielleicht kann mir jemand Verbesserungen vorschlagen
oder die Fehler nennen.
Habe die anderen Post im Forum schon gelesen, wollte aber was in
Assembler und nicht in C programmieren.

von condor (Gast)


Lesenswert?

hallo

wenn dir jemand bei der lösung geholfen hat wäre es super wenn du dein
ASM hir nochmal einspielen würdest. ich suche nänlich aus so was...

hofendlich weiß dir jemand rat

von Moritz (Gast)


Angehängte Dateien:

Lesenswert?

moin

hab zwar nicht ganz verstanden wie du das gemacht hast. hab aber vor
einer woche was ähnliches geschrieben. hat auch erst ewig nich
funktioniert, bis ich gemerkt hab das der drehgeber nich richtig
festgelötet war. jetzt funktionierts dafür um so besser. anbei mein
progrämmchen. die sache mit dem drehgeber (rotator) steht relativ weit
oben. ich benutz den int 0 (PD3) zum auslesen, müsste aber auch mit
polling funktionieren.

von krassXXL (Gast)


Lesenswert?

hi,derhenne

hast du vielleicht in C-Programm? Wenn ja kannst du mir vielleicht zu
schicken?

von Johnny (Gast)


Lesenswert?

Guckst Du hier ab Seite 33:
http://www.jogy.ch/files/Circuit_Cellar_Design_Contest_H3210/Propeller_Display.pdf

Ich hab beim Terminal zu meinem farbigen Propeller Display einen
Drehgeber verbaut um Buchstaben auszuwählen.
Eine Kurzbeschreibung ist hier zu finden:
http://www.jogy.ch/German/electronic.html

Gruss
Johnny

von TravelRec. (Gast)


Lesenswert?

Wenn das ein Drehgeber ist, wie ich ihn kenne, dann ändert, je nach
Drehrichtung, immer ein Pin zuerst seinen Pegel gegenüber dem anderen.
Nun, dann würde ich diesen Pin, in der Regel Pin A, mit einem
Interruptpin des Controllers verbinden. Der Interrupt wird auf
Pin-Toggeln eingestellt. In der ISR überprüft man dann den Pegel des 2.
Pins, ist dieser (noch) Low, wurde in die eine Richtung gedreht, ist er
(noch) high, wurde in die andere Richtung gedreht. Dann muß man noch
ein Flag setzen, welches die Abfrage des Encoders innerhalb der
nächsten 30ms verhindert, damit man das Prellen nicht mit abfragt, und
dann sollte das schon klappen. Bei meinem "C....d" - Encoder funzt
diese Praxis sehr schön.

von Johnny (Gast)


Lesenswert?

Per Port-Interrupt kriegt man das nicht vernünftig zum funktionieren.
Besser eine kleine State-Maschine programmieren und die beiden Pins in
einem Timer-Interrupt pollen.
Ich habe viel experimentiert und mit der State-Maschine funktionierte
es schlussendlich perfekt.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Such in der Codesammlung nach Peter Danneggers Lösung !

von inoffizieller WM-Rahul (Gast)


Lesenswert?

wasn alter Thread...

von Jan B (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Drehgeberauswertung per Interrupt ist nicht zu empfehlen.
Das Prellen bei mech.Drehgebern oder auch das "Zittern" um eine
Position bei opt.Drehgebern führt leicht zu Zählfehlern oder gar
zu einem Stacküberlauf, weil zu viele Interupts in zu kurzer Zeit
aufgerufen werden.

Hier ein Beispiel für eine Drehgeberauswertung per Polling.
Das Codebeispiel ist in ASM, aber wegen der Kürze einfach zu
verstehen und in andere Sprachen zu übertragen.

Gruß Jan

von TravelRec. (Gast)


Lesenswert?

Ich hatte doch oben gerade erwähnt, daß der Interupt nach der ersten
Erkennung für ca. 30ms gesperrt wird. Damit wird das Drehgeberprellen
ausmaskiert und Doppelinterrupts ausgeschlossen. Nach der allerersten
Erkennung eines Pegelwechsels wird der Pinstatus in der ISR
festgestellt, der selbst bei fiesem Prellen stimmt, da der Interrupt
unmittelbar nach Pegelwechsel (egal wohin) ein einziges Mal zugelassen
wird. Da der 2. Pin technisch bedingt erst viel später den Pegel
wechselt, ist alles bereits vergessen, bevor irgendeine Prellspitze das
Ergebnis versauen könnte. Allen Zweiflern sei gesagt, daß dies hier auch
bei schnellem Rotieren sehr gut funktioniert.

von Johnny (Gast)


Lesenswert?

TravelRec, das ist Quatsch, ich habs selbst ausprobiert. Stell Dir mal
vor, dass einer kontinuierlich den Drehgeber dreht. Nun wird der erste
Takt zwar korrekt erkannt und gezählt mit Deinem Port I/O Interrupt.
Dann sperrst Du den IRQ und gibst ihn nach der Prellzeit wieder frei.
Nun, da sich der Drehgeber jetzt bewegt, ist es nun reiner Zufall,
welches Signal des Drehgebers als nächstes "ausschlägt", wenn der IRQ
wieder freigegeben worden ist. Also weisst Du nicht, ob es sich nun nach
links oder rechts gedreht hat.
Mit Deiner Lösung und wenn man den Drehgeber konstant rel. zügig dreht,
springt der Zählerstand zufällig vorwärts und rückwärts oder bleibt gar
stehen.

Daher ist die State-Maschine nötig, welche durchlaufen werden muss,
damit ein Zählschritt ausgelöst wird. Dadurch findet gewissermassen
eine kleine Plausibilitätskontrolle statt.

von Dirk (Gast)


Lesenswert?

Das stimmt, Johnny hat recht. Kurze Überschlagsrechnung dazu:

Wir nehmen mal an, dass der Drehgeber 32 Rastungen hat. Bei einer
Drehung von einer Rastung zur nächsten treten mindestens zwei gültige
Impulse auf (Signal A: up/down, Signal B: up/down). Macht pro ganzer
Umdrehung 64 Impulse. Wenn Du die Umdrehung in einer Sekunde machst,
liegen zwischen den Impulsen 1/64 = 0,03125 Sekunden, also gut 30ms.
Das wird dann aber ganz schön knapp mit der Interruptsperrung für
30ms...

von TravelRec. (Gast)


Lesenswert?

Macht doch wie ihr denkt - wenn ich Probleme mit meiner Lösung bekomme,
mach ich´s auch so. Schluß mit der Rauferei ;-)

von Johnny (Gast)


Lesenswert?

Ok, Frieden :-)

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.