... Kommunikation ... läuft über
I2C ... nur etwa 0-30sec, danach funktioniert der I2C-Part nicht mehr. Doch nun ein wenig genauer:
...
Code:
...
i2c_start(MOTORA+I2C_WRITE); //MOTORA: adress of motor A
i2c_write(motora);
i2c_stop();
i2c_start(MOTORB+I2C_WRITE); //MOTORB: adress of motor B
i2c_write(motorb);
i2c_stop();
}
Hallo Adrian,
willkommen im Forum.
Leider hast Du den I²C-Takt in Deiner Lösung nicht genannt. Aber das ist wohl nicht so wichtig. Ich kenne ähnliche Fehler die ich so lange hatte, bis ich mich mal mit dem I²C-Timing beschäftigt hatte. Der Code, den ich oben blau markiert hatte, scheint mir verdächtig.
Nach dem Stop braucht das System ne Weile bis per I²C wieder geschrieben -- oder gelesen -- werden kann. Wenn man das sofort angeht KANN es funktionieren, muss aber nicht. Und wenns nicht sofort klappt ,dann kann die Kommunikation hängen bleiben. Daher hatte ich bei i2c_start nach einem i2c_stop -- neee, genaugenommen jetzt immer -- eine Abfrage eingefügt, ob der Bus überhaupt bereit ist. Beispiel hier (klick).
Code:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Lesen (read back) vom Slave ... mit der Routine aus fleury´s lib
i2c_start_wait(SLAVE_MoCo+I2C_WRITE); // set device address and write mode
i2c_write( laddr ); // write address = laddr, das angepeilte Byte
i2c_stop(); //
while ((i2c_rep_start(SLAVE_MoCo+I2C_READ))) {}// Slave bereit zum Lesen?
//i2c_rep_start(SLAVE_MoCo+I2C_READ); // set device address and read mode
ipwm12 = i2c_readAck(); // Bytes lesen... ab laddr = 0x33/51
soll12 = i2c_readAck(); //
ipwm34 = i2c_readAck(); //
soll34 = i2c_readNak(); // letztes Byte lesen, NAK
i2c_stop(); //
Das Zauberwort heißt bei mir "while" - und dann wartet der Befehl ab, bis der Bus frei ist. Und schon liefs (bei mir). Nun könnte ich Dir das viele Zeugs in den Herstellerschriften zum TWI/I²C bzw. dessen Timing schreiben - kannst Du in den entsprechenden Schriften nachlesen. Vorschlag: probiers mit "while" - vielleicht klappts und dann kannst Du Dir vielleicht das Lesen sparen. Übrigens könnte man bei erfolglosem Warten noch ne Fehlermeldung einbauen. Wenn man möchte.
Viel Erfolg.
Lesezeichen