PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Länger zurückfahren



Lync
22.07.2007, 21:32
Hab heute meinen asuro zusammengbaut und wollte dann dieses Programm schreiben:

#include "asuro.h"

int main(void)
{
Init();
MotorSpeed(0,255);
FrontLED(ON);
while(1)
{
if (PollSwitch()==0)
{
MotorDir(FWD,FWD);
BackLED(ON,ON);
StatusLED(GREEN);
}
else
{
MotorDir(RWD,RWD);
BackLED(OFF,OFF);
StatusLED(RED);
}
}
}


aber jetzt soll er ja nicht nur solange rückwärts fahren bis der Taster nicht mwhr gedrückt wird sondern noch für ein paar Sekunden länger.
Hab schon in der Anleitung nachgeschaut aber nicht gefunden wie ich das mache.

Mr.Roboto
23.07.2007, 10:11
Grüß dich,

du musst da eine ZeitVerzögerung einbauen, was beseutet, dass wärend der zeit der uC nichts macht, aber seine Ausgänge noch geschaltet bleiben, wie sie vor der ZeitVerzögerung waren.
Schreib einfach hinter MotorDir(RWD,RWD); Msleep(1000); ->das bewirkt, dass der uC für 1000ms also 1s wartet und er somit 1s rückwerts fährt.

Die Funktion Msleep() ist keine Standardfunktion, sie basiert aus Sleep() kannst ja mal beides Nachschlagen, bei Sleep musst du nur beachten, dass z.B.: Sleep(216) 3ms sind, warum das so ist kannste nachlesen.


MfG Mr.Roboto

damaltor
23.07.2007, 10:27
ich bing eigentlich recht überzeugt dass Sleep() in der anleitung drinsteht... wirklich nachlesen!!

Mr.Roboto
23.07.2007, 10:32
ja klar, Sleep() ist drin, aber Msleep() nicht, das is doch ne hinzugefügt Funktion, damit man nicht immer tausende Schleifen die die Sleep()-Funktion für z.B. 1000x1ms aufrufen schreiben muss. sondern nur eine Zeile hat.

Lync
23.07.2007, 18:42
Thx

Ja es stimmt, Sleep steht wirklich in der Anleitung, habs wohl mehrmals überlesen ^^.

