PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe Programm



Martinius11
26.10.2009, 11:51
Ich habe ein Problem mit einem selbst geschriebenen Übungsprogramm.
eigentlich solte mein ich einen Schalter drücke ein Motor ausschalten und sich
die Status Anzeigen verändern. Könnt ihr mal schauen wo das Problemm liegt und es mir erklären.

danke im Vorraus. ; )




#include "asuro.h"

int main(void)
{
Init();
MotorDir(FWD,FWD);
MotorSpeed(250,250);
StatusLED(GREEN);
FrontLED(OFF);
BackLED(OFF,OFF);
{

while (PollSwitch()==0)
{
{
MotorDir(FWD,FWD);
MotorSpeed(200,0);
StatusLED(YELLOW);
FrontLED(OFF);
Sleep(255);
BackLED(ON,ON);
while(1);
}
}
}
while(1);
return 0;
}

Hubert.G
26.10.2009, 13:00
Was macht dein Programm?

listner
26.10.2009, 13:05
hey;)
so sollte es funktionieren !!!
hast n par while zu viel drin ;)


#include "asuro.h"

int main(void)
{
Init();

while (1)
{
if (POllswitch==0){
MotorDir(FWD,FWD);
MotorSpeed(200,0);
StatusLED(YELLOW);
FrontLED(OFF);
Sleep(255);
BackLED(ON,ON);
}

else{
MotorDir(FWD,FWD);
MotorSpeed(250,250);
StatusLED(GREEN);
FrontLED(OFF);
BackLED(OFF,OFF);
}

}

return 0;
}

Martinius11
26.10.2009, 13:13
Was macht dein Programm?

es soll nur mit einem Rad fahren wenn ein Taster gedrückt ist .

Martinius11
26.10.2009, 13:18
hey;)
so sollte es funktionieren !!!
hast n par while zu viel drin ;)


#include "asuro.h"

int main(void)
{
Init();

while (1)
{
if (POllswitch==0){
MotorDir(FWD,FWD);
MotorSpeed(200,0);
StatusLED(YELLOW);
FrontLED(OFF);
Sleep(255);
BackLED(ON,ON);
}

else{
MotorDir(FWD,FWD);
MotorSpeed(250,250);
StatusLED(GREEN);
FrontLED(OFF);
BackLED(OFF,OFF);
}

}

return 0;
}





Es ist mir schon klar das ich einfach if nehmen könnte aber ich übe
mich gerade mit dem Programmieren und im übungsheft des Asuros Steht
ein Programm und ich wolte nach dessen Vor bild ein Programm schreiben .


Hier ist mal das Programm : (Danke das du dich bemüht hast )



9.1.5. Schleifen
Schleifen dienen dazu, Anweisungen mehrmals auszuführen.
In der “while”-Schleife wird eine Bedingung ausgewertet. Ist die Bedingung wahr, so wird der
Anweisungsblock ausgeführt und die Bedingung erneut geprüft, bis diese falsch wird. Dannach
wird das Programm hinter dem Anweisungsblock fortgesetzt.
while( Bedingung)
Anweisungsblock
Beispiel:
#include “asuro.h”
int main(void) {
Init ()
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
MotorSpeed(120,120); // Beide Motoren etwa halbe Kraft voraus
StatusLED(GREEN); // Status-Leuchtdiode auf grün schalten
while (PollSwitch()==0) { // Solange keine Kollision erfolgte...
SerWrite(“Alles OK!\n”,10); // ... Euphorie verbreiten
}
MotorSpeed(0,0); // Kollision! Sofort anhalten!
StatusLED(RED); // Statusleuchtdiode rot schalten
while (1) {
SerWrite(“Aua!\n”,5); // und weinen!
}
}

Hubert.G
26.10.2009, 14:08
Ich wollte wissen was dein Programm macht, nicht was es machen soll.
Ich nehme mal an das es nicht auf die Taste reagiert.

Martinius11
26.10.2009, 14:28
Ich wollte wissen was dein Programm macht, nicht was es machen soll.
Ich nehme mal an das es nicht auf die Taste reagiert.

es ist so wenn ich die Taste von anfang die Taste drücke dreht nur ein Rad
und wenn nicht drehen beide räder und selbst wenn ich die Taste wider los
lasse dreht nur ein Rad undsonst reagiert er nicht auf tasten

Hubert.G
26.10.2009, 16:02
Damit hast du dir die Antwort ja schon selbst gegeben.
Du startest, die Motoren drehen, Taste nicht gedrückt, und damit läuft es in das letzte while und kann nicht mehr heraus.
Wenn du die Taste gedrückt hast, läuft nur ein Motor, dann wieder in das while usw.

#include "asuro.h"

