so, jetzt hab ich threads zu diesem thema und die beispielprogramme untersucht, so dass ich mein programm jetzt nach dem vorbild de RP6Control_09_Move beispielprogramm abgeändert habe:
das ergebnis ist aber leider immer noch das selbe wie vorher. der das programm läuft nur einen sekundenbruchteil und der mikrocontroller springt dann in den standby modus zurück.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(); WDT_setRequestHandler(watchDogRequest); I2CTWI_initMaster(100); I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED); I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true); I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true); initSERVO(SERVO3); startStopwatch3(); while(true) { servoansteuerung(); task_SERVO(); infrarotkollission(); task_checkINT0(); task_I2CTWI(); } return 0; }
im terminal erscheint diese meldung:
ich kann mir vorstellen, dass ich vielleicht dem ein oder anderen in diesem forum mit meinem problem auf die nerven gehe, aber da ich die ganzen I²C funktionen noch überhaupt nicht kapiere und mittlerweile mit allen möglichen programmschnipsel aus beispielprogrammen erfolglos hantiert habe, bin ich halt auf eure hilfe angewiesen.Code:I2C ERROR - TWI STATE: 0x20 I2C ERROR - TWI STATE: 0x20 LEFT Touch I2C ERROR - TWI STATE: 0x20 LEFT Touch LEFT Touch LEFT Touch LEFT Touch LEFT Touch LEFT Touc
danke schon mal im voraus für eure mühen mir zu helfen.
mfg andi







Zitieren

Lesezeichen