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:
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;
}
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:
[READY]
LEFT Touch
I2C ERROR - TWI STATE: 0x20
LEFT Touch
LEFT Touch
LEFT Touch
LEFT Touch
LEFT Touch
LEFT Touâ
[RP6BOOT]
offensichtlich ist im programm noch irgendetwas in verbindung mit I²C falsch.
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
Lesezeichen