- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Fehler in meinem Programm?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2009
    Beiträge
    11

    Fehler in meinem Programm?

    Anzeige

    Praxistest und DIY Projekte
    Ich wollte meinen Roboter so Prgrammieren, dass er durch ein Labyrinth hindurch kommt. Mit dem Algorithmus der Tiefensuche ist das auch kein Problem. Aber irgendwie leuchtet nur die Status LED grün wenn ich den Roboter einschalte hier mein Code
    Code:
    include "asuro.h"
    
    
    #define FULL_L 220
    #define FULL_R 250
    
    /* vorwärts */
    void MotorFwd(void)
    {
      MotorDir(FWD,FWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    /* rückwärts */
    void MotorRwd(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* bremsen */
    void MotorStop(void)
    {
      MotorSpeed(0,0);
    }
    
    
    int main(void)
    {
    	unsigned char hit; 
    	
    
    	
    	while(1);
    	
    	{
    		hit = PollSwitch();
    	
    		if(hit == 0);
    		{
    			MotorFwd();
    		}
    		
    		if(hit == 32);				
    		{
    			MotorFwd();	
    		}
    		
    		if(hit == 33);
    		{
    			MotorDir(FWD,RWD);
    			MotorSpeed(FULL_L,FULL_R);
    		}	
    				
    		if(hit != 32);
    		{
    			MotorDir(FWD,RWD);
    			MotorSpeed(FULL_L,FULL_R);
    		}
    	}
    }
    Hab ich irgendwo einen Fehler gemacht?Der Anfang ist aus dem Test Programm. Ich will dass der Asuro nach links fährt und so Kontakt mit der Wand hat. Und dieser so folgt.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    33
    Beiträge
    239
    hallo
    du hast nach while(1) ein ";"!
    dadruch erzeugst du eine endlosschleife ohne befehle (wie am ende, um zu verhindern, dass er sich irgend wo im speicher verläuft)
    hier willst du aber, dass alles, das in den {} ist aufgeführt wird. daher musst du den ; entfernen

    vorher würde ich aber auch noch ein Init(); schreiben
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2009
    Beiträge
    11
    Oh stimmt, dass gehört da nicht hin... Jetzt funktionierts auch danke da hab ich etz 5 mal drübergelesen

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2009
    Beiträge
    5
    hallo!
    hab ein ähnliches problem! und zwar soll er eigentlich grade aus fahren und wenn er wo gegen fährt zurücksetzen sich ein bisschen drehen und wieder grade aus fahren. leider erkennt er ständig eine kollision auch wenn keine vorliegt, fährt dann mal 2 sekunden vorwärts und dann sofort wieder zurück obwohl keine kollision war... hier mein text:
    #include "asuro.h"

    int main(void)
    {
    Init();
    while(1)
    {
    if(PollSwitch()==0)
    {
    StatusLED(GREEN);
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    }
    else
    {
    StatusLED(RED);
    MotorDir(RWD,RWD);MotorSpeed(100,100);
    for(izaehler=0;izaehler<300;izaehler++){Sleep(255) ;}
    MotorDir(FWD,BREAK);MotorSpeed(90,0);
    for(izaehler=0;izaehler<400;izaehler++){Sleep(255) ;}
    }
    }

    return 0;

    }

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    33
    Beiträge
    239
    hallo Svenja

    dein problem ist glaube ich haupsächlich hardwarebedingt (zumindes müsste der code funktionieren)
    und zwar hat die funktion PollSwitch() ein seltsames verhalten, dass sie manchmal "falsche" werte liefert. dies ist besonders häufig bei laufenden motoren

    mann kann sich abhelfen, in dem man sie öfter aufruft und überprüft, ob die werte gleich sind, da selten zwei mal hinter einander der selbe falsche wert zurück gegeben wird
    das könnte dann so aussehen:
    Code:
    int t1,t2;     //  variablen bereitstellen, zum speichern der tasterwerte
    
    t1=PollSwitch();
    t2=PollSwitch();
    if(t1==t2 && t1!=0)
    {
          //Anweisungen, die ausgeführt werden sollen, wenn sicher mind. ein taster gedrückt ist
    }
    else
    {
        //Anweisungen, für den fall, dass kein taster gedrückt ist, oder 2 verschiedene werte zurückgegeben wurden
    }
    hier siest du auch wie man mit hilfe von [code ] und [/code ] ein Programm schön einfügen kann (in den [] muss man das leerzeichen weglassen, und statt dem "und" steht dein programm


    noch etwas: mich wundert, dass sich dein programm bei dir überhaupt compiliern lassen hat, denn du hast izaehler nicht deklariert (zb. int izaehler
    eigentlich müsste hier eine fehlermeldung kommen
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2009
    Beiträge
    5
    ich hab nachdem ich den text hier reinkopiert hab noch ein bisschen was geändert, da ist das dann wohl verloren gegangen...
    ich habs jetzt mal so probiert, wiedu vorgesclagen hast, aber jetzt fährt er n ur noch rückwärts. vorher ist er ja zumindest manchmal wenigstens 2 sekunden vorwärts gefahren. anscheinend kriegt er immer zwei gleiche werte ungleich 0 zurück. was nun?
    Code:
     #include "asuro.h"
    
    int main(void)
    {
    	Init();
    	int izaehler,t1,t2;
    	while(1)
    	{
    		t1=PollSwitch;
    		t2=PollSwitch;
    		if(t1==t2 && t1!=0)
    		{
    			StatusLED(RED);
    			MotorDir(RWD,RWD);MotorSpeed(100,100);
    			for(izaehler=0;izaehler<500;izaehler++){Sleep(255);}
    			MotorDir(FWD,BREAK);MotorSpeed(90,0);
    			for(izaehler=0;izaehler<600;izaehler++){Sleep(255);}
    			StatusLED(GREEN);
    		}
    		else
    		{
    			StatusLED(GREEN);
    			MotorDir(FWD,FWD);
    			MotorSpeed(100,100);
    		}
    				
    	}
    	
    	return 0;
    	
    }

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    16.01.2009
    Ort
    Rosenfeld
    Beiträge
    57
    Hallo Svenja,

    probiers mal mit Klammern hinter "PollSwitch"
    Also:
    t1=PollSwitch();
    t2=PollSwitch();

    statt:
    t1=PollSwitch;
    t2=PollSwitch;

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2009
    Beiträge
    5
    super danke, hätte ja nicht gedacht, dass es daran liegen kann

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    12.09.2007
    Alter
    30
    Beiträge
    98
    izaehler wird bei dir nicht deklariert (bereitgestellt). Eigentlich müsste das ein Fehler geben. Um das zu beheben musst du vor dein Hauptschleife (while(1)) noch ein
    Code:
    int izaehler
    schreiben.

    mfg liggi
    Lieber am Asuro rumschrauben als alles andere.
    Meine Homepage

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    16.01.2009
    Ort
    Rosenfeld
    Beiträge
    57
    den izaehler hat sie ja inzwischen schon deklariert, aber da ist mir gerade eben aufgefallen, dass trotzdem noch was falsch ist:

    die beiden Variablen t1 und t2 müssen vom Typ unsigned char sein, da die Funktion PollSwitch() diesen Typ als Rückgabewert hat.
    Woher ich das weiß? Ein Blick in die asuro.h genügt. Da drin steht unter anderem:
    unsigned char PollSwitch (void);

    Also muss es:
    int izaehler;
    unsigned char t1, t2;

    heißen, statt:
    int izaehler,t1,t2;

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress