danke SlyD für die hilfe. jetzt hab ich mal alles so abgeändert wie du gesagt hast:
jetzt hab ich zumindest die meldung mit dem I²C error weg bekommen. allerdings springt mein programm auf dem mikrocontroller nach wie vor nach der abgelaufenen wartezeit (bei mir jetzt 1,5 sekunden) wieder in den standbymodus.Code:#include "RP6ControlLib.h" #include "RP6ControlServoLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_I2CMasterLib.h" uint8_t move_state = 0; // Wenn nichts anderes zugewiesen ist, ist move_state =0 void motionControlStateChanged(void) { if (ir_hindernis) { if (!(ir_ende)) {stopStopwatch3(); //stopwatch3 anhalten wenn ir erkannt wird und damit servobewegung anhalten writeString_P("stopStopwatch3\n");} switch(move_state) {case 0: if (getStopwatch3() <1000 || getStopwatch3() >6000) {rotate(50,RIGHT,90,NON_BLOCKING); //um 90 grad rotieren wenn hindernis erkennt wird und stopwatch3 <1000 oder >6000 ist move_state= 1; // move_state den wert 1 zuweisen } break; case 1: if(isMovementComplete()) {ir_ende= true; //ir_ende=true, wenn bewegung abgeschlossen startStopwatch3(); //stopwatch3 wieder starten und servo wieder starten writeString_P("stopwatch3 starten\n"); } break; } } } void servoansteuerung(void) {if (getStopwatch3() <1000) {servo3_position = 0; writeString_P("LEFT Touch\n");} if (getStopwatch3() >1000 && getStopwatch3() <2000) {servo3_position = 20; writeString_P("servo position 40\n");} if (getStopwatch3() >2000 && getStopwatch3() <3000) {servo3_position = 90;} if (getStopwatch3() >3000 && getStopwatch3() <4000) {servo3_position = RIGHT_TOUCH; writeString_P("Servo Right touch\n");} if (getStopwatch3() >4000 && getStopwatch3() <5000) {servo3_position = 90;} if (getStopwatch3() >5000 && getStopwatch3() <6000) {servo3_position = 20;} if (getStopwatch3() >6000 && getStopwatch3() <7000) {servo3_position = 0; writeString_P("LEFT Touch\n");} if (getStopwatch3() >7000) { setStopwatch3(0); writeString_P("stopwatch3 auf 0 zurück\n");} } void watchDogRequest(void) { static uint8_t heartbeat2 = false; if(heartbeat2) { clearPosLCD(0, 14, 1); heartbeat2 = false; } else { setCursorPosLCD(0, 14); writeStringLCD_P("#"); heartbeat2 = true; } } void I2C_requestedDataReady(uint8_t dataRequestID) { checkRP6Status(dataRequestID); } void I2C_transmissionError(uint8_t errorState) { writeString_P("\nI2C ERROR - TWI STATE: 0x"); writeInteger(errorState, HEX); writeChar('\n'); } int main(void) { initRP6Control(); initSERVO(SERVO3); startStopwatch3(); I2CTWI_initMaster(100); WDT_setRequestHandler(watchDogRequest); I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); mSleep(1500); I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED); I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, false); I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, false); while(true) { servoansteuerung(); task_SERVO(); infrarotkollission(); task_checkINT0(); task_I2CTWI(); } return 0; }
es muss also nach wie irgendetwas in meinen I²C funktionen falsch sein.
wer kann mir weiterhelfen?
mfg andi







Zitieren
Lesezeichen