PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler in meinem Programm?



blackyy
22.01.2009, 15:03
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.

hai1991
22.01.2009, 15:20
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

blackyy
22.01.2009, 15:33
Oh stimmt, dass gehört da nicht hin... Jetzt funktionierts auch ;) danke da hab ich etz 5 mal drübergelesen

Svenja
11.02.2009, 21:04
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;

}

hai1991
11.02.2009, 21:45
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

Svenja
12.02.2009, 08:27
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;

}

orusa
12.02.2009, 09:52
Hallo Svenja,

probiers mal mit Klammern hinter "PollSwitch"
Also:
t1=PollSwitch();
t2=PollSwitch();

statt:
t1=PollSwitch;
t2=PollSwitch;

Svenja
12.02.2009, 14:29
super danke, hätte ja nicht gedacht, dass es daran liegen kann :oops:

liggi
12.02.2009, 15:22
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

orusa
12.02.2009, 18:52
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;

hai1991
12.02.2009, 18:54
hallo liggi

das wurde in der zwischenzeit korrigiert (siehe beitrag weiter oben)
aber ansich müsste es sonst eine fehlermeldung ergeben