-
SucheBall-Funktion
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ß
Code:
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;
}
-
Hi,
Konnte das Problem selber lösen. Die Sleep() Funktion, welche auch in der PollSwitch() vorkommt hat Probleme bereitet. Ich habe diese durch folgende Funktion ersetzt.
void delay_loop(unsigned int __count)
{
__asm__ volatile
(
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}
MFG
-
Tolle Idee.
Genau ähnlich sieht mein Programm aus, dass Sonne finden soll ( helle Flecken).
Das werde ich demnächst auch hier posten sobald mein Asuro endlich in Ordnung ist und die Solarzelle angebaut ist.