PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aus einer if-Funktion "ausbrechen"



Ollowain
18.10.2009, 22:31
Hallo allerseits,
ich steh gerade vor folgendem Problem. Der Asuro soll, wenn die Linie verlassen sollte (data[0] > x && data[1] > x ; das mit den werten funktioniert schon das Problem liegt wo anders), den Boden absuchen (links drehen, rechts drehen, vorwärts fahren und wieder drehen). Sobald er wieder auf der Linie ist soll er aufhören zu drehen oder was auch immer und ganz normal mit der while-schleife (Linienverfolgung) weitermachen. Bin leider nicht so erfahren in sachen programmieren. Kann man eine while schleife in einer while schleife machen? Hier mal der "Such-Code":


if (T9>700 && T10>700) // Werte wenn beide Liniensensoren über weiß sind => Linie suchen
{
MotorDir(FWD,FWD);
MotorSpeed(0,150);
for (i=0; i<=1000; i++)
{Sleep(72);}

MotorDir(FWD,FWD);
MotorSpeed(150,0);
for (i=0; i<=2000; i++)
{Sleep(72);}

MotorDir(FWD,FWD);
MotorSpeed(0,150);
for (i=0; i<=100; i++)
{Sleep(72);}

MotorDir(FWD,FWD);
MotorSpeed(150,150);
for (i=0; i<=500; i++)
{Sleep(72);}
}

müsste es heißen: while(T9>700 && T10>700) ?

the.speciali
18.10.2009, 22:54
Hallo,

Man kann wenn man will hunderte while schleifen ineindern machen ;)
So wie ich das sehe müsstest du einfach statt der if Abfrage ein while draus machen dann sollte es funktionieren, er sucht dann nämlich solange (while) eine linie bis der Wert für des Weiß wieder anders wird, er also eine Linie findet.

beste Grüße
the.speciali

Ollowain
19.10.2009, 18:57
Habs jetz mit while funktioniert aber immer noch nicht, d.h. er "arbeitet" den ganzen block ab und stopt nicht wenn er über die linie fährt.

Code:

while(1)
{

LineData(data);
T9=data[0];
T10=data[1];

{Sleep(72);}
while (T9>700 && T10>700) // Werte wenn beide Liniensensoren über weiß sind => Linie suchen
{
MotorDir(FWD,FWD);
MotorSpeed(0,150);
for (i=0; i<=1000; i++)
{Sleep(72);}

MotorDir(FWD,FWD);
MotorSpeed(150,0);
for (i=0; i<=2000; i++)
{Sleep(72);}

MotorDir(FWD,FWD);
MotorSpeed(0,150);
for (i=0; i<=1000; i++)
{Sleep(72);}

MotorDir(FWD,FWD);
MotorSpeed(150,150);
for (i=0; i<=200; i++)
{Sleep(72);}
}

if ((T9<=700 && T9>=530) && (T9<=700 && T10>=580)) // Werte für die der Asuro optimal auf der Linie ist
{
MotorDir(FWD,FWD);
MotorSpeed(180,180);
{Sleep(72);}
} .......

Woran könnte es liegen?

the.speciali
19.10.2009, 19:48
Also die while Schleife hat da manchmal so seine Probleme mit logischen Operatoren wie "&&". Also wenns geht weglassen oder hier bei "while (T9>700 && T10>700)" zusätzliche Klammern reinmachen etwa so: "while ((T9>700) && (T10<700))".

Kommen wir zum nächsten Problem: Die If Abfrage wird so nicht funktionieren. Denn es müssen alle zwei Sensoren einen "schwarzen" Wert erhalten bevor er anhält^^ Also da müsste ein Oder ("||") rein. Und natürlich nicht die Klammern vergessen ;)

Dann sollte es funktionieren, wenn nicht einfach nochmal nachfragen, dann sehen wir weiter ;).

beste Grüße
the.speciali

Ollowain
19.10.2009, 21:22
das mit while funktioniert auch nicht. Wieder "arbeitet" er den ganzen block durch und hört nicht auf zu "suchen".
weiß jemand rat zur lösung des Problems?

das programm geht übrigens noch weiter hab bloß den wichtigen ausschnitt hier gepostet. Linienverfolgen funktioniert auch soweit bloß das "suchen" nicht aus o.g. gründen.

Gock
19.10.2009, 22:08
Damit das funktioniert, muss er nach jeder Teilbewegung prüfen, ob die Bedingung erfüllt ist. Dein Code prüft EINMAL ganz am Anfang die Bedingung und dann läuft der Block durch, je nach Ergebnis.
Wie wäre es mit


Ende = 0;
while (! (Bedingung == weiß) || Ende){
drehe LINKS_10ms;
Zaehler++;
if(Zaehler >= ZaehlerMax){
Zaehler = 0;
Ende = 1;
}
}
Ende = 0;
while(! (Bedingung == weiß) || Ende){
fahre VOR_10ms;
Zaehler++;
if(Zaehler >= ZaehlerMax){
Zaehler = 0;
Ende = 1;
}
}
usw.

Erst links und dann wieder rechts drehen führt natürlich auch nicht zum Ziel, wenn er nicht zwischendurch zB mal vor fährt.
Viel Spaß