t0bias
03.03.2014, 14:00
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:
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. :confused:
Leider verstehe ich nicht, wieso das passiert. Kann mir jemand einen Tipp geben?
Danke,
viele Grüsse
Tobi
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:
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. :confused:
Leider verstehe ich nicht, wieso das passiert. Kann mir jemand einen Tipp geben?
Danke,
viele Grüsse
Tobi