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
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
Danke Gruß FrankCode:$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
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
Wenn man in Bascom auch auf Groß/Kleinschreibung achten muss, dann würde ich mal auf die Variable S achten.
Hallo Hubert,
das wäre mir neu, aber wäre doch auch alles groß, oder was meinst du?
Gruß Frank
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.
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
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
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
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
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.
Gruß FrankCode:$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
Lesezeichen