Hallo,
also mir gefällt deine Funktion erwarten nicht ...
Ich würde sagen das muss ein int sein, aber da bin ich mir nicht sicher ...
Hallo
Ich hab meinen Asuro ROLF genannt ^^
Ich bin momentan dabei, ihn etwas leben einzuhauchen indem ich erm selbständig irgenetwas machen lasse, aber da das ganze noch in seinem anfangsstadium ist... und ich erst seit kurzem in C programmiere... ist mein Quellcode auch dementsprechend schlecht ^^
Ich möchte alles in funktionen aufteilen, die ich abrufen kann wann mir gerade lustig ist. Ich möchte auch später einen zufallsgenerator einbaun, der diese funktionen zu unterschiedlichen zeiten und zu unterschiedlichen längen ausführt. Um etwas Leben einzubringen ^^
Somit habe ich angefangen eine funktion zu schreiben die es Rolf erlaubt eine gewisse zeit auf Kollisionskurs zu gehen... nur scheinbar gibt es probleme mit der forschleife die kontrolliert, ob rolf noch rumspielen darf...
Der Wartemode (led rumblinken lassen) funktioniert noch![]()
Vielleicht kann ich auch keine funktionen in funktionen einbinden, wie gesagt, kenn mich in C überhaupt nicht aus ^^
Hier ersteinmal der Code:
Würde mich für Ratschläge wirklich freuen... da ich glaube auf keinen gescheiten Pfad zu kommen ^^Code:#include "asuro.h" void erwarten(unsigned char male); //Rufe Wartemodus ab void collusion(unsigned int lang); //Rufe Collusion ab int main(void) { Init(); //Ab hier beginnt Rolf zu "Leben" //Morgenmassage senden SerPrint("\r\nMuah... muss ich aufstehen?\r\n"); //Rolf wartet erstmal ab erwarten(1); //Rolf startet Kollusionsfahrt collusion(10000); return 0; } //Funktionen //Rolf wartet auf etwas void erwarten(unsigned char male) { unsigned int i; for (i = 0; i <= male; i++) { Msleep(500); StatusLED(GREEN); Msleep(10); BackLED (OFF, ON); Msleep(500); StatusLED(OFF); Msleep(10); BackLED (ON, OFF); Msleep(500); BackLED (OFF, ON); Msleep(500); BackLED (ON, OFF); if (i == male) BackLED (OFF, OFF); //Schalte Alles ab wenn am ende } } //Rolf vorwaerts void FWARD(void) { FrontLED (ON); //Kuendige Anfahren an Msleep(300); FrontLED (OFF); Msleep(150); FrontLED (ON); Msleep(300); FrontLED (OFF); MotorDir(FWD,RWD); //Beide Motoren vorwaerts MotorSpeed(150,150); //Los gehts } //Rolf rueckwaerts void RWARD(void) { MotorDir(RWD,FWD); //Beide Motoren rueckwearts MotorSpeed(120,120); //Los gehts } //Rolf rueckwaerts links void RWDL(void) { MotorDir(RWD,FWD); //Beide Motoren rueckwearts MotorSpeed(120,0); //Los gehts } //Rolf rueckwaerts rechts void RWDR(void) { MotorDir(RWD,FWD); //Beide Motoren rueckwearts MotorSpeed(0,120); //Los gehts } //Rolf stoppen void STOP(void) { MotorSpeed(0,0); } //Rolf kollusionsprogramm void collusion(unsigned int lang) { unsigned char t1, t2; unsigned long zeit; t1 = PollSwitch(); t2 = PollSwitch(); for (zeit = Gettime(); zeit > zeit + lang;) { if (t1 == 0 && t2 == 0) //Keine Taste gedrueckt, Rolf feahrt vorwaerts { FWARD(); //Auf gehts } else if (t1 && t2 && t1 == t2) { STOP(); //Stoppen if (t1 & 0x07) //Linke tasten beruehrt { RWDL(); //LinksRueckwaerts ausweichen } if (t1 & 0x38) //Rechte tasten beruehrt { RWDR(); //RechtsRueckwearts ausweichen } Msleep(1000); //Eine Sekunde rueckwarts fahren } } }
Mit freundlichen Güßen
Hardy
Hallo,
also mir gefällt deine Funktion erwarten nicht ...
Ich würde sagen das muss ein int sein, aber da bin ich mir nicht sicher ...
nun ja, die funktion erwarten funktioniert ja... is doch egal wie man eine variabel deklariert... solangs nurn paar zahlen sind oder? schwieriger wirds wenn buchstaben oder zahlen in einer bestimmten länge dazukommen.
Nur die collusions funktion funtkioniert nicht![]()
Hallo Hardest,
Mein deutsch is leider nicht so gut. Aber ich habe nicht verstanden was das problem ist. Also was tut deiner 'Rolf' denn nicht was tun soll. Was erwartest du von ihnen wenn du siest das Rolf nicht mehr die 'Erwarten' funktion ablauft. Fährt er nun gerade aus und stoßt irgend etwas an? Was macht er? Gerne ein genaue beschreibung.
Jedenfalls muß dus mal die FWARD und RWARD funktionen anschauen:Drehen die räder nicht gegeneinander in? Öder hast du die motoren falsch angelöted?void RWARD(void)
{
MotorDir(RWD,FWD); //Beide Motoren rueckwearts
MotorSpeed(120,120); //Los gehts
}
Hi
Die erwarten funktion funktioniert... nur darauf soll er die void collusion(unsigned int lang) aufrufen... jedoch passiert rein gar nichts... er fährt nicht los
Richtig, scheinbar hab ich die Rädermotoren falsch angelötet ^^
EDIT:
Dein Deutsch ist gut![]()
Hallo wieder,
Ich denke dat is verstehe warum deine Rolf 'hängt'. Ich muß mall erkennen das ich auch wenig oder eigentlich keine schreib-erfarung habe mit C. Doch lesen geht schön bei mir.
Deine for-schleife in die collusion funktion kan nicht weiter gehen weil die zeit nicht hochgezählt wurde.
Sehe mall an wie die For-schleife in die Asuro manual beschrieben wird (bei mir auf seite 61; englisher version):Code:void collusion(unsigned int lang) { unsigned char t1, t2; unsigned long zeit; t1 = PollSwitch(); t2 = PollSwitch(); for (zeit = Gettime(); zeit > zeit + lang; ETWAS VERGESSEN ) ...
for (i = 0; i < n; i++)
Hallo Hardest,
das Problem liegt in Deiner for-Schleife begraben.
Die For-Schleife wird solange ausgeführt, wir die angegebene Bedingung erfüllt ist. Deine Bedingung
zeit > zeit + lang
ist nun aber leider NIE erfüllt, da immer gilt
zeit == zeit.
Wenn Du also - wie ich vermute - die Schleife solange ausführen willst, bis die als Parameter in die Funktion übergebene Zeitspanne überschritten ist mußt zum Beispiel folgende Konstruktion verwenden:
Es gibt aber - wie immer - sicherlich noch 2 Milliarden andere Lösungsmöglichkeiten.Code:[...] unsigned long startzeit = Gettime(); for ( zeit = Gettime(); zeit < startzeit + lang;) { [...] }![]()
Mag sein, dass es da noch weitere Probleme gibt, aber ich hab's nur überflogen.
Gruß
Burkhard
Gruß
Buggie
Das wohlüberlegte Treffen von Entscheidungen folgt einer alten Tradition: Zuerst raten und danach die anderen dafür verantwortlich machen.
Scott Adams
Ich meine was Buggie schreibt
Danke ihr beiden ^^
Werde die for-schleife dementsprechend ausbessern und abwarten was bassiert![]()
Sorry, das habe ich natürlich auch übersehen. Du musst natürlich an zeit bei jedem Durchlauf einen neuen Wert zuweisen, also anstelle des Inkrements in Valens Beispiel wieder zeit = Gettime().Zitat von Valen
Insgesamt wäre hier wahrscheinlich eine while-Schleife sinnvoller. Die for-Schleife wird traditionell angewandt, wenn man eine bestimmte Anzahl Durchläufe benötigt![]()
Du möchtest aber die Schleife ausführen, solange eine Bedingung erfüllt ist.
In der Hoffnung, Dich nicht verwirrt zu haben noch viel Spass!Code:[...] unsigned int startzeit = Gettime(); while ( Gettime() < startzeit + lang ) { [...] }
Gruß
Buggie
Gruß
Buggie
Das wohlüberlegte Treffen von Entscheidungen folgt einer alten Tradition: Zuerst raten und danach die anderen dafür verantwortlich machen.
Scott Adams
Lesezeichen