-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Asuro steigt nicht aus while schleife aus

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17

    Asuro steigt nicht aus while schleife aus

    Anzeige

    Hallo,
    Ich habe ein kurzes Programm geschrieben, mir dem der Asuro einer Linie folgen soll und bei Kollision stoppen. Das mit dem Linie verfolgen klappt Prima nur nicht mit dem stoppen und anschließendem BackLed aufleuchten. Hier ist mein Programm:
    Code:
    #include "asuro.h"
    #include "myasuro.h"
     
    int main(void)
    {
        unsigned int ldata[2];
        Init();
        int a;
        FrontLED(ON);
        MotorDir(FWD,FWD);
        a=1;
        while(a)
        {    
            LineData(ldata);
            if (ldata [0] > ldata [1])
            {
                MotorSpeed(200,100);
            }
            else if (PollSwitch()>0)
            {
                a=0;
            }
            else
            {
                MotorSpeed(100,200);
            }
        }
        return(0);
    BackLED(ON,ON);
    }
    Hier noch ein paar Daten: Ich programiere mit AVR_Studio mit der AsuroLib-v280rc1 auf C für einen Atmega 8
    Also wie schon gesagt das mit der Linienverfolgung klappt nur er hält nicht an bei kollosion, while(a=1) wird also nicht a=0.
    Weiß irgendwer was ich ändern muss, dass er stehen bleibt?
    Vielen Dank
    Geändert von PicNick (19.06.2011 um 15:33 Uhr)

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Nun, wenn Pollswitch > 0, dann wird zwar a=0 gesetzt aber motormässig passiert nix.
    Wegen A=0 wird while() unterbrochen.

    das nächste hinter while() ist ein return, damit ist das Programm zu ende,


    BacKled() steht HINTER dem Return, kommt also niemals dran.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17
    Was meinst du damit, das verstehe ich nicht, wie muss das Programm nun aussehen? Wo muss ich was ändern?? Vielen Dank

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    a) Du hältst den Motor nie an.
    b) Nach return ist dein Programm zuende, was auch immer du danach schreibst, wird NIEMALS ausgeführt werden.

    mfG
    Markus

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    In C wird die Hauptfunktion main() normalerweise von einem übergeordneten Betriebssystem aufgerufen und über return springt das Programm zum aufrufenden Punkt zurück. Dieser Rücksprungpunkt ist bei AVR-GCC aber nicht defininiert, deshalb springt das Programm ins Nirwanwa, wenn es mit return beendet wird.

    Ein Programm könnte etwa so aussehen:

    PHP-Code:
    #include "asuro.h"
    #include "myasuro.h"

    int main(void)
    {
        
    unsigned int ldata[2];

        
    Init();
        
    FrontLED(ON);
        
    Sleep(255); // warten bis FrontLED leuchtet
        
    LineData(ldata); // ADC auf Betriebstemperatur bringen
        // MotorDir(FWD,FWD); // Init() setzt MotorDir schon auf FWD,FWD
        
    MotorSpeed(150,150); // losfahren
        
    while(1)
        {
            
    LineData(ldata); // Liniensensoren einlesen

            
    if (ldata [0] > ldata [1]) // links heller, nach rechts fahren
            
    {
                
    MotorSpeed(200,100);
                
    StatusLED(RED);
            }
            else
            {
                
    MotorSpeed(100,200); // rechts heller (oder gleich), nach links fahren
                
    StatusLED(YELLOW);
            }

            if (
    PollSwitch()>0// Taster betätigt?
            
    {
                
    MotorSpeed(0,0); // wenn ja, dann stop
                
    StatusLED(GREEN);
                
    BackLED(ON,ON);
                while(
    1); //Stop und Ende
            
    }
        }
        return(
    0); // darf nie ausgeführt werden!

    (ungetestet)

    Das funktioniert aber nur, wenn PollSwitch() richtig arbeitet.

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17
    Klicke auf die Grafik für eine größere Ansicht

Name:	Plan2.jpg
Hits:	14
Größe:	28,1 KB
ID:	19081

    ok gut, aber wie müsste es denn aussehen, wenn ich a beibehalten soll also a schon auf 0 gesetzt werden muss?? Denn mei eigentliches Programm sieht so aus: Er soll einer Linie folgen, bei Kollision einen Becher (Servo über Backled angeschlossen) heben, ich untersuchen ob schwarz oder weiß (Odometiesensor nach vorn gelegt) nach links oder Rechts fahren je nachdem welche Farbe, linie Folgen bis Kollision nochmals drehen und auf ursprüngliche Linie fahren.

    Code:
    #include "asuro.h"
    #include "myasuro.h"
    
    int main(void)
    {
    	unsigned int odata[2];
    	unsigned int ldata[2];
    	Init();
    	int a;
    	int b;
    	int c;
    	int d;
    	int e;
    	int f;
    	FrontLED(ON);
    		while(1)
    		{
    		MotorDir(FWD,FWD);
    		a=1;
    		c=1;
    		d=1;
    			while(a)
    				{	
    				LineData(ldata);
    				if (ldata [0] > ldata [1])
    					{
    					MotorSpeed(200,100);
    					}
    				else if (PollSwitch()>0)
    					{
    					a=0;
    					}
    				else
    					{
    					MotorSpeed(100,200);
    					}
    				}
    			return(0);
    			for (b=0; b<40; b++)
    				{
    				BackLED(OFF,ON);
    				Msleep(1);
    				BackLED(OFF,OFF);
    				Msleep(19);
    				}
    			}
    			{	
    			OdometrieData(odata);
    			if (odata[0] > 500)
    				{
    					{
    					MotorSpeed(0,200);
    					Msleep(1000);
    					MotorSpeed(200,200);
    					}
    				while(c)
    					{	
    					LineData(ldata);
    					if (ldata [0] > ldata [1])
    						{
    						MotorSpeed(200,100);
    						}
    					else if (PollSwitch()>0)
    						{
    							c=0;
    							for (f=0; f<40; f++)
    								{
    								BackLED(OFF,ON);
    								Msleep(2);
    								BackLED(OFF,OFF);
    								Msleep(18);
    								}
    						}				
    					else
    						{
    						MotorSpeed(100,200);
    						}
    					}
    				return(0);
    				}
    				{
    				MotorSpeed(100,200);
    				Msleep(1000);
    				MotorSpeed(200,200);
    				}
    			OdometrieData(odata);
    			if (odata[0] < 500)
    				{
    					{
    					MotorSpeed(200,0);
    					Msleep(1000);
    					MotorSpeed(200,200);
    					}
    				while(d)
    					{	
    					LineData(ldata);
    					if (ldata [0] > ldata [1])
    						{
    						MotorSpeed(200,100);
    						}
    					else if (PollSwitch()>0)
    						{
    							d=0;
    							for (e=0; e<40; e++)
    								{
    								BackLED(OFF,ON);
    								Msleep(2);
    								BackLED(OFF,OFF);
    								Msleep(18);
    								}
    						}
    					else
    						{
    						MotorSpeed(100,200);
    						}
    					}
    				return(0);
    				}
    				{
    				MotorSpeed(100,200);
    				Msleep(1000);
    				MotorSpeed(200,200);
    				}
    		}
    		return(0);
    }
    Geändert von radbruch (19.06.2011 um 17:22 Uhr) Grund: Code-Tag eingefügt

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17
    Dazu benötige ich Variablen ich habe die einzelnen Programmteile getestet und sie funktionieren aber eben nicht das mit den Tastern die Variablen werden nicht auf 0 gesetzt die whileschleifen werden nicht verlassen

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Großes Lob, weil dein Programm fehler- und warnungsfrei übersetzt werden kann. Großer Tadel: Wo sind die Kommentare?

    Ich habe dein Programm nochmals umformatiert:
    PHP-Code:
    #include "asuro.h"
    #include "myasuro.h"

    int main(void)
    {
        
    unsigned int odata[2];
        
    unsigned int ldata[2];
        
    int a;
        
    int b;
        
    int c;
        
    int d;
        
    int e;
        
    int f;

        
    Init();
        
    FrontLED(ON);
        while(
    1)
        {
            
    MotorDir(FWD,FWD);
            
    a=1;
            
    c=1;
            
    d=1;
            while(
    a)
            {
                
    LineData(ldata);
                if (
    ldata [0] > ldata [1])
                {
                    
    MotorSpeed(200,100);
                }
                else if (
    PollSwitch()>0)
                    {
                        
    a=0;
                    }
                    else
                    {
                        
    MotorSpeed(100,200);
                    }
            }
            return(
    0);
            for (
    b=0b<40b++)
            {
                
    BackLED(OFF,ON);
                
    Msleep(1);
                
    BackLED(OFF,OFF);
                
    Msleep(19);
            }
        }
        {
            
    OdometrieData(odata);
            if (
    odata[0] > 500)
            {
                {
                    
    MotorSpeed(0,200);
                    
    Msleep(1000);
                    
    MotorSpeed(200,200);
                }
                while(
    c)
                {
                    
    LineData(ldata);
                    if (
    ldata [0] > ldata [1])
                    {
                        
    MotorSpeed(200,100);
                    }
                    else if (
    PollSwitch()>0)
                        {
                            
    c=0;
                            for (
    f=0f<40f++)
                            {
                                
    BackLED(OFF,ON);
                                
    Msleep(2);
                                
    BackLED(OFF,OFF);
                                
    Msleep(18);
                            }
                        }
                        else
                        {
                            
    MotorSpeed(100,200);
                        }
                }
            return(
    0);
            }
            {
                
    MotorSpeed(100,200);
                
    Msleep(1000);
                
    MotorSpeed(200,200);
            }
            
    OdometrieData(odata);
            if (
    odata[0] < 500)
            {
                {
                    
    MotorSpeed(200,0);
                    
    Msleep(1000);
                    
    MotorSpeed(200,200);
                }
                while(
    d)
                {
                    
    LineData(ldata);
                    if (
    ldata [0] > ldata [1])
                    {
                        
    MotorSpeed(200,100);
                    }
                    else if (
    PollSwitch()>0)
                        {
                            
    d=0;
                            for (
    e=0e<40e++)
                            {
                                
    BackLED(OFF,ON);
                                
    Msleep(2);
                                
    BackLED(OFF,OFF);
                                
    Msleep(18);
                            }
                        }
                        else
                        {
                            
    MotorSpeed(100,200);
                        }
                    }
                return(
    0);
            }
            {
                
    MotorSpeed(100,200);
                
    Msleep(1000);
                
    MotorSpeed(200,200);
            }
        }
        return(
    0);

    Man sieht nun deutlich die extreme Verschachtelung und die Wiederholungen der einzelnen Programmteile. Vielleicht solltest du mal den Ablauf analysieren:

    Folge_Line_bis_Becher_erkannt_wird();
    Schliesse_Greifer();
    Links_oder_Rechts_abbiegen();
    Folge_Line_bis_Becher_erkannt_wird();
    Öffne_Greifer();

    Das sollte es im Wesentlichen sein. Es soll wohl sowas werden:



    btw: return in main() beendet das Programm sofort!!!

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17
    Ja sowas in der Art soll es werden, wusste ich gar nicht das es den Film auch gibt... Hab aber nicht abgekupfert... Was kann ich jetzt machen, dass es was wird? was könnte es verbessern? denn das ist ja genau das gleiche Programm oder? soll ich wie du gesagt hast die Kommentare hinzufügen oder was genau? Aber das ändert ja nichts an der Funktionsweiße...

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17
    Hier noch ein paar Bilder, ich entschuldige mich gleich für die Qualität, aber bei meiner Internetverbindung muss ich es soweit runterrechnen wie es geht.Klicke auf die Grafik für eine größere Ansicht

Name:	DSCI1627.jpg
Hits:	10
Größe:	54,4 KB
ID:	19086Klicke auf die Grafik für eine größere Ansicht

Name:	DSCI1622.jpg
Hits:	9
Größe:	50,7 KB
ID:	19087Klicke auf die Grafik für eine größere Ansicht

Name:	DSCI1618.jpg
Hits:	11
Größe:	72,8 KB
ID:	19088

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. FOR-Schleife von -1 bis +1 nicht möglich?
    Von V:X im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 29.12.2010, 17:16
  2. Helligkeit des Dimmers steigt nicht linear an
    Von 8undzwanzigs im Forum PIC Controller
    Antworten: 28
    Letzter Beitrag: 14.11.2010, 15:18
  3. While Schleife funktioniert nicht!
    Von Wiederstand im Forum Software, Algorithmen und KI
    Antworten: 6
    Letzter Beitrag: 18.08.2010, 19:37
  4. Antworten: 1
    Letzter Beitrag: 09.03.2009, 15:19
  5. While-Schleife geht nicht!!!
    Von Undergroundi im Forum Asuro
    Antworten: 14
    Letzter Beitrag: 22.12.2007, 21:34

Stichworte

Berechtigungen

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