- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 25

Thema: Asuro steigt nicht aus while schleife aus

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    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...

  4. #4
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17
    Wie schon zu sehen: der Greifer bewegt durch den Servo und das schwarze Kästchen vorne, indem der Sensor und eine blaue Led zur Helligkeitsmessung drin sind, dank diesem Kästchen werden fast immer richtige Messergebnisse egal bei welcher Umgebungshelligkeit gemessen.

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Ne, Kommentare ändern natürlich nichts an der Funktionsweise, aber sie helfen auch dir selbst dein eigenes Programm zu verstehen. Ich hab' mal versucht deine Gedanken in ein Programm zu packen:

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

    int main(void)
    {
        
    unsigned int data[2]; // Speicherplatz für Odo- und Linedaten
        
    int i// Integervariable zur freien Verwendung

        
    Init();
        
    FrontLED(ON); // Linienbeleuchtung einschalten
        
    Sleep(255); // warten bis LED volle Helligkeit erreicht hat
        
    LineData(data); // ADC anwärmen
        
    while(1)
        {
            
    MotorSpeed(200,200); // und losfahren

            
    while(PollSwitch() == 0// folge der Linie bis zum ersten Hinderniss
            
    {
                
    LineData(data);
                if (
    data [0] > data [1])
                    
    MotorSpeed(200,100);
                else
                    
    MotorSpeed(100,200);
                
    Sleep(100); // Regelung etwas dämpfen
            
    }

            
    MotorSpeed(0,0); // anhalten weil Hinderniss erkannt wurde
            
    Msleep(500);

            for (
    i=0i<40i++) // Becher aufnehmen (Servoimpuls 40x senden)
            
    {
                
    BackLED(OFF,ON);
                
    Msleep(1); // Impulslänge 1ms
                
    BackLED(OFF,OFF);
                
    Msleep(19); // Impulspause 19ms
            
    }

            
    OdometrieData(data); // Becherfarbe ermitteln
            
    if (data[0] > 500)
            {
                
    MotorSpeed(0,200); // hell bedeutet nach links abbiegen
                
    StatusLED(YELLOW);
            }
            else
            {
                
    MotorSpeed(200,0); // dunkel bedeutet nach rechts abbiegen
                
    StatusLED(RED);
            }

            
    Msleep(1000); // eine Sekunde drehen
            
    StatusLED(GREEN); //fertig
            
    MotorSpeed(200,200); // weiterfahren (und hoffen, dass die Linie noch da ist ;)
            
            
    while(PollSwitch() == 0// folge der Linie bis zum zweiten Hinderniss
            
    {
                
    LineData(data);
                if (
    data [0] > data [1])
                    
    MotorSpeed(200,100);
                else
                    
    MotorSpeed(100,200);
                
    Sleep(100);
            }

            
    MotorSpeed(0,0); // nochmals anhalten
            
    Msleep(500);

            for (
    i=0i<40i++) // und Becher wieder ablegen
            
    {
                
    BackLED(OFF,ON);
                
    Msleep(2); // Impulslänge 2ms
                
    BackLED(OFF,OFF);
                
    Msleep(18); // Prima!
            
    }
            
            
    // Vermutlich sollten wir jetzt nochmals drehen. Da wir aber vergessen haben,
            // welche Farbe der Becher hatte, wissen wir nicht, wohin wir drehen sollen ;)
        
    }
        return(
    0);

    Allerdings kann ich nicht sagen, ob das so funktioniert.

    Schicker Greifer. Irgendwo habe ich den auch schon mal gesehen ;)

    Gruß

    mic

    Edit: Ich vermute, hell und dunkel für die Becherfarbe sind vertauscht...
    Geändert von radbruch (19.06.2011 um 20:14 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    19.06.2011
    Beiträge
    17
    Hallo, also vielen Dank das funktioniert schon ganz gut, nur am ende fährt der Asuro wild durch die gegend und betätigt die ganze Zeit den Greifer, aber soweit ist das ganz gut, ich mache jetzt einfach wieder Odata und Ldata daraus.. Noch eine Frage an der Stelle, kann ich die Odata später nochmal aufrufen oder soll ich einfach neu messen lassen??
    Vielen Dank

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Also ich finde es echt bemerkenswert, wie du die Gedanken aufgreifst und weiterdenkst. Selbstverständlich wäre das Ergebniss der letzten Lesung immer noch in odata gespeichert und könnte ohne erneute Lesung verwendet werden. An dieser Stelle habe ich wohl etwas überoptimiert ;)

    ..nur am ende fährt der Asuro wild durch die gegend und betätigt die ganze Zeit den Greifer,..
    Seltsam, vielleicht stimmt an dieser Stelle irgendetwas mit der Tastererkennung nicht. Ein Video wäre prima.

    Noch ein Hinweis zu deinem Ansatz mit den vielen Variablen, was ja eigentlich der Ansatz einer StateMachine ist:

    http://www.rn-wissen.de/index.php/So...#State_Machine
    http://www.google.de/search?q=c+state+machine

    Ach ja, und das habe ich ganz vergessen:

    Willkommen im RN-Forum und Glückwunsch zum asuro.

    Gruß

    mic
    Bild hier  
    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
    Also ich habe jetzt das Programm mal so umgeschrieben als wüsste er es nicht mehr, wie findest du das Programm so?

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

    int main(void)
    {
        
    unsigned int odata[2];
        
    unsigned int ldata[2]; // Speicherplatz für Odo- und Linedaten
        
    int i// Integervariable zur freien Verwendung

        
    Init();
        
    FrontLED(ON); // Linienbeleuchtung einschalten
        
    Sleep(255); // warten bis LED volle Helligkeit erreicht hat
        
    LineData(ldata); // ADC anwärmen
        
    while(1)
        {
            
    MotorSpeed(200,200); // und losfahren

            
    while(PollSwitch() == 0// folge der Linie bis zum ersten Hinderniss
            
    {
                
    LineData(ldata);
                if (
    ldata [0] > ldata [1])
                {
                    
    MotorSpeed(200,100);
                }
                else
                {
                    
    MotorSpeed(100,200);
                }
                
    Sleep(100); // Regelung etwas dämpfen
            
    }
            
    MotorSpeed(0,0); // anhalten weil Hinderniss erkannt wurde
            
    Msleep(500);

            
    OdometrieData(odata); // Becherfarbe ermitteln
            
    if (odata[0] > 950)
            {
                for (
    i=0i<20i++) // Becher aufnehmen (Servoimpuls 20x senden)
                
    {
                    
    BackLED(OFF,ON);
                    
    Msleep(1); // Impulslänge 1ms
                    
    BackLED(OFF,OFF);
                    
    Msleep(19); // Impulspause 19
                
    }
                
    MotorSpeed(0,200); // hell bedeutet nach links abbiegen
                
    StatusLED(YELLOW);
            }
            else
            {
                for (
    i=0i<20i++) // Becher aufnehmen (Servoimpuls 20x senden)
                
    {
                    
    BackLED(OFF,ON);
                    
    Msleep(1); // Impulslänge 1ms
                    
    BackLED(OFF,OFF);
                    
    Msleep(19); // Impulspause 19ms
                
    }
                
    MotorSpeed(200,0); // dunkel bedeutet nach rechts abbiegen
                
    StatusLED(RED);
            }

            
    Msleep(1000); // eine Sekunde drehen
            
    StatusLED(GREEN); //fertig
            
    MotorSpeed(200,200); // weiterfahren (und hoffen, dass die Linie noch da ist ;)
            
            
    while(PollSwitch() == 0// folge der Linie bis zum zweiten Hinderniss
            
    {
                
    LineData(ldata);
                if (
    ldata [0] > ldata [1])
                {    
                    
    MotorSpeed(200,100);
                }
                else
                {    
                    
    MotorSpeed(100,200);
                }
                
    Sleep(100);
            }

            
    MotorSpeed(0,0); // nochmals anhalten
            
    Msleep(500);

            for (
    i=0i<20i++) // und Becher wieder ablegen
            
    {
                
    BackLED(OFF,ON);
                
    Msleep(2); // Impulslänge 2ms
                
    BackLED(OFF,OFF);
                
    Msleep(18); // Prima!
            
    }
            
            
    OdometrieData(odata); // Becherfarbe ermitteln
            
    if (odata[0] > 950)
            {
                
    MotorSpeed(0,200); // hell bedeutet nach links abbiegen
                
    StatusLED(YELLOW);
            }
            else
            {
                
    MotorSpeed(200,0); // dunkel bedeutet nach rechts abbiegen
                
    StatusLED(RED);
            }
            
    Msleep(1000); // eine Sekunde drehen
            
    StatusLED(GREEN); //fertig
            
    MotorSpeed(200,200); 
        }
        return(
    0);

    Geändert von radbruch (19.06.2011 um 21:59 Uhr) Grund: Code-Tags eingefügt

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress