PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro fahre 1Sekunde zurück



Wombatz
11.06.2011, 11:34
Hallo zusammen,

hier kommt mein erster Eintrag.
Ich beschäftige mich erst seit kurzem mit der Programmierung und wollte nun meinem Asuro beibringen:

Fahre vorwärts, bis ein Taster gedrückt wird
dann fahre für ein Sekunde rückwärts.

Nun habe ich es mehrfach versucht und scheitere immer an der Zeitangabe, sprich: der Roboter fährt nach der Kollision zurück ohne anzuhalten.

Hier kommt mein Programmierversuch:

#include "asuro.h"

int main(void){
unsigned int i;

Init();
while(PollSwitch()==0)
{StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);

}

if(PollSwitch()!=0)
{StatusLED(RED);

MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=0;i>255;i++){Break(255);}
}

while(1);
return 0;
}


Danke für eure Hilfe!!!

MST1
11.06.2011, 11:44
Das heißt nicht Break(255); sondern Sleep(255)

Wombatz
11.06.2011, 11:56
Selbst mit Sleep funktionier das nicht.

radbruch
11.06.2011, 11:58
Hallo

Willkommen im RN-Forum und Glückwunsch zum asuro.

Wenn in deinem Programm die erste While-Schleife "while(PollSwitch()==0)" verlassen wird, läuft das restliche Programm in einem Rutsch durch bis zum finalen while(1);

Break() ist keine Verzögerung, hier sollte Sleep() stehen. In der For-Schleife ist die Abbruchbedingung falsch: for (i=0;i>255;i++){Break(255);}

Deshalb wird die Schleife nie betreten, also auch Break() nicht ausgeführt. (Möglicherweise wird die Schleife doch einmalig ausgeführt, weil die Abbruchbedingung erst am Schleifenende geprüft wird. Das würde aber keinen Unterschied machen, weil nach Break() die Schleife trotzdem sofort beendet und verlassen wird.)

Nach

MotorDir(RWD,RWD);
MotorSpeed(120,120);

springt das Programm deshalb direkt nach

while(1);

Grundsätzlich fehlt im Programm aber auch die Endlosschleife:


#include "asuro.h"

int main(void)
{
unsigned int i;

Init();

while(1)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);

while(PollSwitch()==0);

StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(120,120);

//while(PollSwitch()!=0);

for (i=0;i<1000;i++)
{
Sleep(72); // 72 bei orginaler CD-Library, bei neuen Libs 36
}
}
return 0;
}(Ungetestet)

Gruß

mic

Wombatz
11.06.2011, 12:10
Also habe ich zuerst einmal die while (1) schleife nach oben verlegt.

while(1){

while(PollSwitch()==0)
{StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}.....

jetzt fährt er vorwärts. Sobald ein Taster gedrückt wird, fährt er rückwärts bis der Schalter wieder =0 ist. Dann wieder von vorn =)

Wenn ich jetzt noch die Abbruchsbedingung ändere, ändert sich jedoch auch nix.

P.S. Danke der schnellen Antwort

Wombatz
11.06.2011, 12:16
Das Programm von die funktioniert!!!

Vielen Dank für die schnellen Antworten!

Gruß WOMBATZ

radbruch
11.06.2011, 12:28
Prima.

So könnte man testen, ob die Schleife überhaupt betreten wird, wenn schon zu Beginn die Abbruchbedingung erfüllt ist:


#include "asuro.h"

int main(void)
{
unsigned int i;

Init(); // StatusLED ist grün nach Init()

for (i=0;i>255;i++)
{
StatusLED(YELLOW); // Schleife wurde betreten
break;
}

for (i=0;i>255;i++)
{
break;
StatusLED(RED); // Schleife wurde durch break NICHT verlassen!
}

for (i=0;i>255;i++)
{
Break(255); //erzeugt eine Kompilerwarnung!
}

while(1);
return(0);
}(ebenfalls ungetestet)

Weiterhin viel Spass mit deinem asuro.

mic