-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Frage zu den Tastern bzw. die Position in einer Schleife

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8

    Frage zu den Tastern bzw. die Position in einer Schleife

    Anzeige

    Hallo,

    ich habe hier folgendes Linienprogramm, das den Asuro über zwei schwarze Linien außen und eine weiße in der Mitte leiten soll. Das funktioniert soweit auch. Nun möchte ich, dass der Asuro bei einer Kollision mit einem Hindernis anhält. Leider weiß ich genau, wo diese Abfrage in das Programm rein muss, vielleicht ist sie auch falsch formuliert, jedenfalls funktioniert es nicht.

    Hier das Programm:
    Code:
    #include "asuro.h"
    
    #define dunkel 50
    #define rechts 1
    #define links 0
    
    void warte (int s)
    {
        int x = 0;
    	for (x = 0; x <s; x++) Sleep(72);
    }
    
    int main(void)
    {
    
        Init();
    	unsigned int Licht[2];
    	int white;
    	FrontLED(ON);
    	warte(1000);
    	LineData(Licht);
    	white = (Licht[links]+Licht[rechts])/2-60;
    	MotorDir(FWD,FWD);
    	MotorSpeed(180,180);
    	int i = 0;
    	
    	while (1)
    	{
    	
    	  LineData(Licht);
    	  MotorSpeed(180,180);
    	  if(PollSwitch()>0)
          {
          MotorDir(BREAK,BREAK);
          MotorSpeed(0,0);
          } 
    	  while (Licht[links] > white && Licht[rechts] > white)
    	  {
    	    MotorDir(FWD,FWD);
    	    LineData(Licht);
    	  }
    	  MotorSpeed(180,180);
    	  while (Licht[links] < white)
    	  {
    	    MotorDir(FWD,BREAK);
    	    LineData(Licht);
            while (Licht[rechts] < white)
    	    {
    	      MotorSpeed(255,180);
    	      LineData(Licht);
              while (Licht[links] > white)
    	      {
    	        MotorSpeed(255,180);
    	        LineData(Licht);
    	      }	
    	    }	
    	    MotorSpeed(180,180);
    	  }	
    	  MotorSpeed(180,180);
          while (Licht[rechts] < white)
    	  {
    	    MotorDir(BREAK,FWD);
    	    LineData(Licht);
            while (Licht[links] < white)
    	    {
    	      MotorSpeed(180,255);
    	      LineData(Licht);
              while (Licht[rechts] > white)
    	      {
    	        MotorSpeed(180,255);
    	        LineData(Licht);
    	      }	
    	    }	
    	    MotorSpeed(180,180);
    	  }
       	}
    	MotorDir(BREAK,BREAK);
    	MotorSpeed(0,0);
    	
    
    return 0;
    
    }
    Schon mal Danke im Voraus.

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    BITTE NICHT PUSHEN. schon gar nicht nach 3 stunden.

    dien programm sieht ok aus, bis darauf dass die funktion Init(); UNTER die variablendeklaration muss.

    was funktioniert nicht? das kompilieren? der ablauf? was macht der asuro? "geht nicht" ist nichtgenau genug.
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    61
    Beiträge
    674
    Bau zu Diagnosezwecken noch LEDs ein, damit Du weißt, ob alle Zweige erreicht werden, z.B.:

    Code:
    if (PollSwitch()>0)
    {
        MotorDir(BREAK,BREAK);
        MotorSpeed(0,0);
        BackLED(ON,ON); // nur zu Diagnosezwecken
    }

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8
    Zitat Zitat von damaltor
    BITTE NICHT PUSHEN. schon gar nicht nach 3 stunden.

    dien programm sieht ok aus, bis darauf dass die funktion Init(); UNTER die variablendeklaration muss.

    was funktioniert nicht? das kompilieren? der ablauf? was macht der asuro? "geht nicht" ist nichtgenau genug.
    Die Kollisionsabfrage, sprich er reagiert nicht, wenn die Taster gedrückt werden.

  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
    So in der Art funktioniert PollSwitch():

    Code:
    #include "asuro.h"
    
    char sw0, sw1;
    
    void warte (int s)
    {
        int x = 0;
       for (x = 0; x <s; x++) Sleep(72);
    }
    
    int main(void)
    {
       Init();
       sw0=PollSwitch();
    
    while (1)
    {
    	sw1=sw0;
    	sw0=PollSwitch();
    	//PrintInt(sw0);
    	if ((sw0 == 0) && (sw1 == 0))
    	{
    		StatusLED(GREEN);
    		MotorDir(FWD,FWD);
    		MotorSpeed(180,180);
    		//FolgeDerLinie();
    	} else {
    		StatusLED(RED);
       	MotorDir(BREAK,BREAK);
       	MotorSpeed(0,0);
       	warte(100);
       	MotorDir(RWD,RWD);
       	MotorSpeed(150,180);
    		warte(500);
    		MotorDir(BREAK,BREAK);
       	MotorSpeed(0,0);
       	warte(100);
    	sw0=PollSwitch();
    	}
    
    }
    return 0;
    
    }
    Du solltest deine while-Anweisungen teilweise gegen if-Abfragen ersetzen, weil das Programm sonst gelegentlich festhängt.

    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
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8
    Mh, jetzt sieht das ganze so aus und nach dem Anmachen leuten nur noch die beiden hinteren LEDS und die vordere neben dem Powerswitch:

    Code:
    #include "asuro.h"
    
    #define dunkel 50
    #define rechts 1
    #define links 0
    
    void warte (int s)
    {
        int x = 0;
       for (x = 0; x <s; x++) Sleep(72);
    }
    
    int main(void)
    {
    
       unsigned int Licht[2];
       int white;
       FrontLED(ON);
       warte(1000);
       LineData(Licht);
       white = (Licht[links]+Licht[rechts])/2-60;
       MotorDir(FWD,FWD);
       MotorSpeed(180,180);
       int i = 0;
       Init();
       
       while (1)
       {
       
         LineData(Licht);
         MotorSpeed(180,180);
         if(PollSwitch()>0)
          {
          MotorDir(BREAK,BREAK);
          MotorSpeed(0,0);
    	  BackLED(ON,ON);
          }
         while (Licht[links] > white && Licht[rechts] > white)
         {
           MotorDir(FWD,FWD);
           LineData(Licht);
         }
         MotorSpeed(180,180);
         while (Licht[links] < white)
         {
           MotorDir(FWD,BREAK);
           LineData(Licht);
            while (Licht[rechts] < white)
           {
             MotorSpeed(255,180);
             LineData(Licht);
              while (Licht[links] > white)
             {
               MotorSpeed(255,180);
               LineData(Licht);
             }   
           }   
           MotorSpeed(180,180);
         }   
         MotorSpeed(180,180);
          while (Licht[rechts] < white)
         {
           MotorDir(BREAK,FWD);
           LineData(Licht);
            while (Licht[links] < white)
           {
             MotorSpeed(180,255);
             LineData(Licht);
              while (Licht[rechts] > white)
             {
               MotorSpeed(180,255);
               LineData(Licht);
             }   
           }   
           MotorSpeed(180,180);
         }
          }
       MotorDir(BREAK,BREAK);
       MotorSpeed(0,0);
       
    
    return 0;
    
    }

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    Das Problem mit pollswitch ist, dass die werte manchmal falsch sind - allerdings sind sie zu hoch.
    dei originales programm war zwar absolut korrekt, aber irgendwie hat pollswitch nichts ergeben. der ansatz von radbruch schliesst zwr die fehler durch zu hohe werte (fast) immer aus, aber bei dir scheint der wert immer null zu sein, sonst würde er ja anhalten. das wird dir nich helfen.

    flashe mal folgendes programm

    Code:
    #include "asuro.h"
    
    int main(void){
    int radix=10;
    int poll=0;
    char wert[3];
    
    Init();
    
    while(1){
    
    poll=PollSwitch();
    itoa(poll,wert,radix);
    SerWrite(wert,3);
    SerWrite("\n\r",2);
    
    }
    }
    hoffe das das so funktioniert, kanns grade nicht testen. wer weiss was falsch ist bitte schreiben!

    dieses programm sollte dir in hyperterminal den aktuellen pollswitch wert ausgeben. die werte der taster müssten der reihe nach 1,2,4,8,16 und 32 sein. wenn mehrere taster gedrückt werden, müsste die summe der werte ankommen. wird kein taster gedrückt müsste 0 ausgegeben werden. was kommt bei dir?
    kleinschreibung ist cool!

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    61
    Beiträge
    674
    Das Programm funktioniert gut.

    Meine Werte an einem ASURO sind z.B.:
    keine Taste: 4
    von links nach rechts (von vorne gesehen):
    5, 6, 4 (???), 12, 20, 32

    Was ist da falsch? (die dritte Taste scheint "tot" zu sein, es ist aber ein 16K Widerstand eingelötet, seltsam)

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    61
    Beiträge
    674
    Kleine Schönheitsergänzung zum Programm:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
      int radix = 10;
      int poll  =  0;
      char wert[3];
    
      Init();
    
      while(1)
      {
    
        poll = PollSwitch();
        int i;
    	 for(i=0;i<3;++i)
    		wert[i]=' ';
    	 itoa (poll, wert, radix);
        SerWrite (wert, 3);
        SerWrite ("\n\r", 2);
    
      }
    }

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    oh oh... das ist grütze. probiere es noch ein bisschen und schau obs immer die gleichen werte werden.
    kleinschreibung ist cool!

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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