PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sleep Funktion



giftzwerg95
11.02.2010, 20:52
Hallo
Ich bin grade dabei die Grundsachen von der Programmier Sprache C zu lernen. Ich hab hier einen Quelletext der bewirken soll das wenn mein Asuro gegen etwas fährt, zurück seztz. Leider macht er das nicht. Bitte helft mir!!


#include "asuro.h"

int main(void)
{


Init();
unsigned char taste;
int i;

StatusLED(OFF);
MotorDir(FWD,FWD);

while(1){
taste=PollSwitch();

if(taste>0){
MotorDir(RWD,RWD);
MotorSpeed(100,100);
for(i=0;i<300;i++)
Sleep(10);
MotorDir(BREAK,RWD);
MotorSpeed(0,125);
for(i=0;i<1000;i++)
Sleep(10);

StatusLED(RED);

}

else{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
}
return 0;
}

Gruß giftzwerg

PS: Er macht das was bei "if" steht

Jaecko
11.02.2010, 21:10
Tip für dich wenn du gerade beim Anfangen bist:
Gewöhn dir gleich das richtige Einrücken an. Machts für dich und auch andere viel leichter, den Code zu lesen. Auch wenn z.B. bei ner if oder for nur ein Kommando kommt: Sicherheitshalber { } drum rum. Aus deinem Code sieht man z.B. nicht eindeutig, was alles zu den for(...) gehört. Nur das Sleep? Oder auch die Motor-Sachen?

Ich nehm mal an, dass das ganze so gehört:


#include "asuro.h"

int main(void)
{

Init();
unsigned char taste;
int i;

StatusLED(OFF);
MotorDir(FWD,FWD);

while(1)
{
taste=PollSwitch();
if(taste>0)
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
for(i=0;i<300;i++)
{
Sleep(10);
}
MotorDir(BREAK,RWD);
MotorSpeed(0,125);
for(i=0;i<1000;i++)
{
Sleep(10);
}
StatusLED(RED);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
}
return 0;
}


Und macht er hier jetzt das im if-Zweig oder im else-Zweig?
Oder anders gefragt: Wie bewegt er sich?

giftzwerg95
11.02.2010, 21:25
Also er macht das was im if-Zweig steht. Ich hab das mit der for -Schleife so verstanden das zuerst kommt was er ausführen soll und dann die for-Schleife. Ich habe das Sleep dort eingebaut weil das bei vielen anderen Ouelltexten dort so stand und weil es anders auch nicht ging.

Valen
11.02.2010, 22:28
Nein, es ist wie:



for(i=0;i<300;i++)
{
Sleep(10);
} 300 mal Sleep(10);

Nur das was zwischen {} steht wirdt ausgefuhrt, oder wen 's keine gibt, die einzige commando/stellung vorne von den ;


for(i=0;i<5;i++);
5 mal nichts. Das heisst, nur i hochzählen bei jede durchlauf.


for(i=0;i<10;i++) Sleep(10); 10 mal Sleep(10)

Jaecko
11.02.2010, 22:40
for(i=0;i<5;i++);
fliegt sogar je nach Intelligenz/Einstellung des Compilers raus.
Wenn z.B. erkannt wird, dass ja mit dem hochgezählten i nix gemacht wird... wozu dann hochzählen => weg damit.
(ausser i ist volatile, dann wird trotzdem gezählt)

Valen
11.02.2010, 22:48
for(i=0;i<5;i++); ist nur als theoretisches beispiel gemeint. Imprizip sollte der compiler einfach compilieren was geschrieben ist, ob es sinn macht oder nicht. Aber die codeoptimalisierung steht bei die meiste schon an.

giftzwerg95
12.02.2010, 14:33
also muss ich das so schreiben



#include "asuro.h"

int main(void)
{


Init();
unsigned char taste;
int i;

StatusLED(OFF);
MotorDir(FWD,FWD);

while(1){
taste=PollSwitch();

if(taste>0){
for(i=0;i<300;i++){
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Sleep(10); }
for(i=0;i<1000;i++){
MotorDir(BREAK,RWD);
MotorSpeed(0,125);
Sleep(10); }

StatusLED(RED);

}

else{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
}
return 0;
}

Valen
12.02.2010, 19:26
Nein, die MotorDir und MotorSpeed mussen im vorne von dem for(i=0;i<300;i++) und for(i=0;i<1000;i++) geschrieben werden. In deine code wird das 300 mal und 1000 wieder neu eingestellt. Das tut kein weh, aber nur einmal reichts.


#include "asuro.h"

int main(void)
{


Init();
unsigned char taste;
int i;

StatusLED(OFF);
MotorDir(FWD,FWD);

while(1){
taste=PollSwitch();

if(taste>0){
MotorDir(RWD,RWD); /* nur ein mal drehrichtung einstellen */
MotorSpeed(100,100); /* nur ein mal geschwindigkeit einstellen */
for(i=0;i<300;i++){ /* 300 mal ... */
Sleep(10); } /* ... 10/36000 sekunden warten */

/* 3000/36000=1/12 sekunde später nach die letzte Motorspeed */

MotorDir(BREAK,RWD); /* nur ein mal drehrichtung einstellen */
MotorSpeed(0,125); /* nur ein mal geschwindigkeit einstellen */
for(i=0;i<1000;i++){ /* 1000 mal ... */
Sleep(10); } /* ... 10/36000 sekunden warten */

/* 10000/36000 = 1/3.6 sekunden später nach die letzte MotorSpeed(0,125) */


StatusLED(RED);
} /* ende if: irgend einer 'taster' bemerkt */

else {
MotorDir(FWD,FWD);
MotorSpeed(200,200); } /* ende else: kein taster */

} /* ende while(1), sollte er nicht passieren */

return 0;
}

giftzwerg95
12.02.2010, 20:32
leider macht er immer noch das was in dem if-Zweig steht. Es kann aber nicht an den tastern liegen, da beim Selftstest alles okay ist.

Valen
12.02.2010, 21:38
Könnte doch an dem taster liegen. Oder eigentlich an dem motoren. PollSwitch wird einfach die falsche wert geben wenn es mit drehende motoren angerufen wirdt. Es ist etwas störungsempfindlich.

Bitte versuch das mit:


#include "asuro.h"

int main(void)
{


Init();
unsigned char taste;
int i;

StatusLED(OFF);
MotorDir(FWD,FWD);

while(1){
taste=PollSwitch();

if(taste==PollSwitch()){ /* Alte tastermessung vergleichen mit neue; nicht gleich den warscheinlich nicht angeprellt */
Statusled(RED); /* Boem!, gehe im ruckfahrt */
MotorDir(RWD,RWD); /* nur ein mal drehrichtung einstellen */
MotorSpeed(100,100); /* nur ein mal geschwindigkeit einstellen */
for(i=0;i<300;i++){ /* 300 mal ... */
Sleep(10); } /* ... 10/36000 sekunden warten */

/* 3000/36000=1/12 sekunde später nach die letzte Motorspeed */

MotorDir(BREAK,RWD); /* nur ein mal drehrichtung einstellen */
MotorSpeed(0,125); /* nur ein mal geschwindigkeit einstellen */
for(i=0;i<1000;i++){ /* 1000 mal ... */
Sleep(10); } /* ... 10/36000 sekunden warten */

/* 10000/36000 = 1/3.6 sekunden später nach die letzte MotorSpeed(0,125) */


StatusLED(OFF); /* Fertig mit ruckfahrt */

} /* ende if: irgend einer 'taster' bemerkt */

else {
StatusLED(GREEN); /* Alles gut, gehe vorraus. */
MotorDir(FWD,FWD);
MotorSpeed(200,200);
for(i=0;i<300;i++){ /* 300 mal ... */
Sleep(10); } /* ... 10/36000 sekunden warten */
/* sonnst könntest du die grünne led kaum aufmerken */

} /* ende else: kein taster, las StatusLED grün */

} /* ende while(1), sollte er nicht passieren */

return 0;
}

Dazu noch einer tip. Du schaltest die Statusled ab am start deines program. Am ende von der ruckfahrt (beim eingeprellte tastern) setzt du es auf rot. Aber es geht nie wieder aus oder auf grun. Wurde es nicht besser sein wann Asuro dich erzählst wan er mit den ruckfärht beschäftigt (statusled rot), und wan er versucht weiter zu fahren (statusled grün). Dan kannst du auch sehen ob er ein 'pfantom'-taster bemerkt hat.
Du könntest es auch erweiteren mit den BackLEDs, womit du den 2 fasen von den ruckfährt deutlich macht. Habe das schon in den code eingefugt.