so, nach wirklich stundenlangem durcharbeiten der I²C lib, der beispielprogramme mit I²C und dem durchlesen der anleitung der base und der M32 habe ich mein programm jetzt nochmal abgeändert:
jetzt ist es so, dass das programm zwar fehlerfrei kompiliert wird, wenn ich es aber laufen lasse, springt es sofort nach dem start wieder in den standby- modus (hoffe die bezeichnung ist so richtig) und im terminal erscheint folgende meldung:Code:// Uncommented Version of RP6ControlServo.c #include "RP6ControlLib.h" #include "RP6ControlServoLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_I2CMasterLib.h" uint8_t move_state = 0; // Wenn nicht anders zugewiesen,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 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(); I2CTWI_initMaster(100); I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_ROTATE, true); MOTIONCONTROL_setStateChangedHandler(motionControlStateChanged); initSERVO(SERVO3); startStopwatch3(); while(true) { servoansteuerung(); task_SERVO(); infrarotkollission(); task_checkINT0(); task_I2CTWI(); } return 0; }
offensichtlich ist im programm noch irgendetwas in verbindung mit I²C falsch.Code:[READY] LEFT Touch I2C ERROR - TWI STATE: 0x20 LEFT Touch LEFT Touch LEFT Touch LEFT Touch LEFT Touch LEFT Touâ [RP6BOOT]
grundsätzlich kann ich nicht behaupten, dass ich die I²C lib bzw. funktionen trotz gründlichem durcharbeitens wirklich 100%ig verstanden habe, da sie doch aus sehr vielen verschiedenen teilen bestehen.
um so mehr bin ich auf eure hilfe hier angewiesen.
mfg andi







Zitieren

Lesezeichen