Ich habe auch bei einem Bastelprojekt mal einen (Billig-)Encoder von Pollin eingesetzt. Mittlerweile benutze ich wieder Tasten.
Zur Erklärung:
Die Encoder haben zwei Signalausgänge, namentlich A und B. Durch drehen ergibt sich folgender Signalwechsel (siehe auch Datenblatt zu deinem Encoder)
Rechtsrum: (A,B)= (1,1)-(0,1)-(0,0)-(1,0) usw.
Linksrum: (A,B)= (1,1)-(1,0)-(0,0)-(0,1) usw.
Dein Modell durchläuft auch alle diese Signalzustände, rastet jedoch nur in den Zuständen A=B, also (0,0) und (1,1) ein.
Es gibt aber auch Encodermodelle, die bei allen vier möglichen Zuständen einrasten, und dafür wurde die Encoder-Funktion von Bascom auch geschrieben.
Ich habe auch mit der Encoderfunktion ein bischen rumgespielt bin aber dann bei einer selbstgeschriebenen Funktion gelandet. Obwohl die auf der Benutzung von externen Interrupts basiert (was zwar von den Profis zu Recht verpöhnt wird) fahre ich damit eigentlich ganz gut. Ich mußte jedoch die Kontakte durch RC-Glieder entprellen.
Das ganze sieht dann etwa so aus:
Code:
Config Int2 = Falling 'Ph_a an ext. Int2
On Int2 Isr_int2
Enable Int2
Enable interrupts
Dim Rotary as byte 'Bit0= Ph_a, Bit1= Ph_b
Dim Enc_down as bit 'Flag Runterzählen
Dim Enc_up as bit 'Flag Hochzählen
Dim Encoderstand as byte
'Hauptprogramm
Do
If Enc_down=1 then
reset Enc_down
if Encoderstand>0 then decr Encoderstand
Elseif Enc_up=1 then
reset Enc_up
if Encoderstand<255 then incr Encoderstand
Endif
Loop
End.
Isr_int2: 'Externer Interrupt von Ph_a
Rotary.0 = Ph_a 'Signal A lesen
Rotary.1 = Ph_b 'Signal B lesen
Rotary = Rotary And &B00000011
If Rotary = 0 Or Rotary = 3 Then 'Ph_a = Ph_b
Set Enc_down
Else
Set Enc_up
End If
Toggle Mcucsr.isc2 'Umschaltung steigende/fallende Flanke Int2
Return
Lesezeichen