Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler in meinem Programm?
Ich wollte meinen Roboter so Prgrammieren, dass er durch ein Labyrinth hindurch kommt. Mit dem Algorithmus der Tiefensuche ist das auch kein Problem. Aber irgendwie leuchtet nur die Status LED grün wenn ich den Roboter einschalte hier mein Code
include "asuro.h"
#define FULL_L 220
#define FULL_R 250
/* vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}
/* rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}
/* bremsen */
void MotorStop(void)
{
MotorSpeed(0,0);
}
int main(void)
{
unsigned char hit;
while(1);
{
hit = PollSwitch();
if(hit == 0);
{
MotorFwd();
}
if(hit == 32);
{
MotorFwd();
}
if(hit == 33);
{
MotorDir(FWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}
if(hit != 32);
{
MotorDir(FWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}
}
}
Hab ich irgendwo einen Fehler gemacht?Der Anfang ist aus dem Test Programm. Ich will dass der Asuro nach links fährt und so Kontakt mit der Wand hat. Und dieser so folgt.
hallo
du hast nach while(1) ein ";"!
dadruch erzeugst du eine endlosschleife ohne befehle (wie am ende, um zu verhindern, dass er sich irgend wo im speicher verläuft)
hier willst du aber, dass alles, das in den {} ist aufgeführt wird. daher musst du den ; entfernen
vorher würde ich aber auch noch ein Init(); schreiben
Oh stimmt, dass gehört da nicht hin... Jetzt funktionierts auch ;) danke da hab ich etz 5 mal drübergelesen
hallo!
hab ein ähnliches problem! und zwar soll er eigentlich grade aus fahren und wenn er wo gegen fährt zurücksetzen sich ein bisschen drehen und wieder grade aus fahren. leider erkennt er ständig eine kollision auch wenn keine vorliegt, fährt dann mal 2 sekunden vorwärts und dann sofort wieder zurück obwohl keine kollision war... hier mein text:
#include "asuro.h"
int main(void)
{
Init();
while(1)
{
if(PollSwitch()==0)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(100,100);
}
else
{
StatusLED(RED);
MotorDir(RWD,RWD);MotorSpeed(100,100);
for(izaehler=0;izaehler<300;izaehler++){Sleep(255);}
MotorDir(FWD,BREAK);MotorSpeed(90,0);
for(izaehler=0;izaehler<400;izaehler++){Sleep(255);}
}
}
return 0;
}
hallo Svenja
dein problem ist glaube ich haupsächlich hardwarebedingt (zumindes müsste der code funktionieren)
und zwar hat die funktion PollSwitch() ein seltsames verhalten, dass sie manchmal "falsche" werte liefert. dies ist besonders häufig bei laufenden motoren
mann kann sich abhelfen, in dem man sie öfter aufruft und überprüft, ob die werte gleich sind, da selten zwei mal hinter einander der selbe falsche wert zurück gegeben wird
das könnte dann so aussehen:
int t1,t2; // variablen bereitstellen, zum speichern der tasterwerte
t1=PollSwitch();
t2=PollSwitch();
if(t1==t2 && t1!=0)
{
//Anweisungen, die ausgeführt werden sollen, wenn sicher mind. ein taster gedrückt ist
}
else
{
//Anweisungen, für den fall, dass kein taster gedrückt ist, oder 2 verschiedene werte zurückgegeben wurden
}
hier siest du auch wie man mit hilfe von [code ] und [/code ] ein Programm schön einfügen kann (in den [] muss man das leerzeichen weglassen, und statt dem "und" steht dein programm
noch etwas: mich wundert, dass sich dein programm bei dir überhaupt compiliern lassen hat, denn du hast izaehler nicht deklariert (zb. int izaehler;)
eigentlich müsste hier eine fehlermeldung kommen
ich hab nachdem ich den text hier reinkopiert hab noch ein bisschen was geändert, da ist das dann wohl verloren gegangen...
ich habs jetzt mal so probiert, wiedu vorgesclagen hast, aber jetzt fährt er n ur noch rückwärts. vorher ist er ja zumindest manchmal wenigstens 2 sekunden vorwärts gefahren. anscheinend kriegt er immer zwei gleiche werte ungleich 0 zurück. was nun?
#include "asuro.h"
int main(void)
{
Init();
int izaehler,t1,t2;
while(1)
{
t1=PollSwitch;
t2=PollSwitch;
if(t1==t2 && t1!=0)
{
StatusLED(RED);
MotorDir(RWD,RWD);MotorSpeed(100,100);
for(izaehler=0;izaehler<500;izaehler++){Sleep(255);}
MotorDir(FWD,BREAK);MotorSpeed(90,0);
for(izaehler=0;izaehler<600;izaehler++){Sleep(255);}
StatusLED(GREEN);
}
else
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(100,100);
}
}
return 0;
}
Hallo Svenja,
probiers mal mit Klammern hinter "PollSwitch"
Also:
t1=PollSwitch();
t2=PollSwitch();
statt:
t1=PollSwitch;
t2=PollSwitch;
super danke, hätte ja nicht gedacht, dass es daran liegen kann :oops:
izaehler wird bei dir nicht deklariert (bereitgestellt). Eigentlich müsste das ein Fehler geben. Um das zu beheben musst du vor dein Hauptschleife (while(1)) noch ein
int izaehler
schreiben.
mfg liggi
den izaehler hat sie ja inzwischen schon deklariert, aber da ist mir gerade eben aufgefallen, dass trotzdem noch was falsch ist:
die beiden Variablen t1 und t2 müssen vom Typ unsigned char sein, da die Funktion PollSwitch() diesen Typ als Rückgabewert hat.
Woher ich das weiß? Ein Blick in die asuro.h genügt. Da drin steht unter anderem:
unsigned char PollSwitch (void);
Also muss es:
int izaehler;
unsigned char t1, t2;
heißen, statt:
int izaehler,t1,t2;
hallo liggi
das wurde in der zwischenzeit korrigiert (siehe beitrag weiter oben)
aber ansich müsste es sonst eine fehlermeldung ergeben
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.