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
						
					
Lesezeichen