-
        

Ergebnis 1 bis 8 von 8

Thema: Bei der Kollision funktioniert irgendwas nicht.

  1. #1

    Bei der Kollision funktioniert irgendwas nicht.

    Anzeige

    Hi.

    Ich habe mir jezt diesen code geschrieben. Leider funktioniert er nur zu hälfte. Findet eine Kollision statt fährt er wie programiert rückwärts. Doch nicht immer so wie er soll. abundzu fährt er einfach 3mal rückwärts, oder er fährt links rückwärts und dann noch zweimal rechts. Wo kann der Fehler liegen?

    Code:
    #include "asuro.h" 
    int main(void) 
    { 
       unsigned int z ,l ,r; 
       unsigned char taste1, taste2;
       Init(); 
       taste2=PollSwitch(); 
       while(1) 
       { 
       
          
          taste1=PollSwitch(); 
          if (taste1 && (taste1==taste2)) 
          { 
    			  if (taste1==1) {l=90;r=120;}
    			  if (taste1==2) {l=0;r=120;}
    			  if (taste1==4) {l=120;r=90;}
    			  if (taste1==8) {l=90;r=120;}
    			  if (taste1==16) {l=120;r=0;}
    			  if (taste1==32) {l=120;r=90;}
             StatusLED(RED); 
             MotorDir(RWD,RWD); 
             MotorSpeed(l,r); 
             for(z=0;z<250;z++) 
             { 
                Sleep(255); 
             } 
          } 
          else 
          { 
             StatusLED(GREEN); 
             MotorDir(FWD,FWD); 
             MotorSpeed(120,120); 
          } 
          taste2=taste1; 
       } 
       return 0; 
    }
    Danke schonmal im voraus.

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    hm ich würde es spontan immer noch auf die ungenauigkeit von pollswitch schieben.

    was ist das für ein ansatz, dass taste2 immer wieder mit taste1 überschrieben wird?
    kleinschreibung ist cool!

  3. #3

    erstmal danke

    Erstmal danke für deine antwort.

    1. Ich hab des ganze schon mit 3sicherheitsabfragen gemacht d.h 6mal abgerufen.

    2. Ich hab es auch schon versucht mit taste1 = "" und taste2=""

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    mach doch einfach teste1= 0

    kleinschreibung ist cool!

  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
    Hallo

    was ist das für ein ansatz, dass taste2 immer wieder mit taste1 überschrieben wird?
    Das ist mein Ansatz, taste2 speichert den letzten PollSwitch()-Wert, der in taste1 steht, am Ende der Schleife bevor am Anfang der Schleife ein neuer Wert in taste1 eingelesen wird.

    Das wird jetzt aus zwei Gründen etwas kritisch. Erstens vergeht die z-Schleifenzeit zwischen den Tastenabfragen. Zweitens, und das ist wohl das Problem, wird der if-Zweig auch ausgeführt, wenn ein Tastenwert erkannt wird, der nicht 1,2,4,8,16 oder 32 ist. Also wenn z.B. mehr als eine Taste gedrückt wird, oder wenn die Taster nicht richtig kalibriert sind. Weil aber für l und r keine Defaultwerte zu Beginn des If-Zweigs definiert wurden, macht der asuro das letzte gültige nochmal. Ein schneller Test wäre z.B.:
    Code:
          if (taste1 && (taste1==taste2))
          {
    			  l=r=0;
    			  if (taste1==1) {l=90;r=120;}
    Wenn der zweite Fall eintritt, bleibt er einfach stehen.

    Gruß

    mic

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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459
    Hallo InFaIn,

    Du kannst die Routine für eine sichere Tastenabfrage von hier
    http://www.roboterclub-freiburg.de/a...ll/zufall.html
    nehmen.

    Gruß,
    robo

  7. #7

    Danke!

    Also erstmal ein gutes neues Jahr und ich hoff ihr seid nicht über euren Asuro gerutscht.

    Vielen Dank für eure Hilfen. Ich habe es gerade eben hinbekommen. Für alle die das selbe Proplem haben, hier mein funktionierender code:

    Code:
    #include "asuro.h" 
    int main(void) 
    { 
       unsigned int z ,l ,r; 
       unsigned char taste1, taste2 ,taste3, taste4; 
       Init(); 
       
      
       while(1) 
       { 
          taste4=PollSwitch();
          taste2=PollSwitch();
    	  taste1=PollSwitch();
          taste3=PollSwitch();	  
          if (taste1 && (taste1==taste2) && (taste3==taste4) && (taste1==taste3) && (taste1==taste4)) 
          { 
    		  l=0;
    		  r=0;
               if (taste1==1) {l=120;r=0;} 
               if (taste1==2) {l=0;r=160;} 
               if (taste1==4) {l=0;r=120;} 
               if (taste1==8) {l=120;r=0;} 
               if (taste1==16) {l=160;r=0;} 
               if (taste1==32) {l=0;r=120;} 
             StatusLED(RED); 
             MotorDir(RWD,RWD); 
             MotorSpeed(l,r);
    		
             for(z=0;z<250;z++) 
             { 
                Sleep(255); 
             } 
          } 
          else 
          { 
             StatusLED(GREEN); 
             MotorDir(FWD,FWD); 
             MotorSpeed(120,120); 
          } 
          taste2=0;
    	  taste1=0; 
       } 
       return 0; 
    }
    Noch ein schöner Jahr 2008!

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    wenn taste1 = taste4 ist, und taste1 = taste3 ist, dann brauchst du nicht nochmal z prüfen ob taste3 = taste4 ist...
    kleinschreibung ist cool!

Berechtigungen

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