-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Tasterproblem

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.11.2005
    Ort
    Graz (Österreich)
    Alter
    25
    Beiträge
    212

    Tasterproblem

    Anzeige

    Bei folgendem Code sollte der ASURO eigentlich vorwärts fahren bis er gegen ein Hindernis fährt allerdings dreht er andauernd um als ob ein Taster gedrückt worden wäre. Was kann ich dagen tun ??
    mfg Daniel

    Code:
    #include "asuro.h"
    int main(void) {
    
    Init ();
    int i;
    int counter;
    
    while(1)
    {
    
    MotorSpeed (255,255);
    MotorDir (FWD,FWD);
    
    	
    	if (PollSwitch() != 1 && PollSwitch() !=2 && PollSwitch() != 4 && PollSwitch() != 8 && PollSwitch() != 16 && PollSwitch() != 32)
    		{
    			counter++;
    		}
    		else
    		{
    			counter=0;
    		}
    		
    	if (counter > 512)
    		{
    		counter = 0;
    			StatusLED (RED);
    			MotorDir (RWD,RWD);
    			for (i = 0; i < 282; i++)
    				{
    					Sleep (255);
    				}
    				
    			MotorDir (FWD,RWD);
    			for (i =0;i< 282;i++)
    				{
    					Sleep (255);
    				}
    		}
    		else
    		{
    		StatusLED (YELLOW);
    		MotorDir (FWD,FWD);
    		}
    }
    return 0;
    }

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    naja solange pollswitch 0 ist wird der counter erhöht... und sowie 512 erreicht ist dreht er um.

    probiers mal andersrum...
    kleinschreibung ist cool!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    01.02.2007
    Ort
    Ashausen
    Alter
    59
    Beiträge
    64
    Hi gandalfsz,

    das Problem ist der Zähler, der nach 512 mal hochzählen die Routine zum Umdrehen einleitet. Außerdem würde ich noch ein paar Sachen anders machen. Schau mal hier und probiere damit weiter. Ist aber ohne Gewähr, da ungetestet:

    Code:
    #include "asuro.h" 
    
    int main(void) { 
    
      // zuerst die benötigten Variablen deklarieren... 
      unsigned int i;       // ist in diesem Fall ausreichend und spart ein Byte 
                                 // IST ES NATÜRLICH NICHT, DA I WEITER ALS 
                                 // BIS 255 LÄUFT - also int ist schon OK 
      unsigned char t1, t2;  //Tastenwerte es ist notwendig mindestens zweimal 
                             //abzufragen, um Störungen zu eleminieren 
    
      Init ();
      
      // OK, jetzt fahren wir los bis ein Hindernis kommt... 
      MotorSpeed (100,100); 
      MotorDir (FWD,FWD);  
    
      while(1)
      {   
        // Abfragen, ob wir an ein Hindernis gestoßen sind: 
        t1 = PollSwitch(); 
        t2 = PollSwitch(); // zur Sicherheit    
        if (t1 && t2 && (t1 == t2)) // Taster war beide Male gedrückt und der gleiche Wert kam zurück 
        { 
        	
          // fahre ein Stück zurück 
          StatusLED (RED); 
          MotorDir (RWD,RWD); 
          for (i = 0; i < 282; i++) 
          { 
            Sleep (255); 
          } 
            
          // wenden        
          MotorDir (FWD,RWD); 
          for (i =0;i< 282;i++) 
          { 
            Sleep (255); 
          }    
        } 
      
        // und wieder vorwärts fahren 
        StatusLED (YELLOW); 
        MotorDir (FWD,FWD); 
        
      }// end while(1) 
    
      return 0; 
    }
    Viel Spaß,

    _HP_

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.11.2005
    Ort
    Graz (Österreich)
    Alter
    25
    Beiträge
    212
    Das ich jeden Taster einzeln genommen hab liegt daran das die taster sobald ich die Motoren dazugenommen hab andauernd ohne Hinderniss ausgelöst haben.
    mfg Daniel

    EDIT : THX für das Prog obwohl ess nicht geht (er kommt aus dem rückwärtsfahren nicht mehr raus. aber du hast ja geschrieben ohne Garantie)

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    versuch mal folgendes:

    if((PollSwitch()&PollSwitch()&PollSwitch())=0) then....

    dann reicht es wenn ein einziges mal der wert 0 ist, die anderen beiden werte können grütze sein.
    kleinschreibung ist cool!

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    if((PollSwitch()&PollSwitch()&PollSwitch())=0) then....
    if((PollSwitch()&PollSwitch()&PollSwitch())==0) then....

    Einverstanden?

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

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    jau... habs voll vergessen =)
    kleinschreibung ist cool!

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    01.02.2007
    Ort
    Ashausen
    Alter
    59
    Beiträge
    64
    So gandalfsz,

    ich nehme an, Du hast den Fehler schon selbst gefunden - aber mir hat das natürlich auch keine Ruhe gelassen. Also habe ich das Programm getestet - und ja, ASURO fuhr nur rückwärts. Das lag daran, dass eine meiner Sparmaßnahmen natürlich Unsinn war: i kann nicht nur 1 Byte lang sein, da Du ja bis 282 abfragst und i dann maximal 255 werden kann. Also wird die for-schleife nie verlassen. Ich habe den code jetzt editiert und die nicht benötigten Teile gleich weggelassen. Jetzt funktioniert das - jedenfalls auf meinem Asuro. Es fällt aber auf, dass mein ASURO beim Programmstart erstmal ein Ausweichmanöver fährt. Das liegt daran, dass am Anfang PollSwitch() nicht Null zurückgibt, wenn kein Taster gedrückt ist. Das gibt sich dann aber sofort. Sollte Dein Asuro weiter ausweichen, ohne dass ein Taster gedrückt wird, dann musst Du ermitteln, was die Funktion bei Dir im "Leerlauf" zurückgibt und das Programm entsprechend umstellen.

    Viel Erfolg....

    _HP_

  9. #9
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    kleiner trick um das zu vermeiden: lass den ersten befehl ein Msleep(1000)sein, dann wartet er zwar ne sekunde länger aber die werte stimmen (zumindest eher =)
    kleinschreibung ist cool!

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    01.02.2007
    Ort
    Ashausen
    Alter
    59
    Beiträge
    64
    Hi damaltor,

    ja, das wäre eine Idee. Leider funktioniert das nur, wenn man die Lib2.7 verwendet. Das Programm benutzt jedoch noch die Originalfunktionen. Aber natürlich kann man auch damit eine entsprechende Wartezeit realisieren.
    Außerdem ist natürlich nicht gesagt, dass PollSwitch() Null zurückliefert, wenn keine Taste gedrückt wurde. Bei meinem Asuro ist das zwar so, aber ich denke, das ist nicht immer so...

    Gruß,

    _HP_

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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