PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehencoder entprellen?



dreadbrain
27.11.2007, 19:22
Hallo,
ich hab mir von csd-electronics einen Drehencoder gekauft.
Hab den jetzt an meinen Atmega16 hängen


Den A-Ausgang hab ich an einen Interrupt(INT2 da kein anderer mehr frei ist)

Ich frage in der ISR nur ab ob der B-Ausganbg 0 oder 1 ist und je nach dem springe ich zu einem label wo er die variable incrementiert oder decrementiert.


Nun mein Problem:
Im großen und ganzen funtkioniert es schon, nur überspringt er mir manchmal werte oder geht in die Falsche Richtung ( ich dreh hoch, er zählt runter) etc.

Ich vermute das es am Kontaktprellen liegt.
Nur wie kann ich das Entprellen?
Per Software hab ich mal nach dem aufruf eine kleine Pause ( 500us) eingefügt. Das bringt etwas aber es ist nicht berauschend.

Per Hardware habe ich mir gedacht kleine RC Kombinationen zwischen Encoder und Controller zu hängen.

mfg Benedikt

milkbubi
27.11.2007, 19:40
Ich weiß leider nicht womit du programmierst aber in Bascom gibts den Debounce Befehl dafür. Wenns nicht bascom sein soll, dann kannst dir das ja trotzdem mal ansehen. Vielleicht erkennst du ja wie die das gemacht haben.

mfg milkbubi

vajk
27.11.2007, 20:07
Also es gibt verschiedene Möglichkeiten .. aber im Prinzip läßt man einen Zähler laufen und schreibst in eine Variable pro Taste .. und schaust nach einer gewissen Zeit z.b. 100ms nach ob die Taste noch gedrückt ist und wertest das dann erst als gedrückt aus ... so kannst Du z.b. auch unterscheiden, ob die Taste kurz oder lang gedrückt wurde ... bei den Drehgebern gehst Du genauso vor, nur solltest Du einen Ausgang auf einen INT setzen und dort dann nachsehen, was der zweite Ausgang liefert .. daraus ermittelt man die Drehrichtung ...

dreadbrain
28.11.2007, 16:42
Hallo,

ich programmiere in Bascom.

Ich versteh nicht ganz wie ich ich den encoder entprellen soll.
Soll ich mit A einen Interrupt auslösen, dann eine zeit Starten und dann nachsehen ob B da ist oder nicht.?

mfg Benedikt

vajk
28.11.2007, 16:51
nun, mit bascom kenn ich micht nicht aus .. das kapselt vieles ... da gabs ja oben den debounce-befehl ... wie der auch immer aufgebaut ist.
Du must halt zwei ports abfragen, einer davon sollte einen interrupt auslösen .. dann fragst Du beide ab, siehe Datenblatt des encoders weißt Du dann die Richtung ...

dreadbrain
29.11.2007, 17:47
Hallo,

Ich habe es mit dem debounce befehl probiert.
Nur nach einem Interruptaufruf kann ich auf dem gleichen Pin keinen Debounce befehl mehr anwenden.

Hat jemand kein Beispielprogramm für Bascom.

Würde es etwas nützen wenn ich RC-Glieder zwischen µC und Encoder schalt


mfg Benedikt

Lusbueb33
02.12.2007, 12:57
Ein RC-Glied (Tiefpass) hilft bestimmt. Du musst aber zwei Bauteile mehr verlöten.

dreadbrain
02.12.2007, 21:43
Hallo,
Die 2 Bauteile sind egal.

Weis sonst niemand wie man so einen drehencoder per software entprelltß


Danke
mfg Benedikt

Lusbueb33
02.12.2007, 22:16
Ich kenne mich mit AVR-Mikrocontrollern zwar nicht so gut aus, aber da müsste es doch eine Möglichkeit geben Interrupts zu sperren?
Am Anfang der Interrupt-Routine sperrst du also den Interrupt und startest einen Timer welcher nach 100ms überläuft. Der Timer löst beim Overflow einen anderen Interrupt aus, in welchem du den gesperten Interrupt wieder freigibst.

killrob
07.12.2007, 14:30
Hallo,

leider kenne ich deinen Drehimplusgeber nicht.
Hochwertige funktionieren mit Lichtschranken. Da prellt normal nicht so viel.
Wenn es sich um Schalter handelt, dann könntest du das ganze doch mit Flip-Flops entprellen: Ein Ausgang am Set-Eingang des FF, der andere Ausgang am Rücksetz-Eingang. Mit einem 2ten FF könntest du dir die Richtung anzeigen lassen.
Mit einem 74HCT74 sollte das möglich sein.

CU
Rob