PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SD21 servo programm befehl speicherung problem



michel999
17.01.2011, 17:13
moin erstmal

mein problem auf grund zu geringem wissensstand, trotz vieler std im forum zu diesen fragen.

ich habe rncontrol plus sd21, daran 3 servos. technik funktioniert soweit (anschlüsse, stromversorgung usw.). ich habe folgendes abgeändertes sd21 testprogramm geflasht. ( von 2 auf 3 servos verändert ).

--------------------------------------------------------------------------------------


$programmer = 12 '1=LPT stk200 13=MCS Bootloader 12=USBISP


Const Sd21_slaveid = &HC2

Declare Function Sd21_version() As Byte
Declare Sub Setzeservoposition(byval Servo As Byte , Byval Position As Word)
Declare Sub Setzeservospeed(byval Servo As Byte , Byval Speed As Byte)


$regfile = "m32def.dat"
$framesize = 42
$swstack = 42
$hwstack = 42

$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1



Dim I As Integer


Wait 2 'Warte 3 Sekunden
I2cinit
Print "SD21 Testprogramm "
Print "SD21 Firmware Version:" ; Sd21_version()

Setzeservospeed 1 , 5
Setzeservospeed 2 , 5
Setzeservospeed 3 , 5

Do
For I = 1 To 3
Setzeservoposition 1 , 1000
Wait 2
Setzeservoposition 1 , 2000
Wait 2

Next I

For I = 1 To 3
Setzeservoposition 2 , 1000
Wait 2
Setzeservoposition 2 , 2000
Wait 2

Next I

For I = 1 To 3
Setzeservoposition 3 , 1000
Wait 2
Setzeservoposition 3 , 2000
Wait 2

Next I



For I = 1 To 3
Setzeservoposition 1 , 1000
Setzeservoposition 2 , 1000
Setzeservoposition 3 , 1000
Wait 2
Setzeservoposition 1 , 2000
Setzeservoposition 2 , 2000
Setzeservoposition 3 , 2000
Wait 2

Next I


Loop

End



Function Sd21_version() As Byte
Local Firmware As Byte
Local I2cread As Byte

I2cread = Sd21_slaveid + 1

I2cstart
I2cwbyte Sd21_slaveid
I2cwbyte 64 'Leseregister festlegen
I2cstop

I2cstart
I2cwbyte I2cread
I2crbyte Firmware , Nack
I2cstop

Sd21_version = Firmware
End Function


'Die Position wird gewöhnlich von 1000 bis 2000 angegeben
'Manche Servos haben etwas größeren Drehbereich, mit etwas
'niedrigeren und höheren Werten kann man diesen auch nutzen
Sub Setzeservoposition(byval Servo As Byte , Byval Position As Word)
Local Register As Byte
Local Lowpos As Byte
Local Highpos As Byte


Register = Servo - 1
Register = Register * 3
Register = Register + 1

Lowpos = Low(position)
Highpos = High(position)

I2cstart
I2cwbyte Sd21_slaveid
I2cwbyte Register 'Register
I2cwbyte Lowpos
I2cwbyte Highpos
I2cstop
End Sub


'Setze Geschwindigkeit der Drehbewegung (1 ganz langsam 255=ganz schnell)
Sub Setzeservospeed(byval Servo As Byte , Byval Speed As Byte)
Local Register As Byte


Register = Servo - 1
Register = Register * 3

I2cstart
I2cwbyte Sd21_slaveid
I2cwbyte Register 'Register
I2cwbyte Speed
I2cstop
End Sub

------------------------------------------------------------------------------




ich hatte vorher im programm für die 3 servos jeweils eine 3. programmzeile ( Setzeservoposition 1 , 1500 ) für die position mit 1500 eingebunden, diese aber wieder gelöscht.
nun fahren die servos mit dem jetzigen programm manchmal die angegebenen positionen an ( 1000 - 2000 ), aber teilweise nur bis position 1500 bis 1000,
also nur die hälfte, wie mit alter programmierung.

und das sd21 verarbeitet die wait anweisungen nicht richtig oder lässt sie ganz weg.

fragen:
1. : woher nimmt das sd21 nun den befehl für 1500er positionen, obwohl ich die dateien gelöscht und neu kompiliert habe?

2. : wo wird so etwas ausser in den kompilerten dateien sonst noch gespeichert? (denn die habe ich ja neu erstellt ).und wie werde ich diese anweisung/befehl wieder los.

sd21 scheint einen befehl zu verarbeiten der nicht im aktuellen programm steht.

3. : wie kann ich es einrichten das wenn nötig nur auf das aktuelle programm zugegriffen wird.

4. : und warum werden die wait anweisungen nicht beachtet?

ihr seht ich steh noch ganz am anfang.

danke schon mal im voraus.

michel