PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Msleep Problem



blackyy
25.01.2009, 15:15
Keine Ahnung was da falsch läuft aber ist aber relativ lustig. Mein Programm funktioniert so einwandfrei


#include "asuro.h"


#define FULL_L 80
#define FULL_R 60

/* 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)
{

Init();

while(1)

{


if(PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(50,255);
}

if(PollSwitch()==32)
{
MotorDir(FWD,FWD);
MotorSpeed(100,200);
}

if(PollSwitch()==33)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);

}

if(PollSwitch()!=32)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);

}
}
}


Ich will aber wenn ASURO ein Kontakt mit der Wand hat, d.h wenn er in der Ecke steht und nicht mehr weiter kommt. Ich hab die Msleep funktion eingebaut und für 1 sec eingestellt wollt rausfinden wie lang er braucht um sich um 90 grad zu drehen. das hat dann so ausgeschaut


#include "asuro.h"


#define FULL_L 80
#define FULL_R 60

/* 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)
{

Init();

while(1)

{


if(PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(65,255);
}

if(PollSwitch()==32)
{
MotorDir(FWD,FWD);
MotorSpeed(100,200);
}

if(PollSwitch()==33)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
Msleep(1000);
}

if(PollSwitch()!=32)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
Msleep(1000);
}
}
}

Jetzt funktioniert aber gar nichts mehr und der Roboter düst einfach nach hinten. Was ist jetzt da falschgelaufen hab ich di Lib nich richtig installiert?

radbruch
25.01.2009, 15:35
Hallo

Die PollSwitch()-Funktion "lügt" häufig, vor allem wenn die Tasten bei laufenden Motoren abgefragt werden. Die Chance dass ein falscher Wert genau 0 oder 32 ist ist bedeutend geringer als ein falscher Wert ==32 oder != 32.

Mehrfachabfrage der Tasten bei Motorstörungen:



#include "asuro.h"


#define FULL_L 80
#define FULL_R 60

/* 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)
{
char t1, t2;

Init();

while(1)

{
t1=PollSwitch();
t2=PollSwitch();

if((t1==t2) && (t2==0))
{
MotorDir(FWD,FWD);
MotorSpeed(65,255);
}

if((t1==t2) && (t2==32))
{
MotorDir(FWD,FWD);
MotorSpeed(100,200);
}

if((t1==t2) && (t2==33))
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
Msleep(1000);
}

if((t1==t2) && (t2!=32))
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
Msleep(1000);
}
}
}


Gruß

mic

malediction
25.01.2009, 15:42
also du verwendest eine aktuelle (überabeitete) lib?! beispielsweise die version 2.71 oder 2.8?!

hast du die funktion Msleep() jemals getestet?! fie funktion soll ja einfach nur den wert in ms warten, den du übergibst. also wartet Msleep(1000) 1 sekunde. du kansst bei solceh einfachen problemen ganz einfach den fehler eingrenzen, indem du dir kleine hilfsprogramme schreibst. lass z.b. einfach nur die status led erst grün leuchten, dann nach einer sekunde gelb und nach einer weiteren rot. dann schaltest du sie nach 2 sekunden ab. mehr soll asuro in deinem testprogramm erst mal nicht machen. wenn alles funktionier wie beschrieben, kannst du erkennen, dass die funktion Msleep() [und damit wahrscheinlich auch die ganze lib] richtig funktioniert.

geht es damit nicht wie gewünscht, musst du weiterforschen. allerdings ist das oft gut, das so zu machen, weil man dann ein gefühl für mögliche fehlerursachen bekommt und sich dann auch oft selbst helfen kann.

ich mach es auch oft so, dass ich mögliche fehlerquellen stück für stück auskommentiere, einfach nur um zu sehen, ob es an der entsprechenden stelle liegt oder nicht.

das testprogramm sehe dann so aus:



#inclue asuro.h

int main()
{
Init();
StatusLED(OFF);
Msleep(500);
StatusLED(GREEN);
Msleep(1000);
StatusLED(YELLOW);
Msleep(1000);
StatusLED(RED);
Msleep(2000);
StatusLED(OFF);

while(1);
return 0;
}


... jetzt wo ich hier grad so den code reinschreibe fällt mir auf, dass du in deiner main() funktion gar kein return am ende hast. meckert dein compiler da gar nicht?!

blackyy
25.01.2009, 16:17
Nö merkt er nicht, nachdem ich ne endlos schleife programmieren will is des auch kein problem aber du hast recht gehört einfach der Formhalber hinzu. Ich hab das Problem jetzt gefunden, lib funktioniert einwandfrei auch die Msleep funktion. Aber anscheinend ist der befehl Pollswitch()!=32 jetzt dem Befehl pollswitch()==0 übergeordnet deswegen fährt er sofort nachhinten los weil 0 ungleich 32 ist. Eigentlich logisch aber warum er das nicht macht wenn der befehl Msleep nicht drin ist, ist irgendwie komisch. So funktioniert aber alles einwandfrei

#include "asuro.h"


#define FULL_L 80
#define FULL_R 60

/* 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)
{

Init();

while(1)

{


if(PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(65,255);
}

if(PollSwitch()==32)
{
MotorDir(FWD,FWD);
MotorSpeed(100,200);
}

if(PollSwitch()==33)
{
MotorDir(FWD,RWD);
MotorSpeed(60,60);
Msleep(1000);

}

if(PollSwitch()!=32 && PollSwitch()!=0)
{
MotorDir(FWD,RWD);
MotorSpeed(60,60);
Msleep(1000);
}

}
return 0;
}

malediction
25.01.2009, 16:47
ja die pollswitch funktion hat ne macke...

ist mir auch aufgefallen. ich hab das ganze noch ein wenig anders gelöst. es gibt beim roboterclub freiburg (http://www.roboterclub-freiburg.de/asuro/zufall/zufall.html) eine funktion (die untere auf der website namens KeyPressed()), die sicherer arbeitet als die pollswitch(). allerdingsliefert sie dir nur 0 (nicht gedrückt) und 1 (gedrückt) zurück, egal welcher schalter gedrückt ist.

ich hab die funktion bei mir eingebunden und dann meine tasterabfrage-funktion so gemacht:



/*Funktion zum Abfragen der 6 Taster; Liefert Wert zurück, je nachdem welcher Taster gedrückt ist*/
int Taster(void)
{
int t1,t2;

while(1) {
t1=KeyPressed();
t2=PollSwitch();

if ((t1==0x01)&&(t2==0x01)) return 6; //0b000001
else if ((t1==0x01)&&(t2==0x02)) return 5; //0b000010
else if ((t1==0x01)&&(t2==0x04)) return 4; //0b000100
else if ((t1==0x01)&&(t2==0x08)) return 3; //0b001000
else if ((t1==0x01)&&(t2==0x10)) return 2; //0b010000
else if ((t1==0x01)&&(t2==0x20)) return 1; //0b100000

else if ((t1==0x01)&&(t2!=0x01)&&(t2!=0x02)&&(t2!=0x04)&&(t2!=0x08)&&(t2!=0x10)&&(t2!=0x20)&&(t2!=0x00)) return 7; //mehr als eine Taste

else return 0;
}
}

damit frage ich zum einen ab, ob überhaupt ein taster gedrückt ist (über KeyPressed()) und zum anderen, welcher gedrückt ist (über PollSwitch()). und ich muss sagen, dass das so richtig gut und zuverlässig funktioniert.

kann ich jedem nur empfehlen...

grüße, malediction...

malediction
06.02.2009, 15:56
@ fredweise... wie bitte meinst du das?!
was soll daran nicht klappen...

ein bisschen präziser solltest du schon sein...

radbruch
06.02.2009, 15:59
Seine Library kennt Msleep() noch nicht:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=46113

Deshalb hatte ich seinen Betrag schon gelöscht...

malediction
06.02.2009, 16:05
ok... das wär auch das, was mir als erstes eingefallen wäre...
nur war die frage wirklich ein bisl lustig ;)