Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro fahre 1Sekunde zurück
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!!!
Das heißt nicht Break(255); sondern Sleep(255)
Selbst mit Sleep funktionier das nicht.
radbruch
11.06.2011, 12: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
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
Das Programm von die funktioniert!!!
Vielen Dank für die schnellen Antworten!
Gruß WOMBATZ
radbruch
11.06.2011, 13: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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.