PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Problem Init()



mich-beck
13.04.2006, 12:08
Habe ein kleines Programm für den asuro geschrieben, mit welchem er Abgründen und Hindernissen ausweichen kann. Das funktioniert mit diesem Quelltext auch wunderbar.
Das Problem ist:
Ich habe versucht die Init() außerhalb der while-schleife aufzurufen, was dazu führte, dass der asuro nur noch ausweicht. Also er fährt ständig rückwärts->kurve->rückwärts->kurve...
Manchmal fährt er dann doch gerade aus, bis er auf ein hinderniss oder einen Abgrund trifft, und dann wiederholt er das Ausweichmanöver wieder einige Male.
Kann mir das mal jemand erklären? Wo liegt mein Fehler im Programm?

Quellcode:


#include "asuro.h"
#define STOP 50
/*asuro kann einem abgrund mittels der liniensensoren ausweichen und hindernissen mittels der kollisionstaster*/

int main(void)
{

while(1)
{
//***************************deklaration der variablen***************************************** ***
unsigned int lineData[2]; //array für die daten der liniensensoren
unsigned char running = TRUE;
unsigned char i; //laufvariable für die for-schleifen
unsigned char taste=0; //nimmt den wert der kollisionstaster auf
//***************************programm*************** **********************************************
Init();
FrontLED(ON);
Sleep(20); //kurze pause, damit linedata die richtigen werte erfasst
LineData(lineData);

PollSwitch();
taste = PollSwitch();


if ((lineData[0] > STOP) && (lineData[1] > STOP) && (taste==0)) //vorwärts falls kein hinderniss und kein abgrund
{
MotorDir(FWD,FWD);
MotorSpeed(140,150);
PollSwitch();
}
else //wenden falls abgrund oder hinderniss
{
MotorSpeed(0,0); //stop
BackLED(ON,ON);
Sleep(100);
for(i=0; i<210; i++) //kurz zurueck
{
MotorDir(RWD,RWD);
MotorSpeed(130,130);
Sleep(100);
}
MotorSpeed(0,0);

for(i=0; i<140; i++) //wenden
{
MotorDir(FWD,RWD);
MotorSpeed(140,140);
Sleep(100);
}
BackLED(OFF,OFF);
}

Sleep(100);
}
return 0;
}

Archi
16.04.2006, 10:06
Ich tippe auf das klassische Problem mit den Kollisionstastern, die manchmal Werte liefern, ohne dass eine Kollision stattgefunden hat. Hier hilft mehrfaches Auslesen und Vergleichen. Es ist aber auch nicht schlimm, die Init()-Funktion mehrfach aszuführen. Warum's dann geht, kann ich auch nicht sagen.

CU, Robin

mich-beck
16.04.2006, 13:58
Danke für den Tip, habe das problem gefunden.
Waren tatsächlich dei Kollisionstaster, rufe jetzt die funktion einfach mehrfach auf, und siehe das, es geht.
Schätze mal, dass es mit der init in der schleife ging, weil die Initialisierung des atmel ja ne kurze zeit dauert, in der sich C7 wahrscheinlich entladen konnte und somit gings.