Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasten reagieren nicht (gelöst)



GoodOldLoki
30.04.2009, 12:55
Ich habe ein Servo am RN-Control angeschlossen.
Es soll beim Start in Mittelstellung fahren und dann per Tastendruck nach rechts(Taste3), in Mittelstellung(Taste2) undnach links (Taste1) fahren.

Beim Start fährt es auch artig in die Mittelstellung, aber wenn ich auf die Tasten drücke passiert nichts.

Kann mir jemand sagen wo der Fehler liegt?
Hier der Code



Declare Function Readbuttons() As Byte
Declare Sub Servoleft()
Declare Sub Servocenter()
Declare Sub Servoright()

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Adc = Single , Prescaler = Auto 'für Tastenabfrage
Config Pina.7 = Input 'für Tastenabfrage
Porta.7 = 1
Config Porta = Output 'für Servo
Config Servos = 1 , Servo1 = Porta.0 , Reload = 10 'für Servo
Config Portc = Output 'für LEDs

Enable Interrupts

Dim Button As Byte
Dim I As Byte

'*******************Main function**************************
Do
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1

Servo(1) = 95
Portc.1 = 0

Button = Readbuttons()

If Button <> 0 Then
Select Case Button
Case 1
Call Servoleft
Case 2
Call Servocenter
Case 3
Call Servoright
Case 4
Print "keine funktion"
Case 5
Print "keine funktion"
End Select
End If
Waitms 100
Loop
End

'**********************Functions****************** *****************

Function Readbuttons() As Byte
Local Ws As Word
Readbuttons = 0
Ws = Getadc(7)
Print "ws= " ; Ws
If Ws < 1010 Then
Select Case Ws
Case 400 To 455
Readbuttons = 1

Case 335 To 380
Readbuttons = 2

Case 250 To 305
Readbuttons = 3

Case 180 To 220
Readbuttons = 4

Case 100 To 130
Readbuttons = 5

End Select

End If

End Function



Sub Servoleft()
Servo(1) = 45
Portc.0 = 0
Portc.1 = 1
Portc.2 = 1
End Sub


Sub Servocenter()
Servo(1) = 95
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
End Sub


Sub Servoright()
Servo(1) = 145
Portc.0 = 1
Portc.1 = 1
Portc.2 = 0
End Sub

linux_80
30.04.2009, 19:09
Hallo,

evtl. musst Du erst die Schalter "einmessen", denn es ist nicht gesagt, dass bei Dir genau die gleichen Werte rauskommen wie im Beispielprogramm.

Du gibst ja die ADC-Werte schon auf UART aus (Print ... Ws), passen die zu den Tasten ?

GoodOldLoki
01.05.2009, 12:41
Naja, wenn man in der Function den adc nicht startet, ist nix mit Werte auslesen :-)

Zweiter Fehler war, dass ich den kompletten portA auf Output gesetzt habe, jetzt läuft es.

Der Vollständigkeit halber hier der richtige Code.
Habe das Ganze ein wenig umgebaut, jetzt finde ich es eleganter gelöst als oben



Declare Function Readbuttons() As Byte

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Adc = Single , Prescaler = Auto 'für Tastenabfrage
Config Pina.7 = Input 'für Tastenabfrage
Porta.7 = 1

Config Porta.0 = Output 'für Servo
Config Servos = 1 , Servo1 = Porta.0 , Reload = 10 'für Servo
Config Portc = Output 'für LEDs

Enable Interrupts

Dim Button As Byte
Dim Servopos As Byte
Dim Led As Byte
Led = 1
Servopos = 95

Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1

'*******************Main function**************************
Do
Servo(1) = Servopos
If Led = 0 Then
Portc.0 = 0
Portc.1 = 1
Portc.2 = 1
Elseif Led = 1 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Elseif Led = 2 Then
Portc.0 = 1
Portc.1 = 1
Portc.2 = 0
End If


Button = Readbuttons()

If Button <> 0 Then
Select Case Button
Case 1
Servopos = 45
Led = 2
Print "Servo rechts"
Case 2
Servopos = 95
Led = 1
Print "Servo mittig"
Case 3
Servopos = 145
Led = 0
Print "Servo links"
End Select
End If
Waitms 100
Loop
End

'**********************Functions****************** *****************

Function Readbuttons() As Byte
Local Ws As Word
Readbuttons = 0
Start Adc
Ws = Getadc(7)
'Print "ws= " ; Ws
If Ws < 1010 Then
Select Case Ws
Case 400 To 455
Readbuttons = 1

Case 335 To 380
Readbuttons = 2

Case 250 To 305
Readbuttons = 3
End Select
End If
End Function