willkommen im RN
also while ist schon richtig, while true und mit jedem erreichen des letzten Befehls springt der Prozessor wieder an den Anfang der Schleife zurück.
Ich begrüße alle hier im RoboterNetz.
Derzeit besuche ich eine Fachschule um dort meinen Automatisierungstechniker zu absolvieren. Darum habe ich mir einen ASURO gekauft um tiefer in die Elektronik und vor allem in C einzutauchen.
Was die Elektronik angeht habe ich keine Probleme gehabt den ASURO aufzubauen, da dies auch mein ursprünglicher Beruf ist. Aber von C habe ich keine Ahnung da dies komplett Neuland ist![]()
Nun mein Problem am Anfang, ich habe ein Programm genommen welches auch in der Anleitung beschrieben steht und dies ein wenig abgeändert, denn ich will das der ASURO geradeaus fährt bis er irgendwo aneckt. Dann soll sich das rechte Rad rückwärts drehen (am besten das sich ASURO um 90° dreht) und dann soll er wieder an den Anfang des Programms springen und das ganze geht von vorn los bis er wieder Aneckt.
Wie bekomme ich das geschrieben das er sich um 90° dreht und wie ist der Befehl dazu das er das Programm von vorn beginnt?
Ich hoffe ihr könnt mir weiterhelfen. Vielen Dank schon mal im vorraus.
Code:#include "asuro.h" int main(void) { Init(); MotorDir(FWD,FWD); MotorSpeed(100,100); StatusLED(GREEN); while (PollSwitch()==0) { SerWrite("Vorwärts!\n",10); } MotorSpeed(0,0); StatusLED(RED); BackLED(ON,ON); while(1) { SerWrite("Angeeckt, drehung um 90°\n",5); MotorDir(RWD,RWD); MotorSpeed(0,100); } return(0); }
willkommen im RN
also while ist schon richtig, while true und mit jedem erreichen des letzten Befehls springt der Prozessor wieder an den Anfang der Schleife zurück.
Mit hochohmigen Grüßen
Virus
Es lebe der Digitalkäse !
Hey, danke für deine schnelle Hilfe.
Willst du mir jetzt damit sagen das ich im letzten Abschnitt statt while(1) --> while true schreiben soll?
Weil wenn dann muss doch noch irgendein Befehl rein wann er zurückspringen soll, also am besten nachdem er die 90° Drehung gemacht hat!
Moin!
while(1) stimmt schon.. die schleife wird dann ewig wiederholt.
Zum rest kann ich leider nichts sagen da ich die verwendeten funktionen nicht kenn..
while(...) wird solange wiederholt, wie die Bedingung in den Klammern wahr (true) ist. In C ist das der Fall, wenn der Ausdruck z.b nicht 0 ist.
Die While zu verlassen geht mit 2 Möglichkeiten: Die While-Bedingung mit einer Variable machen, die du vor dem Verlassen auf wahr setzt:
while(x)
{
}
Solange x irgendwas anderes als 0 ist, dann bleibt er drin. Setzt du x 0, stimmt die Bedingung nicht mehr: Schleife wird verlassen.
Andere Möglichkeit: Befehl break; in der Schleife für sofortiges Verlassen.
#ifndef MfG
#define MfG
Danke danke für die Hilfen, da werd ich doch gleich nochmal ein wenig herumprobieren.
So, nach längerem hin und her überlegen sieht mein Programm jetzt so aus:
Ich habe mir dabei gedacht das ich eine Zählerschleife setze welche anfängt zu zählen sobald ASURO irgendwo aneeckt, und wenn sie zB 2 erreicht, aus der for Bedingung raus springt und x=0 setzt. Was zur Folge hat das auch die Rückwärts fahren Schleife nicht mehr wahr ist und das ganze Programm von oben wieder neu abgearbeitet wird!Code:#include "asuro.h" int zaehler; char x=1; int main(void) { Init(); MotorDir(FWD,FWD); MotorSpeed(150,150); StatusLED(GREEN); while (PollSwitch()==0) { SerWrite("Vorwärts!\n",11); } StatusLED(RED); BackLED(ON,ON); while (x) { for(zaehler=0;zaehler<2;zaehler++) { SerWrite("Angeeckt, drehung um 90°\n",26); MotorDir(RWD,RWD); MotorSpeed(0,150); } x=0; } return(0); }
Warum funktioniert das beenden der Rückfahr Bedingung nicht?
Es klappt bis dahin das ASURO fährt, irgendwo aneeckt. Und dann dreht sich ASURO ewig Rückwärts im Kreis!
Du setzt hier x zwar 0, aber x bleibt dann auch 0. Es wird nirgendwo mehr auf 1 o.ä. gesetzt.
Zudem fehlt "aussen rum" noch ne while(1) um den Teil, der immer wiederholt werden soll... d.h. die while(x) wird nur ein einziges Mal abgearbeitet. Danach folgt das "return 0"; was der Controller da dann macht... hm gute Frage... was eigentlich?
Endlosschleife? "Irgendwas" was grad so im Flash rumliegt?
#ifndef MfG
#define MfG
genau, um alles muss ein while(1) und um eine bestimmte zeit rückwärts zu fahren,bzw. zu drehen gibt es zwei möglichkeiten: sleep oder odometrie
das ist im forum schon an verschiedenen stellen erklärt, einfach mal suchen.
gruß josua
So ich hab es jetzt nach langem probieren hin bekommen. Mein Programm sieht jetzt so aus:
Allerdings Funktioniert es nicht so wie ich es mir Vorgestellt habe. Denn wenn ich PollSwitch()>0 Eingebe macht das Programm was es will und wenn ich >1 Eingebe Funktioniert es ganz gut, aber ich nehme ja den rechten Kollisionsschalter aus dem rennen da ich ja größer 1 vorgebe und ab und zu während des gerade ausfahren verhält sich das Programm so wie während einer Kollision.Code:#include "asuro.h" int main (void) { Init(); int p; while(1){ MotorDir(FWD,FWD); MotorSpeed(125,125); if(PollSwitch()>0) //wenn ich hier 1 eingebe tritt der Fehler { //trotzdem ab und an auf! MotorDir(RWD,RWD); MotorSpeed(125,125); for(p=0;p<300;p++) {Sleep(72);} MotorDir(BREAK,RWD); MotorSpeed(0,125); for(p=0;p<1000;p++) {Sleep(72);} } } while(1){} return 0; }
Woran kann es liegen? Und wie oder was muss ich evtl. verändern damit ich PollSwitch()>0 Einstellen kann und es so einwandfrei Funktioniert das der ASURO wirklich nur während einer Kollission mit irgend einem der Schalter das restliche Programm ausführt und nicht wann er will![]()
Lesezeichen