PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RNBFRA I2C im TWI Betrieb, problem mit Servotreiber Rnkc10



bart
03.10.2006, 20:03
Hallo,

benutze die Bibliothek von Fleury (also die zwei Dateien twimaster.c, i2cmaster.h) und den I2c-Servotreiber Rnkc10.

Betreibe den I2C-Bus am RNBFRA im Hardware (also TWI) Modus. Nun habe ich ein Problem, da die Servos nur kurz zucken und sich nicht steuern lassen.

Angeschlossen ist alles richtig da das Beispiel funktioniert, nur leider ist es als Software I2C verfasst.

Ich denke es liegt an den Timings des Buses. Wie kann ich diese in den Header bzw. die twimaster.c Datei einbinden?

PicNick
03.10.2006, 20:14
Versuch mal das Hex File für den CoProzessor.
Hört auf die adresse &H68
Und kriegt die daten:
BYTE &H01 Command
BYTE &H01 - &H0A Servo# 1 - 10
WORD &Hnnnn servo position 600 - 2000
(µS ServoImpuls, ~1500 = Mitte)


Wenn was nicht funzt, sagen.

PicNick
04.10.2006, 08:34
noch'n Versuch, war irgendwas schräg ??

bart
04.10.2006, 15:40
Hi Robert,

erst mal danke für die schnelle und erfolgreiche Hilfe. Also habe den IC mit deinem Treiber mal geflasht und die nötigen Werte übergeben...



void MoveServo(void) {
i2c_start(0x68 + I2C_WRITE);
i2c_write(0x01); // Command
i2c_write(0x01); // Servo Nr1
i2c_write(0x02);
i2c_write(0x56);
i2c_stop();
}


Funktioniert wunderbar, nur muss ich meinen Funktionsnamen also MoveServo(); in einer do {}while(1); schleife starten sonst bewegt der Servo sich nicht. Woran liegt das?

PicNick
04.10.2006, 16:27
Richtig, es gibt Lücken, wo der Servokontroller grad mit den Servos beschäftigt ist.
Du brauchst aber keine while(1) schleife, sondern du mußt nur den Error-code prüfen. Nur wenn ein Fehler beim I2C_Start war (kein ACK), dann die Sendung wiederholen.
Ich weiß jetzt nicht, wie und wo der Fleury seinen Status hergibt.
Hat I2C_START () irgendeinen return-code ?

EDIT : hab' ihn schon:


unsigned char i2c_start ( unsigned char addr )
Issues a start condition and sends address and transfer direction.
Parameters:
addr address and transfer direction of I2C device
Return values:
0 device accessible
1 failed to access device


d.h mach folgendes


void MoveServo(void) {
if (i2c_start(0x68 + I2C_WRITE))
do { } while (i2c_rep_start(0x68 + I2C_WRITE));
i2c_write(0x01); // Command
i2c_write(0x01); // Servo Nr1
i2c_write(0x02);
i2c_write(0x56);
i2c_stop();
}

Eben nur, bis ein ACK kommt. das ist in den meisten Fällen höchstens 1-2 mal

bart
04.10.2006, 17:27
Traumhaft funktioniert perfekt, ich danke dir sehr herzlich für deine Hilfe. :-)

PicNick
04.10.2006, 18:39
Bittärrscheen. Und empfehlen Sie uns weiter :-)