@Slyd: wenn ich deinen post richtig verstanden habe, war mein ursprüngliches problem, dass in meinem programm move_state immer = 0 war und dadurch case 1 erst gar nicht ausgeführt wird.
Aus diesem grund habe ich jetzt noch einmal alles abgeändert und auch ein paar kommentare hinzugefügt.
zum besseren verständnis hier noch meine dazugehörige liberweiterung:
Code:
void infrarotkollission(void)
{DDRC &=~ (1<<PC3); //PC3 als Eingang infrarotempfänger
if(ir_erweiterung ==0)
{
if (!(PINC & (1<<PC3)))
{writeString_P("Infrarotempfang ein\n");
writeStringLCD("ir_counter=:");
writeString("ir_counter=:");
writeInteger(ir_counter,DEC);
writeIntegerLCD(ir_counter, DEC);
writeChar('\n');
ir_ende = false;
ir_counter++; //infrarot empfangen
}
}
if (ir_counter ==50)
{ir_hindernis = true;
ir_erweiterung = 1;
}
if (ir_ende)
{ir_counter =0;
ir_erweiterung =0;
ir_hindernis = false;
}
}
und hier jetzt mein komplettes abgeändertes demoprogramm:
Code:
// Uncommented Version of RP6ControlServo.c
// ------------------------------------------------------------------------------------------
#include "RP6ControlLib.h"
#include "RP6ControlServoLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"
//Servo 1 => PC2
//Servo 2 => PC3
//Servo 3=> PC4
//Servo 4=> PC5
//Servo 5=> PC6
uint8_t move_state = 0; // Wenn nichts anderes zugewiesen ist, ist move_state =0
void RP6_Bewegung(void)
{if (ir_hindernis)
{
if (!(ir_ende))
{stopStopwatch3(); //stopwatch3 anhalten wenn ir erkannt wird und damit servobewegung anhalten
writeString_P("ir ende gleich false\n");}
{switch(move_state)
{case 0:
if (getStopwatch3() <1000 || getStopwatch3() >6000)
{rotate(50,RIGHT,90,NON_BLOCKING); //um 90 grad rotieren
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("ir ende gleich true\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");}
}
int main(void)
{
initRP6Control();
I2CTWI_initMaster(100);
initSERVO(SERVO3);
startStopwatch3();
while(true)
{
servoansteuerung();
task_SERVO();
infrarotkollission();
RP6_Bewegung();
}
return 0;
}
das alte problem, dass das programm in der case 0 ständig "hängen" bleibt müsste ich jetzt eigentlich behoben habe. der RP6 dreht sich jetzt auf jeden fall schon mal 90 grad und bleibt dann stehen.
was allerdings immer noch nicht geht, ist dass das programm nach der rotationsbewegung in die case 1 geht und dann mit startStopwatch3() die servobewegung wieder startet.
hat jemand vielleicht auf dieses phänomen eine erklärung?

Zitat von
SlyD
Formatier den Code in Zukunft mal übersichtlicher dann sieht man sowas auch leichter
MfG,
SlyD
ich gelobe in zukunkt besserung
Lesezeichen