Noss
23.07.2007, 19:32
so hab mal probiert ein programm zu schreiben aber es klappt irgendwie nicht so richtig kann mir mal eben wer helfen wenns am asuro ist wartet er dann nämlich nicht :(


#include "asuro.h" // NoHit


int main(void)
{
char message[]="Asuro starting NoHit\n";
char message1[]=".";
char message2[]="R";
char message3[]="L";
char message4[]="B";
Init();
MotorDir(FWD,FWD);
MotorSpeed(255,255);
FrontLED(ON);
SerWrite(message,sizeof(message));
while(1)
{
if(PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(ON,ON);
StatusLED(GREEN);
SerWrite(message1,sizeof(message1));
}
else
{
if(PollSwitch()<=7)
{
MotorDir(RWD,FWD);
MotorSpeed(255,255);
StatusLED(YELLOW);
BackLED(OFF,ON);
SerWrite(message2,sizeof(message2));
Sleep(72*5000);
}
else if(PollSwitch()==8||PollSwitch()==16||PollSwitch() ==32)
{
MotorDir(FWD,RWD);
MotorSpeed(255,255);
StatusLED(YELLOW);
BackLED(ON,OFF);
SerWrite(message3,sizeof(message3));
Sleep(72*5000);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
StatusLED(RED);
BackLED(OFF,OFF);
SerWrite(message4,sizeof(message4));
Sleep(72*5000);
}
}
}
}



EDIT V0.2 klappt auch ned :

#include "asuro.h" // NoHit


int main(void)
{
char message[]="Asuro starting NoHit\n";
char message1[]=".";
char message2[]="R";
char message3[]="L";
char message4[]="B";
int sleep;
Init();
MotorDir(FWD,FWD);
MotorSpeed(255,255);
FrontLED(ON);
SerWrite(message,sizeof(message));
while(1)
{
if(PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(ON,ON);
StatusLED(GREEN);
SerWrite(message1,sizeof(message1));
}
else
{
if(PollSwitch()<=7)
{
MotorDir(RWD,FWD);
MotorSpeed(255,255);
StatusLED(YELLOW);
BackLED(OFF,ON);
SerWrite(message2,sizeof(message2));
for(sleep=0;sleep<2000;sleep++)
Sleep(72);
}
else if(PollSwitch()==8||PollSwitch()==16||PollSwitch() ==32)
{
MotorDir(FWD,RWD);
MotorSpeed(255,255);
StatusLED(YELLOW);
BackLED(ON,OFF);
SerWrite(message3,sizeof(message3));
for(sleep=0;sleep<2000;sleep++)
Sleep(72);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
StatusLED(RED);
BackLED(OFF,OFF);
SerWrite(message4,sizeof(message4));
for(sleep=0;sleep<2000;sleep++)
Sleep(72);
}
}
}
}

Lync
23.07.2007, 20:02
@so gehts

#include "asuro.h" // NoHit


int main(void)
{
char message[]="Asuro starting NoHit\n";
char message1[]=".";
char message2[]="R";
char message3[]="L";
char message4[]="B";
int sleep;
int a;
int e;
Init();
MotorDir(FWD,FWD);
MotorSpeed(255,255);
FrontLED(ON);
SerWrite(message,sizeof(message));
while(1)
{
if(PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(ON,ON);
StatusLED(GREEN);
SerWrite(message1,sizeof(message1));
}
else
{
if(PollSwitch()<=7)
{
MotorDir(RWD,FWD);
MotorSpeed(255,255);
StatusLED(YELLOW);
BackLED(OFF,ON);
SerWrite(message2,sizeof(message2));
for(sleep=0;sleep<2000;sleep++)
{Sleep(72);}
}
else if(PollSwitch()==8||PollSwitch()==16||PollSwitch() ==32)
{
MotorDir(FWD,RWD);
MotorSpeed(255,255);
StatusLED(YELLOW);
BackLED(ON,OFF);
SerWrite(message3,sizeof(message3));
for(a=0;a<2000;a++)
{Sleep(72);}
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
StatusLED(RED);
BackLED(OFF,OFF);
SerWrite(message4,sizeof(message4));
for(e=0;e<2000;e++)
{Sleep(72);}
}
}
}
}


Also für den Inhalt der for schleifen immer ein { davor und ein } dannach.
Und mehrere Variablen verwenden.

Mr.Roboto
24.07.2007, 15:50
for(e=0;e<2000;e++)
{Sleep(72);}
--------------------------------
schreib das mal anders, das ist nisht sehr übersichtlich.

schreib lieber for(e=0;e<2000;e++)
{
Sleep(72);
}
ODER wenn nur eine Anweisung in der for-schleife steht kannst du die klammern auch weglassen, weil der compiler, nur die nächste zeile nach der for-Schleife als auszuführenden code betrachtet. Ich würde aber Variante 1 benutzen

Noss
24.07.2007, 16:48
ich hatte es ja ohne die {...} sondern die nächste zeile das hat aber irgendwie nicht geklappt

merkwürdig fiunde ich das e++ das gibt es doch in ansi C nicht sondern erst in c++ ??? warum ist es da verfügbar kann man dann auch OOP coden Klassen etc.?

damaltor
24.07.2007, 17:20
e++ geht auch in ansi c, das ist nur zur namensgebungvon c++ geworden... das passt schon. zumindest sind die compiler mittlerweile großzügig genug =)

und so kleine anweisungen kann mal so schreiben:

for(e=0;e<2000;e++) Sleep(72);

Noss
24.07.2007, 17:22
ja das man das so schreiben kann ist mir schon klar ich kann ja auch schon c/c++/C#/Php aber mein Asuro wollte es nur mit klammersetzung Oo naja die compiler haben sich wohl angepasse e=e+1; ist ja zach :D kann man in C bei AvrGcc dann auch c*=3; schreiben?

Sternthaler
24.07.2007, 17:42
Hallo Noss,
du kannst alle Rechenarten mit der Kurzform schreiben:
x += 5;
x -= 5;
x *= 5;
x /= 5;
Aber auch:
x ^= 5;

Was manchmal zu erstaunlichen Reaktionen führt ist folgendes:
1: x = variable++;
2: x = ++variable;
Bei 1: wird ERST variable in x gespeichert UND DANN variable um 1 erhöht.
Bei 2: wird ERST um 1 erhöht und dann nach x gespeichert.

Lustig wird es dann bei Code á la:
variable [zeiger++] = anderevariable [--zeiger];
oder
variable [zeiger += 4] = anderevariable [++zeiger -= 2];

Die Kurzformen gibt es schon seit ich in C programmiere. Also bestimmt schon seit 20 Jahren.

Noss
24.07.2007, 17:44
ok, hab mich dann wohldarin gehend geirrt
kurzformen und postfi und präfix musst mir ned erklären :d
benutz ich immer aber ich hab halt erst c++ gelernt und c erstn nachgelernt

damaltor
24.07.2007, 20:39
was ansi c halt fehlt sind streams und klassendefinitionen... ich habe gerade ein 3000-zeilen programm für berechnung von komplexewertigen matrizen, vektoren und zahlen geschrieben. da sind klassendefinitionn schon hilfreich =)