Ich habe viele Encoder-Programme ausprobiert, bei mir läuft dieses zuverlässig:
Code:
$regfile = "m8adef.dat"
$crystal = 2000000
$hwstack = 40
$swstack = 16
$framesize = 32
Portc = &B11 ' PIN 0,1 Pullup
Enc_a Alias Pinc.1
Enc_b Alias Pinc.0
Dim Wert As Byte , Tick As Byte
Wert = 30 'Vorgabewert
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
Config Timer0 = Timer , Prescale = 1024 '= ~10MHz= ~0,1µs * 1024= 0,1ms
On Timer0 Enc_int 'Interrupt
Timer0 = 246 'Timerstartwert:10; ~0,1ms * 10= 1ms
Enable Timer0
Enable Interrupts
Do
Locate 1 , 1 : Lcd "Drehencoder EC11"
Locate 2 , 1 : Lcd "Wert : " ; Wert ; " "
Waitms 1
Loop
Enc_int:
Timer0 = 246 'Timerstartwert
Tick.0 = Enc_a 'Zustandswechsel
Tick.1 = Enc_b
Select Case Tick
Case &H0_2 : Incr Wert
Case &H0_1 : Decr Wert
End Select
Tick.4 = Tick.0
Tick.5 = Tick.1
Return
End
Das LCD ist nur zur Demo. Der Ausgang "Wert" kann für beliebige Zwecke angepaßt werden.
Joachim
Lesezeichen