PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servos Parallel in Bascom ansteuern



tobman85
29.09.2011, 12:05
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):



$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!

BastelWastel
29.09.2011, 15:44
Ich wuerde den Timer nicht als PWM betreiben sondern damit passende interrupts generieren mit denen du deine Ausgaenge nach Bedarf (sprich Servostellungen) schaltest.