Hallo Hans,
in Bascom gibt es einen eigenen Befehl, der "Encoder" heißt. Dieser Befehl muss allerdings sehr engmaschig ausgeführt werden, damit ihm keine Aktionen des Drehgebers "entgehen".
Um genau dies zu vermeiden (dass eine Aktion am Drehgeber nicht erkannt wird), benutze ich eigentlich immer eine Interrupt-basierte Lösung.
Im anhängenden Bild sieht man schön die Funktionsweise eines Drehgebers (oder Encoders): Er besteht im wesentlichen aus zwei Schließkontakten, die mit einer gewissen Phasenverschiebung geschlossen und geöffnet werden, wenn man an der Achse dreht. Legt man die Kontakte A und B über PullUp-Widerstände auf +5V, gibt es zwei Rechtecksignale, wie im Bild dargestellt. Die senkrechten, gestrichelten Linien stellen hierbei die "Rast"-Postition des Encoders dar.
Du legst Kontakt A auf einen Interrupt-Eingang und konfigurierst den Interrupt als falling, und Kontakt B auf einen beliebigen Eingang (PINX.Y). In der Interrupt-Routine wird PINX.Y abgefragt: Ist dieser Eingang low, dann wurde gegen den Uhrzeigersinn gedreht, ist er high, wurde im Uhrzeigersinn gedreht (CW = clockwise = im Uhrzeigersinn, CCW = counterclockwise = gegen den Uhrzeigersinn).
Ich entprelle den Interrupt-Eingang immer mit einem kleinen Kondensator (z.B. 10nF vom Eingang gegen Masse), weil sonst die Kontakte oft mehrfach gezählt werden. Als Code könnte das so aussehen:
Code:
Dim Variable as Byte
Config INT0=falling
On INT0 Drehregler
Enable INT0
Enable Interrupts
Do
..
..
..
Loop
Dehregler:
If PINX.Y=1 then Variable = Variable + 1 else Variable = Variable - 1
Return
So entgeht dem Controller keine einzige Bewegung am Drehgeber - und bei einer halbwegs vernünftigen Taktfrequenz müsste man schon eine hochtourige Bohrmaschine an den Encoder anschließen, um an die zeitliche Auflösungsgrenze zu kommen
Lesezeichen