matze_smith
08.07.2006, 13:45
Hallo zusammen,
ich habe eine kleine SucheBall Funktion geschrieben, mit der der Asuro einen LED-Ball detektieren soll. Diese Funktion klappt an sich ganz gut, jedoch gibt es Probleme, wenn ich die PollSwitch Funktion implementiere. Kommentiere ich die PollSwitch Funktion aus und ersetze die Abfrage der Taster in der letzten while Schleife durch while (1) springt er in diese Schleife und steuert auf den Ball zu. Im anderen Fall dreht er sich nur im Kreis und scheint nicht in diese Schleife zu springen. Jedoch möchte ich den Asuro wissen lassen, wann er gegen den Ball "geknallt" ist :)
Hoffe mal jemand hat ne Idee, woran es liegen könnte.
Gruß
void SucheBall(void)
{
Timer_Overflow_Count=0;
while(Timer_Overflow_Count<360)
{
if (Timer_Overflow==1)
{
TCNT0=0; //Register auf Startwert 0 setzen
MotorDir(FWD,RWD);
MotorSpeed(120,120);
LineData(lData);
Mittelwert_aktuell=(lData[0]+lData[1])/2;
if (Mittelwert_aktuell>Mittelwert_max)
{Mittelwert_max=Mittelwert_aktuell;}
Timer_Overflow_Count++;
Timer_Overflow=0;
}
}
//Timer stoppen
TCCR0 &=~(1<<CS02); // löscht Bit an CS02
while (Mittelwert_aktuell2<=Mittelwert_max-50) //vergleiche neuen mittelwert mit gespeichertem Mittelwert_max
{
MotorDir(RWD,FWD);
MotorSpeed(120,120);
LineData(lData);
Mittelwert_aktuell2=(lData[0]+lData[1])/2;
}
t1=PollSwitch();
Sleep(216);
Sleep(216);
t2=PollSwitch();
while ((t1==0)&&(t2==0)) //Solange Taster nicht gedrückt....
{
BackLED(ON,ON);
LineData(lData);
if(lData[0]>lData[1]) //Wenn linker Phototransistor "heller" ist als rechter
{Forward(100,200);} //fahre links rum
else
{Forward(200,100);} //sonst rechts rum
t1=PollSwitch();
Sleep(216);
Sleep(216);
t2=PollSwitch();
}
BackLED(OFF,ON);
for(;;)
Forward(0,0);
TCNT0 = 0; //Register auf Startwert 0 setzen}
TCCR0 |=(1<<CS02);//Prescaler:256 "clkI/O/256"
}
SIGNAL(SIG_OVERFLOW0) //Funktion wird aufgerufen, wenn Timer überläuft
{
Timer_Overflow=1;
}
ich habe eine kleine SucheBall Funktion geschrieben, mit der der Asuro einen LED-Ball detektieren soll. Diese Funktion klappt an sich ganz gut, jedoch gibt es Probleme, wenn ich die PollSwitch Funktion implementiere. Kommentiere ich die PollSwitch Funktion aus und ersetze die Abfrage der Taster in der letzten while Schleife durch while (1) springt er in diese Schleife und steuert auf den Ball zu. Im anderen Fall dreht er sich nur im Kreis und scheint nicht in diese Schleife zu springen. Jedoch möchte ich den Asuro wissen lassen, wann er gegen den Ball "geknallt" ist :)
Hoffe mal jemand hat ne Idee, woran es liegen könnte.
Gruß
void SucheBall(void)
{
Timer_Overflow_Count=0;
while(Timer_Overflow_Count<360)
{
if (Timer_Overflow==1)
{
TCNT0=0; //Register auf Startwert 0 setzen
MotorDir(FWD,RWD);
MotorSpeed(120,120);
LineData(lData);
Mittelwert_aktuell=(lData[0]+lData[1])/2;
if (Mittelwert_aktuell>Mittelwert_max)
{Mittelwert_max=Mittelwert_aktuell;}
Timer_Overflow_Count++;
Timer_Overflow=0;
}
}
//Timer stoppen
TCCR0 &=~(1<<CS02); // löscht Bit an CS02
while (Mittelwert_aktuell2<=Mittelwert_max-50) //vergleiche neuen mittelwert mit gespeichertem Mittelwert_max
{
MotorDir(RWD,FWD);
MotorSpeed(120,120);
LineData(lData);
Mittelwert_aktuell2=(lData[0]+lData[1])/2;
}
t1=PollSwitch();
Sleep(216);
Sleep(216);
t2=PollSwitch();
while ((t1==0)&&(t2==0)) //Solange Taster nicht gedrückt....
{
BackLED(ON,ON);
LineData(lData);
if(lData[0]>lData[1]) //Wenn linker Phototransistor "heller" ist als rechter
{Forward(100,200);} //fahre links rum
else
{Forward(200,100);} //sonst rechts rum
t1=PollSwitch();
Sleep(216);
Sleep(216);
t2=PollSwitch();
}
BackLED(OFF,ON);
for(;;)
Forward(0,0);
TCNT0 = 0; //Register auf Startwert 0 setzen}
TCCR0 |=(1<<CS02);//Prescaler:256 "clkI/O/256"
}
SIGNAL(SIG_OVERFLOW0) //Funktion wird aufgerufen, wenn Timer überläuft
{
Timer_Overflow=1;
}