PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : if-else + while



upaucc
28.11.2006, 13:59
Hi,
habe mal was ganz einfaches geschrieben, aber es funktioniert nicht wie es sollte. Asuro soll zuerst checken ob er irgendwo dagegen steht, ist dies der Fall soll er stehen bleiben und eben eine Nachricht ausspucken, das macht er auch wunderbar.
Sollte keiner der Taster gedrückt sein, soll er solange geradeausfgahren bis er irgendwo dagegen stößt, dann soll er ca. 1 s still stehen und dann rückwärts fahren.
In wirklichkeit macht er jedoch das: Wird er eingeschaltet steht er ca 1s und fährt dann rückwärts.


#include "asuro.h"

int main(void)
{
Init();
if(PollSwitch()==0){
while(PollSwitch()==0){
MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Msleep(666);
MotorDir(RWD,RWD);
MotorSpeed(100,100);
}
else{
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
StatusLED(RED);
SerWrite("Hinderniss!\n",11);
}



}

EDH
28.11.2006, 16:40
also die schleife wird einmal ausgeführt, un ddann eben nicht mehr.

möglicherweise hilft es , wenn du poillswitch öfters aufrufst

EDH
28.11.2006, 16:44
kleiner nachtrag:
schrieb vieleicht ans ende while(1)
und der form halber auch noch return 0

damaltor
28.11.2006, 16:46
soo wolln wir uns das mal ansehen.

#include "asuro.h"

int main(void)
{
Init();

if(PollSwitch()==0){ Warum die if schleife? die while schleife prüft doch schon ob PollSwitch gleich null ist...

while(PollSwitch()==0){ soweit in ordnung... solange kein taster gedrückt, fahre gerade aus
MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);
}

MotorDir(BREAK,BREAK); sooo... wenn eine taste gedrückt wurde (und die while schleife von oben abgebrochen wurde) dann halte an, warte 666millisekunden, und fahre rückwärts.
MotorSpeed(0,0);
Msleep(666);
MotorDir(RWD,RWD);
MotorSpeed(100,100);

ab hier...

}
else{
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
StatusLED(RED);
SerWrite("Hinderniss!\n",11);
}

bis hier, dieser code wird nicht gebraucht. schliesslich sind ja schon beide möglichkeiten geschreiben worden da oben.

} diese klammer markiert das ende der main funktion


also lässt sich der code auf folgendes reduzieren:




#include "asuro.h"

int main(void){

Init();
while(PollSwitch()==0){
MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);
}

MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Msleep(666);
MotorDir(RWD,RWD);
MotorSpeed(100,100);

}



ausserdem gibt es noch ein problem:

die Funktion PollSwitch() gibt immer mal wieder falsche werte zurück, deshlab sollte sie immer mehrfach abgefragt werden, bevor du damit arbeitest. du könntest z.B. am beginn deines programms (hinter init();) folgendes einbauen:



for(int k=0;k<10;k++){
PollSwitch();
}


einfügen.

gerade am beginn eines programms sind die werte von pollswitch meistens falsch.

EDH
28.11.2006, 16:53
dr hacken ist nur, das es einen fallunterscheidung zwischen "ist hinderniss am anfang?" und "ist hinder niss während dem fahren?" gibt
dafür braucht man dann die if abfrage schon...

damaltor
28.11.2006, 16:54
hmm.. also ich würd sagen das ist egal... er fährt gerade aus, bis er irgendwo gegenfährt. und wenn ein hindernis am start ist, fährt er gar nicht erst los...

EDH
28.11.2006, 16:58
wenn ein hinderniss am anfang ist, fährt er gleuih rückwärts.
auserdem gibt er nicht "hinderniss" aus.

damaltor
28.11.2006, 17:06
achso.. hmm...

öhm...

dann muss um den ganzen code (ab der while schleife bis zum ende von meinem code) eine if schleife, so wei du es auch gemacht hast... probier mal folgendes:



#include "asuro.h"

int main(void){

Init();
for(int k=0;k<10;k++){
PollSwitch();
}
if(PollSwitch==0){
while(PollSwitch()==0){
MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);
}

MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Msleep(666);
MotorDir(RWD,RWD);
MotorSpeed(100,100);


}else{
SerWrite("Hindernis",10);
}

}
[/code]

das sieht deinem code schon wieder verdächtig ähnlich... mmhh.. probiers mal reinzukopieren.

EDH
28.11.2006, 17:16
bei gcc 4.1.2 friist er den code nicht.
du darfs nicht for(int k=0; ... schrieben
es muss heise
int k;
for (k=0; ......


#include "asuro.h"

int main(void){

Init();
int k;
for(k=0;k<10;k++){
PollSwitch();
}
if(PollSwitch==0){
while(PollSwitch()==0){
MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);
}

MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Msleep(666);
MotorDir(RWD,RWD);
MotorSpeed(100,100);


}else{
SerWrite("Hindernis",10);
}

}

EDH
28.11.2006, 17:18
aber funktionieren tuts trotzdem nicht.
jetzt macht er (bei mir zumindest) gar nix ehr

damaltor
28.11.2006, 17:19
hmm... ich habs noch net getestet... wart ma kurz

damaltor
28.11.2006, 17:26
also ich habe vor der letzten klammer
while(1);
return 0;
vergessen... aber daran liegts nich

upaucc
28.11.2006, 17:37
hm, ich glaube dass die fahranweisung schon in eine while-schleife müsste, bei deinem letzten code, edh, läuft er ja nur einmal durch die if-anweisung und stoppt dann sofort wieder ab
(*edit: quatsch, habe mich verlesen, so müsst es klappen)

oder man löst es so:




#include "asuro.h"

int main(void)
{
Init();
if(PollSwitch()==0){
SerWrite("Los gehts!\n"10);
}
else{
StatusLED(RED);
SerWrite("Hinderniss!\n",11);
}
while(PollSwitch()==0){
MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
Msleep(666);
MotorDir(RWD,RWD);
MotorSpeed(100,100);

while(1);
return(0);


}


aber warum kann man dann nicht gleich die while-schleife in die if-anweisung einbauen?
theoretisch müsste doch, wenn die if-anweisung zutrifft die while-schleife solange durchlaufen werden bis die bedingung nicht mehr zutrifft...

damaltor
28.11.2006, 17:49
hier

SerWrite("Los gehts!\n"10);

fehlt ein komma.

ausserdem sollte am ende der datei immer ein zeilenumbruch stehen.

also bei mir fährt er rückwärts, egal was man macht. wenn er von anfang an keinen taster gedrückt bekommt, dann sendet der los gehts und fährt rückwärts. wenn man einen taster drückt sendet er hindernis und fährt auch rückwärts.