PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dynamixel Servo RX-10 ansteuern



emulein
22.01.2010, 11:56
Hallo Zusammen,

ich bin gerade dabei einen RX-10 Servo mit Bascom anzusteuern, leider
habe ich da so meine Probleme. Hier im Forum war das ja schon mal ein Thema und ich habe auch ein paar Sachen versucht. Am Anfang ist es halt schwer Fehler einzugrenzen, könnte ja Hard.- oder Software sein. Ich poste einfach mal den Code den ich versucht habe, vielleicht sieht ja einer einen Fehler. Danke schon mal im voraus!!
Ich hoffe das es mit der 485 Schnittstelle so geht, habe da die ganze Zeit
einen anderen Motor dran gehabt, dort hat es geklappt, Senden und Empfangen.

Hier mal das Datenblatt des Servo´s

http://www.nodna.com/download/ROBOTIS/Dynamixel/RX-10(english).pdf

und hier der Code




$regfile = "m16def.dat" 'ATMEGA16
$crystal = 16000000 'Quarz: 16MHz

$baud = 1000000

Dim S As Byte

Wait 2

Ddrd = &B11100000 'Pin PD7,6,5 als Ausgang konfigurieren

Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0



Enable Interrupts 'Interrupts global


'FF FF 01 04 03 19 01 DD ' LED ein bei Adresse 1

'FF FF 01 04 03 19 00 DE ' LED aus bei Adresse 1

Do

Wait 1

Ucsra.txc = 1

Portd.7 = 0 ' 485 Modul auf schreiben setzen

Waitms 1
S = &HFF
Print Chr(s);
S = &HFF
Print Chr(s);
S = &H01
Print Chr(s);
S = &H04
Print Chr(s);
S = &H03
Print Chr(s);
S = &H19
Print Chr(s);
S = &H01
Print Chr(s);
S = &HDD
Print Chr(s);

Portd.6 = 0 ' Test-Led einschalten

Sprung:
If Ucsra.txc = 0 Then Goto Sprung ' warten bis Serieller Puffer leer ist
Portd.7 = 1 ' 485 Modul auf lesen setzen

Wait 1

Ucsra.txc = 1

Portd.7 = 0 ' 485 Modul auf schreiben setzen

Waitms 1
S = &HFF
Print Chr(s);
S = &HFF
Print Chr(s);
S = &H01
Print Chr(s);
S = &H04
Print Chr(s);
S = &H03
Print Chr(s);
S = &H19
Print Chr(s);
S = &H00
Print Chr(s);
S = &HDE
Print Chr(s);

Portd.6 = 1 ' Test-Led ausschalten

Sprung1:
If Ucsra.txc = 0 Then Goto Sprung1 ' warten bis Serieller Puffer leer ist
Portd.7 = 1 ' 485 Modul auf lesen setzen


Loop

End



Danke Gruß Frank

emulein
23.01.2010, 19:17
Hallo Leute,

sieht ja schlecht aus mit dem Servo. Ich bin da noch nicht weiter gekommen, wenn euch nix einfällt werde ich das Projekt wieder einstellen.

Gruß Frank

Hubert.G
23.01.2010, 21:35
Wenn man in BASCOM auch auf Groß/Kleinschreibung achten muss, dann würde ich mal auf die Variable S achten.

emulein
23.01.2010, 22:43
Hallo Hubert,

das wäre mir neu, aber wäre doch auch alles groß, oder was meinst du?

Gruß Frank

021aet04
23.01.2010, 23:05
Du hast geschrieben. Dim S As Byte => großes S
Weiter unten hast du Print Chr (s) => kleines S geschrieben.

Das dürfte aber nicht der Fehler sein, da es in Basic egal ist, ob es groß oder klein geschrieben ist. Bei C wird zwischen Groß- und Kleinschreibung unterschieden.

Netzman
24.01.2010, 09:38
Upper/Lower-Case macht Bascom automatisch.
Im Code kann ich keine Fehler entdecken, aber Printbin wäre schon schöner.
Mit dem anderen Motor hat das funktioniert? Dann wirds doch wohl am Motor/der Stromversorgung liegen?

mfg

emulein
24.01.2010, 15:25
Hi,

