PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Über i2c etwas senden



MechMac
06.09.2010, 19:10
Hallo,

ich habe mir einen Servo-Controller zugelegt. Modell SD21.
Das möchte ich nun ansteuern.
Nachdem ich die Library von Peter Fleury eingebunden habe, und mir das Beispielprogramm angesehen habe, bin ich zu der Erkenntnis gekommen das man zunächst das INIT durchführen muss, dann kommt die Addrese oder das Register in dem man schreiben möchte und als nächstes dann der Wert. Zum Schluß dann ein Stop.

In der Doku von dem Controller ist dann folgendes aufgeführt (Auszug):
Register Servo Function
0 1 Speed
1 1 Low byte
2 1 High byte


Soweit sogut, die Addresse, damit sich das Ding überhaupt angesprochen fühlt ist 0xC2 ($C2).


Nun habe ich folgendes probiert:





#define Dev24C02 0xC2 // device address of EEPROM 24C02, see datasheet

int main( void )
{

uint16_t two_bytes = 0x3E8;
uint8_t high_byte = two_bytes & 0xff00;
uint8_t low_byte = two_bytes & 0x00ff;


i2c_init(); // initialize I2C library
i2c_start_wait(Dev24C02+I2C_WRITE);
i2c_write(0x00); //Adresse (Speed)
i2c_write(0x00); //Wert
i2c_stop();

i2c_start_wait(Dev24C02+I2C_WRITE);
i2c_write(0x01); //Adresse (Pos lowByte)
i2c_write(low_byte); //Wert
i2c_stop();

i2c_start_wait(Dev24C02+I2C_WRITE);
i2c_write(0x02); //Adresse (Pos highByte)
i2c_write(high_byte); //Wert
i2c_stop();



while(1)
{
}
}



Es passiert rein gar nichts.
Nun frage ich mich was da so alles falsch dran ist.


In dem Beispielprogramm der Doku zu dem SD21 war folgendes zu lesen:
I2COUT SDA, SD21, Servo1, [Speed, Servo.LOWBYTE, Servo.HIGHBYTE]

Die senden das also in einem Rutsch rüber. Das liegt aber vielleicht daran, das das BASIC ist und die Funktioinen komplett anders laufen.

Wer kann mir helfen?

Gruß, Andreas





/////////////////EDIT/////////////
Habe den ersten Fehler gefunden:
Die Pinne am Controller waren vertauscht. Irgendwie taugen diese Wannenstecker nix.

Aktueller Stand:
Der Servocontroller schickt den Servo ins Nirvana. Es läuft auf den Endanschlag und würde gern noch weiter. Dabei wird es recht warm.

Also wird wohl etwas beim senden schief laufen.
Diese HighByte / LowByte Geschichte oben ist auch nur zusammenkopiert. Ist da vielleicht ein Fehler drin?

uwegw
06.09.2010, 19:55
Ein Fehler liegt hier:
uint8_t high_byte = two_bytes & 0xff00;
Damit ist das high_byte immer Null, da bei der Uwandlung auf 8bit die oberen Bits abgeschnitten werden. (gibt es da eigentlich eine Compilerwarnung?)

Besser so:
uint8_t high_byte = (uint8_t)((two_bytes & 0xff00)>>8);
Die oberen Bits maskieren, dann ins untere Byte schiben, und dann zur Sicherhiet noch auf den richtigen Typ casten.

Und letztlich kann man dabei auf die Maskierung verzichten, da das untere Byte sowieso beim Schieben wegfällt.
uint8_t high_byte = (uint8_t)((two_bytes>>8);

MechMac
06.09.2010, 20:19
Vielen Dank, nun geht es. Das war der Fehler.

Gruß, Andreas