-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Suche C Grundlagen hilfe

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.02.2010
    Ort
    L-Town
    Beiträge
    10

    Suche C Grundlagen hilfe

    Anzeige

    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);
    }

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von Virus
    Registriert seit
    15.09.2009
    Ort
    Duisburg
    Alter
    22
    Beiträge
    527
    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 !

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.02.2010
    Ort
    L-Town
    Beiträge
    10
    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!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.11.2005
    Ort
    Kiel
    Alter
    31
    Beiträge
    60
    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..

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.02.2010
    Ort
    L-Town
    Beiträge
    10
    Danke danke für die Hilfen, da werd ich doch gleich nochmal ein wenig herumprobieren.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.02.2010
    Ort
    L-Town
    Beiträge
    10
    So, nach längerem hin und her überlegen sieht mein Programm jetzt so aus:
    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);
    }
    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!
    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!

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.02.2010
    Ort
    irgendwo in BW
    Beiträge
    154
    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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    05.02.2010
    Ort
    L-Town
    Beiträge
    10
    So ich hab es jetzt nach langem probieren hin bekommen. Mein Programm sieht jetzt so aus:
    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; 
    }
    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.
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •