-         

Ergebnis 1 bis 5 von 5

Thema: Inteligenter Asuro oder Programmbug?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.05.2010
    Ort
    Trebur
    Alter
    33
    Beiträge
    36

    Inteligenter Asuro oder Programmbug?

    Anzeige

    Hi erstma wieder ^^
    ich habe mir gestern mal die Asuro Lib runtergeladen und installiert funktioniert soweit auch alles ganz gut.
    Nun habe ich mein Kollisionsprogramm um geschrieben mit GoTurn, was soweit auch super funktioniert (nochmal ein Lob an die Mitwirkenden an der Lib =D> ) und mit Msleep was auch klappt .
    Nun zu meiner Frage könnte mein Programm so Anfängermässig sein das wenn Taster eins gedrückt wird auch ab und an mal Funktionen der anderen Taster mit hinten dran gehängt werden? Seltsamer Weise passen die Abläufe auch meistens zur Situation z.B. wenn er in einer Ecke an Eckt und zufällig 2-3 Funktionen macht ob wohl Physikalisch nur ein Taster betätigt wurde(Der Asuro ist noch in Grundausstattung).
    Ich hänge mal mein Programmcode mit dran vielleicht hilft es bei der Antwort , aber für die Profis sieht es Bestimmt extrem Anfänger mässig aus und unübersichtlich, aber bin ja auch noch ein Anfänger auf dem Gebiet ^^

    Code:
    #include "asuro.h"                                        
    #include "time.c"
    #include "encoder.c"
    
    void main()
    {
    int zaehler;                                       
    
       Init();                                                    
       EncoderInit ();
    
        while(1)
        {
            if (PollSwitch() == 1)                                 
            {
                if(PollSwitch() == 1)
                {
                    if(PollSwitch() == 1)
                    {
    
                        StatusLED (YELLOW);						
    					
    						MotorDir(RWD,RWD);							
    						MotorSpeed(255,255);
    						for( zaehler=0; zaehler < 50; zaehler++ )
    							Msleep(3);
    						MotorDir(BREAK,BREAK);
    						for( zaehler=0; zaehler < 100; zaehler++ )
    							Msleep(5);
    						
    						GoTurn(0,-45,200);   
                         
                        for( zaehler=0; zaehler < 200; zaehler++ ) 
                        {                                          
                        
    						Msleep(3);
                        }
                    }
                }
             }      
     
     
    		 if (PollSwitch() ==2)                                 
            {
                if(PollSwitch() == 2)
                {
                    if(PollSwitch() == 2)
                    {
    
                        StatusLED (YELLOW);                        
    					
    						MotorDir(RWD,RWD);							
    						MotorSpeed(255,255);
    						for( zaehler=0; zaehler < 50; zaehler++ )
    							Msleep(3);
    						MotorDir(BREAK,BREAK);
    						for( zaehler=0; zaehler < 100; zaehler++ )
    							Msleep(5);
    						
                            GoTurn(0,-90,200);
                         
                        for( zaehler=0; zaehler < 200; zaehler++ ) 
                        {                                           
                        
    						Msleep(3);
                        }
                    }
                }
             }      
     
             else                                                  
     
     
    		 if (PollSwitch() ==32)                                 
            {
                if(PollSwitch() == 32)
                {
                    if(PollSwitch() == 32)
                    {
    
                        StatusLED (YELLOW);                        
    					
    						MotorDir(RWD,RWD);							
    						MotorSpeed(255,255);
    						for( zaehler=0; zaehler < 50; zaehler++ )
    							Msleep(3);
    						MotorDir(BREAK,BREAK);
    						for( zaehler=0; zaehler < 100; zaehler++ )
    							Msleep(5);
    
                            GoTurn(0,45,200);
                         
                        for( zaehler=0; zaehler < 200; zaehler++ ) 
                        {                                           
                        
    						Msleep(3);
                        }
                    }
                }
             }      
     
        
    		 
    		 if (PollSwitch() ==16)                                 
            {
                if(PollSwitch() == 16)
                {
                    if(PollSwitch() == 16)
                    {
    
                        StatusLED (YELLOW);                        
    					
    						MotorDir(RWD,RWD);							
    						MotorSpeed(255,255);
    						for( zaehler=0; zaehler < 50; zaehler++ )
    							Msleep(3);
    						MotorDir(BREAK,BREAK);
    						for( zaehler=0; zaehler < 100; zaehler++ )
    							Msleep(5);
                       
    						GoTurn (  0, 90, 200);   
                         
                        for( zaehler=0; zaehler < 200; zaehler++ ) 
                        {                                           
                        
    						Msleep(3);
                        }
                    }
                }
             }      
     
             else                                                  
             {
                 StatusLED (GREEN);                                
    			 BackLED (OFF,OFF);
                 MotorDir(FWD,FWD);                                
                 MotorSpeed(180,185);                              
             }       
    		 
        }               
    }

    Gruss
    Jörg

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von Osser
    Registriert seit
    31.10.2006
    Ort
    Köln
    Alter
    47
    Beiträge
    387
    Hi Joggle,


    dann behaupte ich mal, dass Du ein eher 'guter Anfänger' bist wenn Du das als schlecht bezeichnest.

    Der Grund für das Fehlverhalten ist, dass die Funktion PollSwitch() nicht so arbeitet wie Du das erwartest.
    1) Die Widerstandskette am Asuro ist halt nicht unbedingt 100-Pro genau wegen Fertigungsabweichungen bei den Widerständen.
    2) Wird die Messung via PollSwitch() z.B. exact nach drücken des Schalters gestartet, muss erst die minimale Kapazität des Ports und der Leitung geladen werden und ausserdem Prellt der Schalter dabei auch noch.
    Das ganze ergibt dann einen zu Kleinen Wert bei dieser Messung.
    3) War davor ein anderer Schalter gedrückt gehts evtl. genau andersherum und Du erhälst einen zu hohen Wert.


    Ich hab in deinem Programm gesehen dass Du an verschiedenen Stellen wiederholt PollSwitch() verwendest was das beschriebene Verhalten erklären kann, da ja immer eine neue Messung gestartet wird.

    Lösungsansatz:
    1) Zusammenfassen der Schalterauswertung vor alle IF Anweisungen
    2) Mittelwert bilden über z.B. 3-5 Messungen von PollSwitch()
    3) Auswerten dieser einen aufbereiteten Messung in den IF-Zweigen


    Dann wird das Proggi sicherlich eher ausführen was Du eigentlich wolltest.



    Gruss,

    O.

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Mittelwertbildung bei Pollswitch würde ich nicht empfehlen. Wenn da ein Höherwertiger Taster mal gerade an der grenze ist und Prellt, müßte man schon sehr viele Werte Mitteln dass auch die niederwertigen taster stimmen.
    Das ist die Lösung mit den vielen IF bedungungen schon intelligenter. Die konsequente Lösung ist es solange Pollswitch aufzurufen bis man 3-5 mal hintereinander den Selben Wert bekommt. Dann kann man dem Wert trauen.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Osser
    Registriert seit
    31.10.2006
    Ort
    Köln
    Alter
    47
    Beiträge
    387
    Hi,

    ja, dem würde ich auch zustimmen.
    Aber das Zusammenfassen an den Anfang würde ich dann trotzdem vorschlagen.

    Gruss,

    O.


    NB. Zum Auswerten wäre ein Intervall von Werten auch besser um einzelne Schalter einzugrenzen.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    29.05.2010
    Ort
    Trebur
    Alter
    33
    Beiträge
    36
    Das mehrfache benutzen der PolSwitch funktion hatte eigentlich nur den Hintergrund das bei einmaligem Aufrufen der Asuro bei mir in der einen Funktion selsamer weise hengen geblieben ist. Was ich mir allerdings weder elektrisch noch Programm technisch erklären konnte beim 2mal aufrufen gings besser aber mit dem dritten mal wars bis jetzt am Besten
    Wie meint ihr das den mit dem Zusammenfassen?

    Und danke wegen Dem Guten Anfänger ^^ ich programmier auf der Arbeit immer mal wieder unsre Messsysteme usw und hab von der Lehre her schon SPS Grundlagen gehabt und muss sagen ist irgendwie doch alles gleich im Groben und ganzen

    Gruss
    Jörg


    edit:
    Habe gerade noch etwas komisches bemerkt bei dem Programm.O.o
    wenn der asuro an irgendwas hengen bleibt was unter den Tastern ist bzw irgendwas was die Taster definitiv nich Drückt weicht er ebenfalls aus als wenn einer gedrückt wäre O.o hab ich da irgendwo was mit ein Programmiert unbewusst? oder liegt das zufällig mit in der encoder .c aus der Lib?

Berechtigungen

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