... 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.