PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom - Code vereinfachen



Dennis2006
21.01.2007, 15:21
Hi!

Ich habe an meinem RN-Control Board das SD21 Servoboard über den I2C Bus hängen.

Nun muss ich ja wenn ich mit BASCOM programmiere immer die üblichen Befehle für die Vebrindung per I2C eingeben:

'=========================== Arm links ======================


Posit = 2320 ' position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_adr ' serv CTRL I2C Addr
I2cwbyte 0 ' servo nr
I2cwbyte 10 ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop
Print "Servo 1 auf Position 2000"

Posit = 2420 ' position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_adr ' serv CTRL I2C Addr
I2cwbyte 3 ' servo nr
I2cwbyte 10 ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop
Print "Servo 2 auf Position 2000"

'Wait 1


Posit = 1540 ' position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_adr ' serv CTRL I2C Addr
I2cwbyte 6 ' servo nr
I2cwbyte 10 ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop
Print "Servo 3 auf Position 2000"

'Wait 1


Wenn ich nun meine 17 Servos damit ansteiere gibt das seitenweise Code!

Gibt es eine Möglichkeit den Code zu vereinfachen?

Danke!

Gruß

Dennis

bertl100
21.01.2007, 15:47
deklariere eine Funktion mit allen Übergabeparametern und ruf diese dann jeweils auf.

declare function.........(byval...byval...)as

Dennis2006
21.01.2007, 19:15
Hi!

Vielen Dnak für Deine Antwort!

Ich weiß zwar wodrauf es hinauslaufen soll aber ich verstehe nicht genau wie Du das meinst.

Hast Du da ein konkretes Beispiel für mich?

Danke!

Gruß

Dennis

Gento
21.01.2007, 21:19
Declare Sub Servo(Posit as Word, Servo_ADR as Byte) 'Im Kopf der Soft


Call Servo(2320,12) 'so rufst Du auf

Sub Servo(Posit as Word, Servo_ADR as Byte) 'das wird aufgerufen
'Posit = 2320 position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_ADR ' serv CTRL I2C Addr
I2cwbyte 0 ' servo nr
I2cwbyte 10 ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop
Print "Servo "+Servo_ADR+" auf Position "+Posit
End Sub


so in etwa ,aber probiere das mal aus,

Gento

Dennis2006
27.01.2007, 08:46
Hi!

Wenn ich nun noch die Servogeschwindigkeit mit in den Call Aufruf einbinden will, muss der Code dann so aussehen?:


$regfile = "m32def.dat" 'Die Anweisung bestimmt Ccntrollertyp, hier AVR Mega 32

$crystal = 16000000 'Die Frequenz des verwendeten Quarzes

$baud = 9600 'Die Baudrate für RS232 Ausgabe.
'Sie muss auch bei PC Terminalprogramm identisch sein

'$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI

'Config Twi = 100000 ' wanted clock frequency



Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1 ' wanted clock frequency
Config Twi = 100000

Const Servo_adr = &HC2 'I2C Adress Servo Controller

Declare Sub Servo(posit As Word , Servo_adr As Byte , Servo_spd As Byte) 'Im Kopf der Soft

Call Servo(1500 , 12 , 10) 'so rufst Du auf

Sub Servo(posit As Word , Servo_nr As Byte , Servo_spd As Byte) 'das wird aufgerufen
'Posit = 2320 position (1000 - 2000)
Lsb = Low(posit)
Msb = High(posit)
I2cstart
I2cwbyte Servo_adr ' serv CTRL I2C Addr
I2cwbyte Servo_nr ' servo nr
I2cwbyte Servo_spd ' speed
I2cwbyte Lsb ' lsb of position
I2cwbyte Msb ' Msb of position
I2cstop
Print "Servo " + Servo_nr + " auf Position " + Posit + " mit einer Geschwindigkeit von " + Servo_spd + "
End Sub

Ich glaube Du hattest einen Fehler in Deinem Code. Die Servo_adr ist die I2C Adresse von dem Controller.

Ist mein Code so richtig?

Gruß

Dennis