- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: Tasten reagieren nicht (gelöst)

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.08.2007
    Ort
    Dortmund
    Alter
    51
    Beiträge
    51

    Tasten reagieren nicht (gelöst)

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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 ?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    22.08.2007
    Ort
    Dortmund
    Alter
    51
    Beiträge
    51
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress