PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : frage zu eigenem programm



proevofreak
15.03.2008, 20:30
hallo leute, hab gerade folgendes kleine programm geschrieben.... leider funktioniert es nicht wie gewollt... der roboter fährt nämlich die gesamte strecke von einem meter ab und bleibt nicht wie gewollt nach 2sekunden stehen.... kann mir vielleicht jemand sagen warum? hier mein programm:

#include "RP6RobotBaseLib.h"



int main(void)
{
initRobotBase(); // Mikrocontroller initialisieren


powerON();

startStopwatch1();



while(true)
{
move(60,FWD,DIST_MM(1000),true);
if(getStopwatch1()>2000)
{move(0,FWD,DIST_MM(0),true);
setStopwatch1(0);}
task_RP6System();
}
return 0;
}

SH-Robotics
15.03.2008, 21:34
ganz einfach

move(60,FWD,DIST_MM(1000),true);

wird jedesmal ausgeführt und deswegen fährt er weiter.
Für was brauchst du eigentlich eine while Schleife?


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase(); // Mikrocontroller initialisieren

powerON();
move(60,FWD,DIST_MM(1000),true);
startStopwatch1();

while(true)
{
if(getStopwatch1()>2000)
{move(0,FWD,DIST_MM(0),true);
setStopwatch1(0);}
task_RP6System();
}
return 0;
}

so sollte es funktionieren

Pr0gm4n
16.03.2008, 08:56
Hi,

nein, nicht ganz, da wenn ich das richtig verstanden habe mit dem TRUE am ende in den Klammern bei Fahrbefehlen die blockierende Funktion auf ON gesetzt wird, d.h., dass er zuerst 1m fährt, dann guckt, was die Stopwatch sagt und dann wieder in die while-Schleife zurückkehrt.

es guckt glaub ich so aus:


#include "RP6RobotBaseLib.h"



int main(void)
{
initRobotBase(); // Mikrocontroller initialisieren


powerON(); //Sensoren etc. an
move(60,FWD,DIST_MM(1000),0); //losfahren
startStopwatch1(); //Stopwatch starten



while(true)
{
//hier also kein move
if(getStopwatch1()>2000) //Stopwatch checken
{moveAtSpeed(0,0); //nichmehr fahren
setStopwatch1(0);} //stopwatch zurücksetzen
task_RP6System(); //Robbys System abfragen
}
return 0;
}

sry, ich wusste nichmehr ob es wrong oder false ist, also hab ich ne 0 verwendet, das ist das gleiche

Ach ja, ich würde dir empfehlen für zeitgesteuerte Sachen immer
moveAtSpeed(leftspeed,rightspeed);
zu verwenden. Damit hast du dann die blockierende Funktion nie drin und dein Timing funktioniert auch.

Theoretisch könntest du ihn mit



void zeitFahren(int zeit_x, int speed_x, int speed_y){
int zeit_x, speed_x, speed_y;
if(getStopwatch1()<zeit_x){
moveAtSpeed(speed_x,speed_y);
mSleep(1)
moveAtSpeed(0,0);
}
if(getStopwatch1<zeit_x){
zeit_x--;
zeitFahren(zeit_x, speed_x, speed_y);}
}


genau 2 Sekunden lang fahren lassen

/*ich hoffe, ich hab nix vergessen, in dem kleinen Kurz Antwort Fenster ist das so unübersichtlich...*/

naja, viel Spass noch!!

MfG Pr0gm4n