- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 7 von 7

Thema: Servos über rs232 ansteuern bei rn-control 1.4 ??

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    13.04.2005
    Beiträge
    56

    Servos über rs232 ansteuern bei rn-control 1.4 ??

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!

    Habe folgendes Problem. Möchte mit dem Terminalprogramm von Bascom 2 Servos ansteuern. Z.b. sende ich für den rechten Servo "r122" bzw. für den linken "l233" und empfange ihn im Atmel als String. Der Buchstabe steht für rechts oder links und die Zahl für die jeweilige Servoposition. Der String wird auseinander genommen und in einem if-then-Algorithmus die Servoposition zum jeweiligen Servo übermittelt. Ein Programm ist auch schon geschrieben, nur funktioniert es nicht. Die Servos zuckeln ständig sobald ich nur eine Taste drücke. Kann mir bitte jemand helfen, den Fehler im Code zu finden?
    Hier mein Code:
    Code:
    $regfile "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    
    Dim A As Byte
    Dim B As String * 4
    Dim C As String * 1
    Dim D As String * 3
    
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    Config Servos = 2 , Servo1 = Portc.0 , Servo2 = Portc.2 , Reload = 8
    
    A = 128
    
    Servo(1) = A
    Servo(2) = A
    
    ' ---------------------------------------------
    Do
      If Len(b) = 4 Then
        C = Left(b , 1)
        D = Right(b , 3)
        If C = "L" Then Servo(1) = D                            ' Servo1 = links
        If C = "R" Then Servo(2) = D                            ' Servo2 = rechts
    
        Print B
        B = ""
    
      End If
    
    Loop
    End
    
    ' ---------------------------------------------
    Onrxd:
      B = B + Chr(udr)
    Return
    Gruß
    Charly

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.07.2004
    Ort
    Mammendorf
    Alter
    67
    Beiträge
    1.062
    Hallo Charly

    Du machst es etwas kompliziert und ...
    warum konfigurierst du Pinc.1 als Output und verwendest dann für Servo2 Portc.2?
    Wo sorgst du dafür das die Pulselängen erzeugt werden und alle 20ms wiederholt werden?

    Ich würde an deiner Stelle einen Timer verwenden der alle 20ms ein Interrupt auslöst. Die entsprechende Interrupt-Service-Routine würde dann an Portsc.0 und Portc.1 einen Low-Wert anlegen. dann würde ich die beiden Ports nacheinander bedienen und die Impulslänge dadurch erreichen das ich mit einem Counter die Länge gemäß ehaltenen Parameter erzeuge. D.h. Portc.x auf High setzen, Counter starten so dass Null durchlauf der gewünschten Länge entspricht und den Port.x Wert wieder auf Low setzen. Dieses jeweils und nacheinader für alle angeschlossenen Servos. NachAbschluß RTI und auf den nächsten 20ms Zyklus warten!
    MfG

    Hellmut

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.04.2005
    Beiträge
    56
    Hi!

    Danke für die Fehlerfindung beim Portc.2. Hab mich verschrieben, dass sollte natürlich portc.1 sein. (Fehler tritt immer noch auf) Hab auch schon ein IR-Servo-Radar gebaut mit fast dem selben code, nur ohne dem RS232-Teil. Da reicht es z.B. nur zu schreiben : "Servo(1) = 133 " und der Servo fährt auch dort hin. Nur hier gehts nicht. Kann es daran liegen, dass die Variable "D" ein string ist und kein Byte? Wenn ja, wie kann ich den String in einen Byte-Ausdruck umwandeln?

    Gruß

  4. #4
    Gast
    Hallo

    dass die Variable "D" ein string ist und kein Byte?
    Wenn du dir damt unsicher bist, schreibe doch zum testen mal feste Werte rein.

    If C = "L" Then Servo(1) = 10 ' Servo1 = links
    If C = "R" Then Servo(1) = 200

    MFG
    Dieter

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    13.04.2005
    Beiträge
    56
    Hi!

    Hab jetzt den Code einwenig verändert und es funktioniert nur, wenn ich z.B. schreibe "Servo(1)=150" . Würde aber gerne den D-String hernehmen nur das funzt nicht ("Servo(1) = D"). Kann mir jemand sagen, wie ich einen Stringausdruck in einen BYTE umwandle?
    Hier noch der neue Code:

    Gruß
    Code:
    $regfile "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    
    Dim A As Byte
    Dim B As String * 4
    Dim C As String * 1
    Dim D As String * 3
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    Config Servos = 2 , Servo1 = Portc.0 , Servo2 = Portc.1 , Reload = 8
    
    A = 128
    
    Servo(1) = A
    Servo(2) = A
    
    ' ---------------------------------------------
    Do
      If Len(b) = 4 Then
        C = Left(b , 1)
        D = Right(b , 3)
    
         Select Case C
          Case "l"
           Servo(1) = 150
          Case "r"
           Servo(1) = 80
          Case Else
          Print "Unbekannter Befehl!"
    
         End Select
    
        B = ""
    
      End If
    
    Loop
    End
    
    ' ---------------------------------------------
    Onrxd:
      B = B + Chr(udr)
    Return

  6. #6
    Gast
    Hallo

    Versuchs mal mit VAl

    s = "123"
    a = Val(s) 'convert string
    Print A ' 123


    MFG
    Dieter

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    13.04.2005
    Beiträge
    56
    Hi!

    Vieeelen vieeelen Dank!! \/
    Jetzt funzt alles!
    Hier der Code für Interessenten:
    Code:
    $regfile "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    
    Dim A As Byte
    Dim B As String * 4
    Dim C As String * 1
    Dim D As String * 3
    Dim E As Byte
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    Config Servos = 2 , Servo1 = Portc.0 , Servo2 = Portc.1 , Reload = 8
    
    A = 128
    
    Servo(1) = A
    Servo(2) = A
    
    ' ---------------------------------------------
    Do
      If Len(b) = 4 Then
        C = Left(b , 1)
        D = Right(b , 3)
        E = Val(d)
    
         Select Case C
          Case "l"
           Servo(1) = E
           Print E
    
          Case "r"
           Servo(2) = E
          Case Else
          Print "Unbekannter Befehl!"
    
         End Select
    
        B = ""
    
      End If
    
    Loop
    End
    
    ' ---------------------------------------------
    Onrxd:
      B = B + Chr(udr)
    Return
    Gruß
    Charly

Berechtigungen

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

Solar Speicher und Akkus Tests