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