PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dreh-Encoder gibt "Rückschlag-Impuls" ab - wieso nur?



t0bias
03.03.2014, 13: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

BastelWastel
03.03.2014, 16:08
Das liegt daran dass diese Drehschalter wie gewoehnliche Encoder funktionieren.
Unabhaengig von der Drehrichtung sollten immer beide LEDs leuchten...nur die Reihenfolge muss sich aendern.

Schau mal hier.. http://de.wikipedia.org/wiki/Inkrementalgeber#Signalauswertung

Schau am besten mal ins Datenblatt, da sollten die Anschluesse auch "A" und "B" heissen.

Gruss, Andreas