also die schleife wird einmal ausgeführt, un ddann eben nicht mehr.
möglicherweise hilft es , wenn du poillswitch öfters aufrufst
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.
Code:#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); } }
also die schleife wird einmal ausgeführt, un ddann eben nicht mehr.
möglicherweise hilft es , wenn du poillswitch öfters aufrufst
kleiner nachtrag:
schrieb vieleicht ans ende while(1)
und der form halber auch noch return 0
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:
ausserdem gibt es noch ein problem:Code:#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); }
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:
einfügen.Code:for(int k=0;k<10;k++){ PollSwitch(); }
gerade am beginn eines programms sind die werte von pollswitch meistens falsch.
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...
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...
wenn ein hinderniss am anfang ist, fährt er gleuih rückwärts.
auserdem gibt er nicht "hinderniss" aus.
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.
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; ......
Code:#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); } }
aber funktionieren tuts trotzdem nicht.
jetzt macht er (bei mir zumindest) gar nix ehr
Lesezeichen