PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : asuro geht nicht mehr aus schleife raus/problem mit taster



inchik
09.03.2009, 12:58
es geht um den farbig markierten teil am ende des codes. das problem ist, dass wenn das erste mal irgendeine der besagten tasten gedrückt wird, der asuro das macht was er soll. dh. er stößt vorne an, dadurch wird irgendeine der vorderen tasten gedrückt und er fährt ein stück zurück, dann weiter vorwärts. stößt er dann wieder vorne an, fährt er allerdings nicht mehr zurück. d.h. er bleibt irgendwie im code hängen oder so. woran könnte das liegen? danke schonmal!


#include "asuro.h"


#define FULL_L 210
#define FULL_R 210

void KurzzurueckunddannLinkskurve(void)
{
float endtime;
endtime = Gettime() + 1000;
while (Gettime() < endtime/2)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}
while (Gettime() > endtime/2 && Gettime() < endtime)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L - 100, FULL_R);
}
}

void StarkeLinkskurve(void)
{
MotorDir(RWD,FWD);
MotorSpeed(10,FULL_R);
}

/*starke rechtskurve - zeitabhaengig (winkel fahren)*/
void StarkeRechtskurve(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R - 100);
}


int main(void)
{
unsigned char t1, t2;

Init();
while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
StarkeRechtskurve(); /* vorwaerts fahren */
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2) // irgendeine taste ist gedrueckt]
{
if (t1 & 0x02 || t2 & 0x10)
{
KurzzurueckunddannLinkskurve();
}

Msleep(1000); /* 1 Sekunde warten */
}
}
return 0;
}

radbruch
09.03.2009, 14:19
Hallo

Deine float/gettime()-Funktion in KurzzurueckunddannLinkskurve() kommt mir etwas spanisch vor. Rückgabewert von gettime() ist unsigned long, ich weiß nicht was passiert wenn gettime() überläuft und endtime deshalb nie erreicht wird? Besser wäre auf jeden Fall anstelle von float auch unsigned long für endtime zu verwenden. (Warum eigentlich endtime/2?) Vermutlich bleibt dein Programm irgendwie hier stecken:


while (Gettime() > endtime/2 && Gettime() < endtime)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L - 100, FULL_R);
}
Das würde ich allerdings etwas anders formulieren weil zu häufiges und schnelles Aufrufen von MotorSpeed() möglicherweise Probleme verursachen könnte:


MotorDir(FWD,FWD);
MotorSpeed(FULL_L - 100, FULL_R);
while (Gettime() > endtime/2 && Gettime() < endtime);
Und nun kannst du dir das gettime() sparen und durch schlichtes Msleep() ersetzen...

MotorDir(FWD,FWD);
MotorSpeed(FULL_L - 100, FULL_R);
Msleep(1000);

Gruß

mic