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 ?
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
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
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 ?
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
Code: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
Lesezeichen