int main(void)
{
Init();

while (1){
MotorDir(FWD,FWD);
MotorSpeed(250,250);
StatusLED(GREEN);
FrontLED(OFF);
BackLED(OFF,OFF);


while (PollSwitch()==0)
{
MotorDir(FWD,FWD);
MotorSpeed(200,0);
StatusLED(YELLOW);
FrontLED(OFF);
Sleep(255);
BackLED(ON,ON);
}
return 0;
}

Du musst die Programmteile so anlegen, das sie immer wieder durchlaufen werden.
Das if von "listner" finde ich besser lesbar.

Valen
26.10.2009, 16:22
Ich wollte wissen was dein Programm macht, nicht was es machen soll.
Ich nehme mal an das es nicht auf die Taste reagiert.

es ist so wenn ich die Taste von anfang die Taste drücke dreht nur ein Rad
und wenn nicht drehen beide räder und selbst wenn ich die Taste wider los
lasse dreht nur ein Rad undsonst reagiert er nicht auf tastenGennau

Von anfang an kriegt er das commando "volle fahrt voraus"

Wenn du von anfang einer taster eindruckt wird er nicht in dem ersten while-schleife gehen weil Pollswitch nicht gleich 0 ist. Aber dan kommt er in dem dritten while-schleife (am ende, gleich vor "return 0;" )wo er "immer nichts" macht. Also, geht er immer mit voller fahrt voraus.

Wenn du keiner taster eindruck gebt, geht er in die erste while-schleife. In diesen ersten while-schleife muss er forwärts fahren aber mit dem rechter motor im stillstand. Also geht er rund. Am ende diesen while-schleife steht noch einer 'immer nichts' while-schleife. (der zweite, aber auf einer niedriger niveau) Also bleibt er da immer stecken in seiner rundgang auf die stelle. Er reagiert auch nicht mehr auf einer spätere taster eindruck weil er beim "immer nichts" auch kein tastermessungen macht.

Listner hat dein program gut bearbeitet, leider nur mit ein schreibfehler ... das nicht compiliert wird. [-X ;)

Martinius11
26.10.2009, 17:19
also wenn ich will das er es öffters ausführt muss ich hinter return eine
größere Zahl setzen.
oder und listener hat wirklich gute ideen aber ich wills halt zur übung mit while for do etc. machen .

Grossen Dank an Alle ;)
euer Martinius

Valen
26.10.2009, 17:31
Nein,

"return 0" heist das die Main() funktion mit gute erfolg beendet wird. Jeder funktion (das nicht von typ "void" ist) muss einer wert zuruck geben an das program/funktion das es angerufen hat. Schau mal im asuro.c was PollSwitch mit dem "return" macht. Es ermittelt die taster wert. Bei microcontroller macht "return 0;" keinen sinn, weil sie nie enden söllen. Und es gibts keines uber-program das Main anruft. Den c-sprache verpflichts es aber.

Valen
26.10.2009, 17:42
#include "asuro.h"

int main(void)
{
Init();

While(1) /* immer ausfuhren */
{
MotorDir(FWD,FWD); /* von anfang: gerade aus mit voller fahrt */
MotorSpeed(250,250);
StatusLED(GREEN);
FrontLED(OFF);
BackLED(OFF,OFF);
Sleep(255); /* hier auch ein bisschen warten */

while (PollSwitch()!=0) /* runddrehen bei einem taster eindruck, "nicht gleich 0" */
{
MotorDir(FWD,FWD);
MotorSpeed(200,0);
StatusLED(YELLOW);
FrontLED(OFF);
Sleep(255);
BackLED(ON,ON);
}
}

return 0; /* söllte nie erreicht werden */
}

Muss Asuro aber nicht zuruck drehen wenn er irgend etwas von vorne anstosst?

Martinius11
26.10.2009, 17:44
eine Frage habe ich noch wenn ich dem asuro sagen möcht
MotorDir(FWD,FWD);
MotorSpeed(200,200);

MotorSpeed(0,0);

was muss zwichen MotorSpeed200 und Motorspeed0 das z. B. 3sek. fäht?

Virus
26.10.2009, 18:25
mit einem stopwatch

Valen
26.10.2009, 19:13
eine Frage habe ich noch wenn ich dem asuro sagen möcht
MotorDir(FWD,FWD);
MotorSpeed(200,200);

MotorSpeed(0,0);

was muss zwichen MotorSpeed200 und Motorspeed0 das z. B. 3sek. fäht?Wie lange dauert: Sleep(1);

Welcher wert muss man im Sleep(?); ergänzen fur einer bestimmte fraktion von einer sekunde?

Wie macht man einer loop mit bestimmte wiederholung?

Die erste 2 antworten kann man aus dem anleitung ableiten. Das letzte antwort kommt häufig zuruck hier im forum. :cheesy:

Martinius11
26.10.2009, 21:16
mit einem stopwatch

was ist eine stop wach und wie funktioniert die?

Martinius11
26.10.2009, 21:25
eine Frage habe ich noch wenn ich dem asuro sagen möcht
MotorDir(FWD,FWD);
MotorSpeed(200,200);

MotorSpeed(0,0);

was muss zwichen MotorSpeed200 und Motorspeed0 das z. B. 3sek. fäht?Wie lange dauert: Sleep(1);

Welcher wert muss man im Sleep(?); ergänzen fur einer bestimmte fraktion von einer sekunde?

Wie macht man einer loop mit bestimmte wiederholung?

Die erste 2 antworten kann man aus dem anleitung ableiten. Das letzte antwort kommt häufig zuruck hier im forum. :cheesy:


ich weis schon was sleep ist aber man kommt nur bis ca. 0,4 sec.
was wäre wenn ich schreiben würde


Sleep(200);
Sleep(200);
. . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
Sleep(200);

addiert sich somit die Wartezeit bis zur nächsten Funktion ?

Valen
26.10.2009, 22:16
Das ist einer wiederholung, aber nicht einer loop. Du möchtest doch das Asuro das automatisch macht, oder? Er wird nicht müde und kan kein Schreib-zucklung bekommen. (english: writing-cramps) Einer loop mit bestimmte durchlauf/wiederholung kann man mit einer for-schleife machen. (asuro anleitung: Kapitel 9.1.5 )

Martinius11
27.10.2009, 21:12
danke hat super geklappt ;)