so ich habe meine Möglichkeiten ausgereizt, ich bekomme das Ding nicht zum laufen. Habe jetzt auch mal versucht das mit den Datenpaketen zu verstehen, bin mir nicht ganz sicher aber ich komme nie auf die selbe Checksumme wie die. Wenn ich das Beispiel 16 auf Seite 41
der Anleitung versuche nachzurechnen komme ich immer auf eine Differenz von eins. Also die haben &DD und ich komme immer auf DC, auch bei anderen Beispielen, immer eins unterschied. Na ja, ich versuche mal weiter, aber mir gehen echt die Ideen aus!

Gruß Frank

Michael
24.01.2010, 16:54
Hallo emulein,

das LSB Byte der Summe zur Checksum Addiert ergibt Null.
Du summierst einfach alle Bytes in eine Bytevariable und rechnest zum Schluß 256-Bytevariable( NOT + 1) und hast deine Checksum.

Gruß, Michael

emulein
24.01.2010, 17:27
Hallo Michael,

das sehe ich so in der Anleitung nicht wie du das
geschrieben hast. Muss aber auch gestehen das ich
nicht der beste Programmierer bin, eher unter schnitt.
Werde mir das mal versuchen zu verdeutlichen.
Danke für deine Hilfe!!

Gruß Frank

emulein
14.02.2010, 00:40
Hallo Zusammen,

so der Servo läuft jetzt, hier der Code.
Bestimmt nicht der stein der weisen, aber der Servo dreht damit,
für den Anfang geht´s aber. Die Baudrate sollte auch noch mit 57600
laufen.


$regfile = "m644pdef.dat" 'ATMEGA16
$crystal = 16000000 'Quarz: 16MHz

$baud = 57142

$baud1 = 9600


Dim S As Byte
Dim I As Long
Dim Zeichen_com1 As Byte
Dim Empf_com1 As Byte
Dim Empf_com2 As Byte
Dim Empf_string As String * 10
Dim Ausgabe_com1 As String * 10
Dim Ausgabe_com2 As String * 10

Dim Zeichen As Byte

Dim Durchlauf As Byte

Dim Status As Byte

Ddrd = &B11110000 'Pin PD7,6,5,4 als Ausgang konfigurieren





Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0



Open "COM2:" For Binary As #1



Enable Interrupts 'Interrupts global

Enable Urxc
Enable Urxc1


On Urxc Empfangen_com1 ' isr rxd ( com0 )
On Urxc1 Empfangen_com2 ' isr rxd ( com1 )


Ausgabe_com1 = ""



Do

Incr I

If I = 250000 Then

Ucsr0a.txc0 = 1

Portd.7 = 1 ' 485 Modul auf schreiben setzen
Wait 2


If Durchlauf = 1 Then
S = &HFF
Print Chr(s);
S = &HFF
Print Chr(s);
S = &H01
Print Chr(s);
S = &H07
Print Chr(s);
S = &H03
Print Chr(s);
S = &H1E
Print Chr(s);
S = &H00
Print Chr(s);
S = &H02
Print Chr(s);
S = &H00
Print Chr(s);
S = &H01
Print Chr(s);
S = &HD3
Print Chr(s);
Durchlauf = 0
Else
S = &HFF
Print Chr(s);
S = &HFF
Print Chr(s);
S = &H01
Print Chr(s);
S = &H07
Print Chr(s);
S = &H03
Print Chr(s);
S = &H1E
Print Chr(s);
S = &H00
Print Chr(s);
S = &H00
Print Chr(s);
S = &H00
Print Chr(s);
S = &H01
Print Chr(s);
S = &HD5
Print Chr(s);
Durchlauf = 1
End If



Sendbuffer:
If Ucsr0a.txc0 = 0 Then Goto Sendbuffer ' warten bis Ausgabepuffer leer ist

Portd.7 = 0

Waitms 1
Empf_com1 = 1

I = 0






If Empf_com1 = 1 Then
Toggle Portd.5 'Kontroll LED
Print #1 , Ausgabe_com1;
Ausgabe_com1 = ""
Empf_com1 = 0
End If


If Empf_com2 = 1 Then
Print #1 , Ausgabe_com2;
Ausgabe_com2 = ""
Empf_com2 = 0
End If

End If


Loop

End

Close #1



Empfangen_com1:

Toggle Portd.4 ' Kontroll LED
Ausgabe_com1 = Ausgabe_com1 + Chr(udr)
Empf_com1 = 1

Return


Empfangen_com2:

Ausgabe_com2 = Ausgabe_com2 + Chr(udr1)
Empf_com2 = 1

Return



Gruß Frank