
Zitat von
RP6conrad
Ihre void RP6_Bewegung(void) fangt an mit
{if (ir_hindernis)
Das bedeutet naturlich auch das (ir_hindernis) immer TRUE sein muss um die weitere ablauf zu bearbeiten. Ist das auch so ?
ir_hindernis ist solange TRUE bis ir_ende gleich TRUE wird, also die ganze zeit.
siehe hier:
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;
}
}

Zitat von
RP6conrad
Du muss absolut die layout so machen, das es klar ist welche {} zusammen horen. Auf das ende von diese function stehen 4 } nacheinander, und mir ist es nicht klar was bei was gehort.
hier habe ich das demoprogramm noch mal sorgfältig überarbeitet:
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 starten => servo wieder drehen
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;
}
mfg andi
Lesezeichen