PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servos über rs232 ansteuern bei rn-control 1.4 ??



Charly_cs
08.10.2005, 15:28
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:

$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

Hellmut
08.10.2005, 16:34
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!

Charly_cs
08.10.2005, 17:02
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ß

08.10.2005, 17:24
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

Charly_cs
08.10.2005, 23:07
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ß
$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

08.10.2005, 23:24
Hallo

Versuchs mal mit VAl

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


MFG
Dieter

Charly_cs
08.10.2005, 23:33
Hi!

Vieeelen vieeelen Dank!! \:D/
Jetzt funzt alles!
Hier der Code für Interessenten:

$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