- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Msleep Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2009
    Beiträge
    11

    Msleep Problem

    Anzeige

    Praxistest und DIY Projekte
    Keine Ahnung was da falsch läuft aber ist aber relativ lustig. Mein Programm funktioniert so einwandfrei
    Code:
    #include "asuro.h"
    
    
    #define FULL_L 80		
    #define FULL_R 60
    
    /* vorwärts */
    void MotorFwd(void)
    {
      MotorDir(FWD,FWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    /* rückwärts */
    void MotorRwd(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* bremsen */
    void MotorStop(void)
    {
      MotorSpeed(0,0);
    }
    
    
    int main(void)
    {
    	
    	Init();
    	
    	while(1)
    	
    	{
    		
    	
    		if(PollSwitch()==0)
    		{
    			MotorDir(FWD,FWD);
    			MotorSpeed(50,255);
    		}
    		
    		if(PollSwitch()==32)				
    		{
    			MotorDir(FWD,FWD);
    			MotorSpeed(100,200);
    		}
    		
    		if(PollSwitch()==33)
    		{
    			MotorDir(RWD,RWD);
    			MotorSpeed(255,255);
    			
    		}	
    				
    		if(PollSwitch()!=32)
    		{
    			MotorDir(RWD,RWD);
    			MotorSpeed(255,255);
    			
    		}
    	}
    }
    Ich will aber wenn ASURO ein Kontakt mit der Wand hat, d.h wenn er in der Ecke steht und nicht mehr weiter kommt. Ich hab die Msleep funktion eingebaut und für 1 sec eingestellt wollt rausfinden wie lang er braucht um sich um 90 grad zu drehen. das hat dann so ausgeschaut
    Code:
    #include "asuro.h"
    
    
    #define FULL_L 80		
    #define FULL_R 60
    
    /* vorwärts */
    void MotorFwd(void)
    {
      MotorDir(FWD,FWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    /* rückwärts */
    void MotorRwd(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* bremsen */
    void MotorStop(void)
    {
      MotorSpeed(0,0);
    }
    
    
    int main(void)
    {
    	
    	Init();
    	
    	while(1)
    	
    	{
    		
    	
    		if(PollSwitch()==0)
    		{
    			MotorDir(FWD,FWD);
    			MotorSpeed(65,255);
    		}
    		
    		if(PollSwitch()==32)				
    		{
    			MotorDir(FWD,FWD);
    			MotorSpeed(100,200);
    		}
    		
    		if(PollSwitch()==33)
    		{
    			MotorDir(RWD,RWD);
    			MotorSpeed(255,255);
    			Msleep(1000);
    		}	
    				
    		if(PollSwitch()!=32)
    		{
    			MotorDir(RWD,RWD);
    			MotorSpeed(255,255);
    			Msleep(1000);
    		}
    	}
    }
    Jetzt funktioniert aber gar nichts mehr und der Roboter düst einfach nach hinten. Was ist jetzt da falschgelaufen hab ich di Lib nich richtig installiert?

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

    Die PollSwitch()-Funktion "lügt" häufig, vor allem wenn die Tasten bei laufenden Motoren abgefragt werden. Die Chance dass ein falscher Wert genau 0 oder 32 ist ist bedeutend geringer als ein falscher Wert ==32 oder != 32.

    Mehrfachabfrage der Tasten bei Motorstörungen:

    Code:
    #include "asuro.h"
    
    
    #define FULL_L 80
    #define FULL_R 60
    
    /* vorwärts */
    void MotorFwd(void)
    {
      MotorDir(FWD,FWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    /* rückwärts */
    void MotorRwd(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* bremsen */
    void MotorStop(void)
    {
      MotorSpeed(0,0);
    }
    
    
    int main(void)
    {
    	char t1, t2;
    
       Init();
    
       while(1)
    
       {
    		t1=PollSwitch();
    		t2=PollSwitch();
    
          if((t1==t2) && (t2==0))
          {
             MotorDir(FWD,FWD);
             MotorSpeed(65,255);
          }
    
          if((t1==t2) && (t2==32))
          {
             MotorDir(FWD,FWD);
             MotorSpeed(100,200);
          }
    
          if((t1==t2) && (t2==33))
          {
             MotorDir(RWD,RWD);
             MotorSpeed(255,255);
             Msleep(1000);
          }
    
          if((t1==t2) && (t2!=32))
          {
             MotorDir(RWD,RWD);
             MotorSpeed(255,255);
             Msleep(1000);
          }
       }
    }
    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!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    37
    Beiträge
    100
    also du verwendest eine aktuelle (überabeitete) lib?! beispielsweise die version 2.71 oder 2.8?!

    hast du die funktion Msleep() jemals getestet?! fie funktion soll ja einfach nur den wert in ms warten, den du übergibst. also wartet Msleep(1000) 1 sekunde. du kansst bei solceh einfachen problemen ganz einfach den fehler eingrenzen, indem du dir kleine hilfsprogramme schreibst. lass z.b. einfach nur die status led erst grün leuchten, dann nach einer sekunde gelb und nach einer weiteren rot. dann schaltest du sie nach 2 sekunden ab. mehr soll asuro in deinem testprogramm erst mal nicht machen. wenn alles funktionier wie beschrieben, kannst du erkennen, dass die funktion Msleep() [und damit wahrscheinlich auch die ganze lib] richtig funktioniert.

    geht es damit nicht wie gewünscht, musst du weiterforschen. allerdings ist das oft gut, das so zu machen, weil man dann ein gefühl für mögliche fehlerursachen bekommt und sich dann auch oft selbst helfen kann.

    ich mach es auch oft so, dass ich mögliche fehlerquellen stück für stück auskommentiere, einfach nur um zu sehen, ob es an der entsprechenden stelle liegt oder nicht.

    das testprogramm sehe dann so aus:

    Code:
    #inclue asuro.h
    
    int main()
    {
      Init();
      StatusLED(OFF);
      Msleep(500);
      StatusLED(GREEN);
      Msleep(1000);
      StatusLED(YELLOW);
      Msleep(1000);
      StatusLED(RED);
      Msleep(2000);
      StatusLED(OFF);
    
      while(1);
      return 0;
    }

    ... jetzt wo ich hier grad so den code reinschreibe fällt mir auf, dass du in deiner main() funktion gar kein return am ende hast. meckert dein compiler da gar nicht?!
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2009
    Beiträge
    11
    Nö merkt er nicht, nachdem ich ne endlos schleife programmieren will is des auch kein problem aber du hast recht gehört einfach der Formhalber hinzu. Ich hab das Problem jetzt gefunden, lib funktioniert einwandfrei auch die Msleep funktion. Aber anscheinend ist der befehl Pollswitch()!=32 jetzt dem Befehl pollswitch()==0 übergeordnet deswegen fährt er sofort nachhinten los weil 0 ungleich 32 ist. Eigentlich logisch aber warum er das nicht macht wenn der befehl Msleep nicht drin ist, ist irgendwie komisch. So funktioniert aber alles einwandfrei
    Code:
    #include "asuro.h"
    
    
    #define FULL_L 80		
    #define FULL_R 60
    
    /* vorwärts */
    void MotorFwd(void)
    {
      MotorDir(FWD,FWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    /* rückwärts */
    void MotorRwd(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* bremsen */
    void MotorStop(void)
    {
      MotorSpeed(0,0);
    }
    
    
    int main(void)
    {
    	
    	Init();
    	
    	while(1)
    	
    	{
    		
    	
    		if(PollSwitch()==0)
    		{
    			MotorDir(FWD,FWD);
    			MotorSpeed(65,255);
    		}
    		
    		if(PollSwitch()==32)				
    		{
    			MotorDir(FWD,FWD);
    			MotorSpeed(100,200);
    		}
    		
    		if(PollSwitch()==33)
    		{
    			MotorDir(FWD,RWD);
    			MotorSpeed(60,60);
    			Msleep(1000);
    			
    		}	
    				
    		if(PollSwitch()!=32 && PollSwitch()!=0)
    		{
    			MotorDir(FWD,RWD);
    			MotorSpeed(60,60);
    			Msleep(1000);
    		}
    		
    }
    return 0;
    }

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    37
    Beiträge
    100
    ja die pollswitch funktion hat ne macke...

    ist mir auch aufgefallen. ich hab das ganze noch ein wenig anders gelöst. es gibt beim roboterclub freiburg eine funktion (die untere auf der website namens KeyPressed()), die sicherer arbeitet als die pollswitch(). allerdingsliefert sie dir nur 0 (nicht gedrückt) und 1 (gedrückt) zurück, egal welcher schalter gedrückt ist.

    ich hab die funktion bei mir eingebunden und dann meine tasterabfrage-funktion so gemacht:

    Code:
    /*Funktion zum Abfragen der 6 Taster; Liefert Wert zurück, je nachdem welcher Taster gedrückt ist*/
    int Taster(void)
    {
    	int t1,t2;
    	
    	while(1) {
    		t1=KeyPressed();
    		t2=PollSwitch();
    		
    		if ((t1==0x01)&&(t2==0x01)) return 6;		//0b000001
    		else if ((t1==0x01)&&(t2==0x02)) return 5;	//0b000010
    		else if ((t1==0x01)&&(t2==0x04)) return 4;	//0b000100
    		else if ((t1==0x01)&&(t2==0x08)) return 3;	//0b001000
    		else if ((t1==0x01)&&(t2==0x10)) return 2;	//0b010000
    		else if ((t1==0x01)&&(t2==0x20)) return 1;	//0b100000
    		
    		else if ((t1==0x01)&&(t2!=0x01)&&(t2!=0x02)&&(t2!=0x04)&&(t2!=0x08)&&(t2!=0x10)&&(t2!=0x20)&&(t2!=0x00)) return 7; //mehr als eine Taste
    		
    		else return 0;
    	}
    }
    damit frage ich zum einen ab, ob überhaupt ein taster gedrückt ist (über KeyPressed()) und zum anderen, welcher gedrückt ist (über PollSwitch()). und ich muss sagen, dass das so richtig gut und zuverlässig funktioniert.

    kann ich jedem nur empfehlen...

    grüße, malediction...
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    37
    Beiträge
    100
    @ fredweise... wie bitte meinst du das?!
    was soll daran nicht klappen...

    ein bisschen präziser solltest du schon sein...
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Seine Library kennt Msleep() noch nicht:

    https://www.roboternetz.de/phpBB2/viewtopic.php?t=46113

    Deshalb hatte ich seinen Betrag schon gelöscht...

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    37
    Beiträge
    100
    ok... das wär auch das, was mir als erstes eingefallen wäre...
    nur war die frage wirklich ein bisl lustig
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

Berechtigungen

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

Solar Speicher und Akkus Tests