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

Thema: Asuro - Anfängerschwierigkeiten in C-Programmierung

  1. #1

    Asuro - Anfängerschwierigkeiten in C-Programmierung

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen!

    Ich habe den Asuro zusammengebaut und er funktioniert soweit hervorragend. Nun habe ich aber schwierigkeiten mit der Programmierung des Roboters. Ich versuchte mich an einer simplen Motorsteuerung, doch der compiler meldet duzende Fehler, wo ich einfach keine entdecken kann! Ich nehme an erfahrenen C-Programmieren müssen die Fehler sofort auffallen! Tausend Dank fürs durchsehen.

    code und fehlerstatistik:

    Code:
    #include "asuro.h"
    
    int main(void)
    {
     Init();
    	
      while(1)
      {
    	 MotorDir(FWD,FWD);
    	 MotorSpeed(200,200);
    	 StatusLED(GREEN);
    	
    	  while (PollSwitch()==0);//fahren bis kollision
          
    	   {MotorSpeed(0,0); //bei kollision, motoren  abstellen
    	   StatusLED(YELLOW);//nachdenken was passiert ist:
    	
    	
    	   unsigned char taste;
    	   taste = PollSwitch();
    	
    	
    	   if (taste == 32 or taste == 48) //links kollidiert
    	    {MotorDir(BREAK,RWD);
    	     MotorSpeed(0,120);
    	     Sleep(36);} //sollte ca 0.5sec "Pause" sein
    	  
    	   else if (taste == 16 or taste == 8 or taste == 4 or taste == 2 or taste == 18) //einige Frontalkollisionen
    	    {MotorDir(RWD,RWD);
    	     MotorSpeed(120,120);
    	     Sleep(36);
    	 
    	     MotorDir(RWD,FWD);
    	     Sleep(18);}
    	  
    	   else if (taste == 1 or taste == 3)//rechts kollidiert
    	    {MotorDir(RWD,BREAK);
    	     MotorSpeed(120,0);
    	     Sleep(36);}
          
    	 
    	   else//unbekanntes kollisionsmuster
    	    {  
    	     while(1)
    	      {StatusLED(RED);
    	  
    	       BackLED(ON,OFF);
    	       Sleep(100);
    	       BackLED(OFF,ON);
    	       Sleep(100);}
            }
    	}
      } //nach dem "Ausweichen" wieder fahren
    	
     return 0;	
    	
    }
    Fehlerstatistik:

    test.c: In function `main':
    test.c:22: error: parse error before "or"
    test.c:27: error: parse error before "else"
    test.c:35: error: parse error before "else"
    test.c: At top level:
    test.c:41: error: parse error before "else"
    test.c:46: error: parse error before numeric constant
    test.c:46: warning: type defaults to `int' in declaration of `BackLED'
    test.c:46: warning: function declaration isn't a prototype
    test.c:46: error: conflicting types for `BackLED'
    asuro.h:61: error: previous declaration of `BackLED'
    test.c:46: warning: data definition has no type or storage class
    test.c:47: error: parse error before numeric constant
    test.c:47: warning: type defaults to `int' in declaration of `Sleep'
    test.c:47: warning: function declaration isn't a prototype
    test.c:47: error: conflicting types for `Sleep'
    asuro.h:91: error: previous declaration of `Sleep'
    test.c:47: warning: data definition has no type or storage class
    test.c:48: error: parse error before numeric constant
    test.c:48: warning: type defaults to `int' in declaration of `BackLED'
    test.c:48: warning: function declaration isn't a prototype
    test.c:48: warning: data definition has no type or storage class
    test.c:49: error: parse error before numeric constant
    test.c:49: warning: type defaults to `int' in declaration of `Sleep'
    test.c:49: warning: function declaration isn't a prototype
    test.c:49: warning: data definition has no type or storage class
    test.c:57:2: warning: no newline at end of file
    MAKE.EXE: *** [test.o] Error 1

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    schau ma mal ...

    in C gibts kein or bei der If abfrage, das heisst da ||

    in der Zeile:
    Code:
    while (PollSwitch()==0);//...
    gehört normalerweise kein ; am schluss, sonst ist die Schleife hier gleich geschlossen.
    mfG

  3. #3
    vielen Dank für die schnelle Antwort!

    jetzt erscheint noch die Fehlermeldung:
    "MAKE.EXE: *** Warning: Clock skew detected. Your build may be incomplete."

    dies: while (PollSwitch()==0);//.. ist absichtlich so; er ist in der schleife und macht die obigen befehle (fahren), solange keine kollision stattgefunden hat.

    habe ich das mit Sleep(36); richtig verstanden? er sollte eine halbe sekunde die vorankommenden befehle ausführen!

    grüsse beni

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Mach mal ein make clean dann wird das Verzeichnis wieder aufgeräumt. Geht beim ASURO-quelltext mit der Batchdatei Test-clean.bat

    Bei dem while passt was trotzdem nicht, denn die folgende Zeile beginnt mit einer geschweiften Klammer, also sollte das ; da nicht hin !

    Sleep macht garnix und das in einer dauer die vom Wert abhängt, den man übergeben hat.
    Wenn vorher die Motoren eingeschaltet wurden, fährt der Asuro dann solange mit diesen Werten.
    Der Wert den man bei Sleep angibt berechnet sich aber etwas komplizierter, siehe Beschreibung, die dabei ist.
    Ich hab jetzt nicht nachgeschaut ob das mit den 0.5 sec hinkommt !
    mfG

  5. #5
    Dankeschön für eure Antworten!

    doch ich bin schon wieder auf eine solche Anfänger-Schwierigkeit gestossen

    wie muss ich folgenden Code umändern? geht dies elegant, oder muss ich daraus 6 case-Fälle machen? So wie es jetzt ist, gibt er mir einen Fehler aus!

    Code:
     
    case 16||8||4||2||18||12: //frontal kollidiert
     MotorDir(FWD,RWD);
     MotorSpeed(140,150);
     Msleep(1000);
    break;
    vielen Dank für eure Mühe!!

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    also du willst dohc darauf testen, ob überhaupt einer angeschlagen hat, oder?

    Dann teste doch einfach auf >0.

    So long

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    die Syntax von switch ist:
    Code:
    switch (GANZZAHL)
    {
       case WERT1:
           ...
       case WERT2:
           ...
       case WERT3:
           ...
       default:
          ...
    }
    Die ... sind der Code, der jeweils ausgeführt werden soll.
    Mit 'break' wird der switch verlassen.
    Fehl das 'break', wird im nächsten case (oder default) weitergemach.
    Ansonsten ist die Reihenfolge der cases, default egal.
    Also:
    Code:
    	unsigned char taste;
    
    	// fahren bis kollision
     	while (0 == (taster = PollSwitch()))
    		;
    		
    	//bei kollision, motoren  abstellen
    	MotorSpeed(0,0); 
    	
    	//nachdenken was passiert ist:
    	StatusLED(YELLOW);
    
    	switch (taste)
    	{
    		//links kollidiert
    		case 32:
    		case 48:
    			MotorDir(BREAK,RWD);
    			MotorSpeed(0,120);
    			//sollte ca 0.5sec "Pause" sein
    			Sleep(36);
    
    			break;
    
    		//einige Frontalkollisionen
    		case 2:
    		case 4:
    		case 8:
    		case 16:
    		case 18:
    			MotorDir(RWD,RWD);
    			MotorSpeed(120,120);
    			Sleep(36);
    
    			MotorDir(RWD,FWD);
    			Sleep(18);
    
    			break;
    
    		//rechts kollidiert
    		case 1:
    		case 3:
    			MotorDir(RWD,BREAK);
    			MotorSpeed(120,0);
    			Sleep(36);
    
    			break;
    
    		//unbekanntes kollisionsmuster
    		default:
    			while(1)
    			{
    				StatusLED(RED);
    
    				BackLED(ON,OFF);
    				Sleep(100);
    				BackLED(OFF,ON);
    				Sleep(100);
    			}
    	} // switch (taste)

  8. #8
    aha! grosses Dankeschön!

  9. #9
    ich habe dieses proramm in mein PN kopiert und nach dem obengennanten geändert, es zeigt mir keine fehler an, aber wenn ich das dann geflsaht habe und schalte meinen asuro ein leuchten nur die satusled und die backled rot auf und mehr nicht...
    was mache ich falsche...

    und enbenbei... ich habe null erfahrung in C, nur das bisschen, was bei dem asruo dabei ist und das bringt mir meiner meinung nach nciht viel, da dort keine komplexeren programme erklärt werden und in diesem blauen heft auch sachen stehen, die mir wenig sagen...

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    31
    Beiträge
    69
    hi

    also dein fehler war, dass du in deinem programm Sleep(36); geschreiben hast.
    Das ist aber keine halbe sekunde, sondern ca. 1/2 ms.

    also müsstest du entweder Msleep(500);
    oder eine schleife nehmen:
    int a;
    for( a = 0;a < 500;a++){
    Sleep(72);//ca. eine ms
    }



    MfG

    Jan

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen