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:
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;
}
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.
im terminal erscheint diese meldung:
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
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.
danke schon mal im voraus für eure mühen mir zu helfen.
mfg andi
Lesezeichen