-         

Ergebnis 1 bis 3 von 3

Thema: SucheBall-Funktion

  1. #1

    SucheBall-Funktion

    Anzeige

    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;
    }

  2. #2
    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Ort
    Whv
    Beiträge
    89
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •