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 ).
--------------------------------------------------------------------------------------
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.Code:$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 ------------------------------------------------------------------------------
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
Lesezeichen