Hallo zusammen,

ich habe einen Alps Dreh-Encoder mit Switch-Funktion an einen Atmega88 zusammen mit drei LED's gehängt, wovon jeweils eine kurz aufleuchten und dann ausfaden soll, wenn der Encoder nach links gedreht wird, eine bei einer Drehung nach rechts und eine bei Betätigung der Switch-Funktion.
Mein Bascom-Code dazu:
Code:
Declare Function Checkvalue() As Byte
Declare Function Setposition() As Byte

$regfile = "m88def.dat"
$crystal = 20000000

$baud = 9600


Dim Sled As Word	' LED für Switch
Dim Lled As Word	' LED für links-Drehung
Dim Rled As Word	' LED für rechts-Drehung

Ddrb.3 = 1
Ddrd.5 = 1

Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 1
Config Timer1 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 1

Config Pinc.0 = Input		' Right
Portc.0 = 1          		' Pullup
Config Pinc.1 = Input		' Left
Portc.1 = 1                	' Pullup
Config Pinc.2 = Input		' Switch
Portc.2 = 0 			' Pullup

Config Pind.5 = Output
Config Pinb.1 = Output
Config Pinb.3 = Output

Cha Alias Pinc.0
Chb Alias Pinc.1
Swi Alias Pinc.2


Leftled Alias Portd.5

Switchled Alias Portb.1

Rightled Alias Portb.3

Lled = 0
Rled = 255
Sled = 0

Pwm0a = Rled
Pwm1a = Sled
Pwm2a = Lled


'Dim Encoderpos As Integer

'Encoderpos = 0

Dim Returnval As Byte
Dim Preva As Byte

Do

   If Swi = 1 Then
     Returnval = Checkvalue()
   Elseif Swi = 0 Then
     Returnval = Setposition()
   End If

   If Sled > 0 Then
     Sled = Sled - 1
     Pwm1a = Sled
   End If


   If Lled = 1 Then Pwm2a = 0

   If Lled > 1 Then
     Lled = Lled - 2
     Pwm2a = Lled
   End If


   If Rled = 254 Then Pwm0a = 255

   If Rled < 254 Then
     Rled = Rled + 2
     Pwm0a = Rled
   End If

   Waitms 5


Loop



Function Checkvalue

      If Preva = 1 And Cha = 0 And Chb = 0 Then
	 'Right
         Rled = 127
      Elseif Preva = 1 And Cha = 0 And Chb = 1 Then
	 'Left
         Lled = 127
      End If

      Preva = Cha

End Function


Function Setposition

      If Lled < 245 Then
        Lled = Lled + 10
      End If

      If Rled > 10 Then
        Rled = Rled - 10
      End If

      Sled = 255

      'Encoderpos = 0
End Function
Das funktioniert auch ganz gut, solange ich nach rechts drehe. Wird der Encoder nach links gedreht, funktioniert das zwar auch, zwischendurch wird aber immer wieder die LED getriggert, die bei einer Rechtsdrehung aufleuchten soll.
Leider verstehe ich nicht, wieso das passiert. Kann mir jemand einen Tipp geben?

Danke,
viele Grüsse

Tobi