Hallo
Ich war mal so frei und habe den Code nach meinen Gewohnheiten formatiert:
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;
}
}
Code:
// IR-Radar von proevofreak 26.2.2010
// von radbruch formatierter Code
#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;
}
(Weder kompiliert noch überprüft oder getestet)
Gruß
mic
Lesezeichen