-         

Ergebnis 1 bis 2 von 2

Thema: Servos Parallel in Bascom ansteuern

  1. #1

    Servos Parallel in Bascom ansteuern

    Anzeige

    Hallo zusammen,

    ich bin ganz neu in der Bascom Programmierung und finde zu meinem aktuellen Problem keine passenden Antworten im Netz.
    Ich möchte über ein Telegramprotokoll mehrere Servos von meinem Java Tool aus Steuern. Nur frage ich mich, wie ich mehrere Servos gleichzeitig ansteuern kann ohne darauf warten zu müssen, dass zunächst ein Servo seinen Stellvorgang beendet hat.

    Außerdem kann ich die Servos zwar schon mit dem Servo Befehl von Bascom ansteuern, aber leider nicht mittels Timer. Hier mein erfolgloser Timerversuch auf dem Atmega16 (Fuse = int. Osc 8Mhz):

    Code:
    $crystal = 8000000
    $swstack = 50
    $hwstack = 50
    $framesize = 50
    
    
    Config Portb.1 = Output
    Config Portb.2 = Output
    
    
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
    'Enable Timer1
    'Start Timer1
    
    
    
    Servo1 Alias Pwm1a
    Servo2 Alias Pwm1b
    
    Dim Position As Word
    
    Const Links = 895
    Const Rechts = 960
    Wait 2
    
    Do
    Servo1 = Rechts
    Servo2 = Rechts
    Wait 2
    
    Servo1 = Links
    Servo2 = Links
    
    For Position = Links To Rechts Step 5
    Servo2 = Position
    Waitms 100
    Next Position
    Loop
    End
    
    
    
    
    Und hier noch der erwähnte Anfang vom schon funktionierenden Code (der aber immer nur ein Servo und das der Servo Befehl):
    
    $swstack = 50
    $hwstack = 50
    $framesize = 50
    Enable Interrupts
    
    Config Porta = Output
    Config Portb = Output
    Config Servos = 2 , Servo1 = Portb.1 , Servo2 = Portb.2 , Reload = 10
    
    
    '$crystal = 8000000
    '$baud = 9600
    
    'WELCOME:
    Porta.0 = 1
    Porta.1 = 0
    Porta.2 = 1
    Porta.3 = 0
    Porta.4 = 1
    Porta.5 = 0
    Porta.6 = 1
    Porta.7 = 0
    Servo(1) = 50
    Servo(2) = 50
    Servo(1) = 150
    Servo(2) = 150
    Dim X As Byte
    Dim M As Byte
    
    
    Declare Sub Ledaction(byref Valuex As Integer)
    Declare Sub Commandrouter(byref Command As Integer , Valuex As Integer)
    Declare Sub Fastservoaction(byref Valuex As Integer)
    M = 0
    
    
    While M < 99
    X = 0
    While X < 10
    Waitms 200
    Toggle Porta
    Incr X
    Wend
    Porta = 0
    
    ''''''''''''''''''
    'Lies Input nach IN und trenne nach ::
    ''''''''''''''''''
    Dim In As String * 80
    Input "Input" , In
    Print In
    Dim Message(2) As String * 20
    'Message(1) = ""
    'Message(2) = ""
    Dim Bcount As Byte
    Bcount = Split(in , Message(1) , "::")
    
    ''''''''''''''''''
    'Jetzt berechne CRC 16 aus Message(1)
    ''''''''''''''''''
    Dim Crccalc As String * 20
    Crccalc = ""
    Crccalc = Hex(crc16uni(message(1) , 20 , 0 , &H8005 , 1 , 1))
    'Print "------"
    'Print Message(1)
    'Print Message(2)
    'Print Crccalc
    'Print Message(2)
    'Print "------"
    '''''''''''''''''''
    'Prüfe ob berechneter CRC Wert mit dem der Message(2) übereinstimmt
    'Wenn ja sende OK, teile Telegramm und sende an Commandrouter.
    'Wenn nicht sende NOK und Beende Durchlauf.
    '''''''''''''''''''
    Print "-------"
    Print Crccalc
    Print Message(2)
    Print "-------"
    If Crccalc = Message(2) Then
    Dim Ccount As Byte
    Dim Telegram(5) As String * 20
    Ccount = Split(message(1) , Telegram(1) , "#")
    Print "OK"
    Dim Command As Integer
    Command = Val(telegram(2))
    'Print "1AR2" ; Command
    Dim Valuex As Integer
    Valuex = Val(telegram(3))
    'Print "1AR3" ; Port
    Call Commandrouter(command , Valuex)
    Else
    Print "NOK"
    End If
    Wend
    
    Sub Commandrouter(byrefl Command As Integer , Valuex As Integer)
    If Command = 10 Then
    Call Ledaction(valuex)
    Elseif Command = 11 Then
    Call Fastservoaction(valuex)
    End If
    End Sub
    
    Sub Ledaction(byref Valuex As Integer)
    Print "LED" ; Valuex ; "---"
    If Valuex = 0 Then
    Porta.0 = 1
    End If
    
    If Valuex = 1 Then
    Porta.1 = 1
    End If
    If Valuex = 2 Then
    Porta.2 = 1
    End If
    If Valuex = 3 Then
    Porta.3 = 1
    End If
    If Valuex = 4 Then
    Porta.4 = 1
    End If
    End Sub
    
    Sub Fastservoaction(byref Valuex As Integer)
    Print "Moving Servo to" ; Valuex
    Servo(1) = Valuex
    End Sub
    
    End
    Code-Tags verwenden ! (PicNick)


    Über antworten und Anregnung würde ich mich sehr freuen!
    Geändert von PicNick (29.09.2011 um 16:57 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.02.2006
    Beiträge
    982
    Ich wuerde den Timer nicht als PWM betreiben sondern damit passende interrupts generieren mit denen du deine Ausgaenge nach Bedarf (sprich Servostellungen) schaltest.
    Nam et ipsa scientia potestas est..

Ähnliche Themen

  1. Seriell/Parallel Port pins ansteuern
    Von Jada im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 20
    Letzter Beitrag: 01.01.2011, 10:10
  2. 2 Servos parallel schalten?
    Von squelver im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 16.02.2010, 13:44
  3. 8 servos mit bascom ansteuern
    Von Roboman93 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 10.10.2008, 15:01
  4. [gelöst] 2 Servos mit Bascom ansteuern - Servo 2 ruckelt!
    Von Cairol im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 12.11.2007, 22:08
  5. 12 Servos parallel ansteuern
    Von Latschi im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 26.08.2005, 17:20

Berechtigungen

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