PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SucheBall-Funktion



matze_smith
08.07.2006, 12: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;
}

matze_smith
09.07.2006, 14:48
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

outdoorgamer
09.07.2006, 18:08
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.