- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 8 von 8

Thema: Bei der Kollision funktioniert irgendwas nicht.

  1. #1

    Bei der Kollision funktioniert irgendwas nicht.

    Anzeige

    Praxistest und DIY Projekte
    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
    Milda
    Alter
    37
    Beiträge
    4.063
    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?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  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
    Milda
    Alter
    37
    Beiträge
    4.063
    mach doch einfach teste1= 0

    Read... or die.
    ff.mud.de:7600
    Bild hier  

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

    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
    Bild hier  
    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
    Milda
    Alter
    37
    Beiträge
    4.063
    wenn taste1 = taste4 ist, und taste1 = taste3 ist, dann brauchst du nicht nochmal z prüfen ob taste3 = taste4 ist...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Berechtigungen

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

Labornetzteil AliExpress