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

Thema: Sleep Funktion

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.02.2010
    Beiträge
    32

    Sleep Funktion

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo
    Ich bin grade dabei die Grundsachen von der Programmier Sprache C zu lernen. Ich hab hier einen Quelletext der bewirken soll das wenn mein Asuro gegen etwas fährt, zurück seztz. Leider macht er das nicht. Bitte helft mir!!
    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	
    
        Init();
    	unsigned char taste;
    	int i;
    	
    	StatusLED(OFF);
    	MotorDir(FWD,FWD);
    	
    	while(1){
    	taste=PollSwitch();
    	
    	if(taste>0){
    	MotorDir(RWD,RWD);
    	MotorSpeed(100,100);
    	for(i=0;i<300;i++) 
    	Sleep(10); 
    	MotorDir(BREAK,RWD);  
    	MotorSpeed(0,125); 
    	for(i=0;i<1000;i++) 
    	Sleep(10);  
    	
    	StatusLED(RED);
    	
    	}
    	
    	else{
    	MotorDir(FWD,FWD);
    	MotorSpeed(200,200);
    	}
    	}
    	return 0;
    }
    Gruß giftzwerg

    PS: Er macht das was bei "if" steht

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Tip für dich wenn du gerade beim Anfangen bist:
    Gewöhn dir gleich das richtige Einrücken an. Machts für dich und auch andere viel leichter, den Code zu lesen. Auch wenn z.B. bei ner if oder for nur ein Kommando kommt: Sicherheitshalber { } drum rum. Aus deinem Code sieht man z.B. nicht eindeutig, was alles zu den for(...) gehört. Nur das Sleep? Oder auch die Motor-Sachen?

    Ich nehm mal an, dass das ganze so gehört:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
    
      Init();
      unsigned char taste;
      int i;
    
      StatusLED(OFF);
      MotorDir(FWD,FWD);
    
      while(1)
      {
        taste=PollSwitch();
        if(taste>0)
        {
          MotorDir(RWD,RWD);
          MotorSpeed(100,100);
          for(i=0;i<300;i++)
          {
            Sleep(10);
          }
          MotorDir(BREAK,RWD); 
          MotorSpeed(0,125);
          for(i=0;i<1000;i++)
          {
            Sleep(10); 
          }
          StatusLED(RED);
        }
        else
        {
          MotorDir(FWD,FWD);
          MotorSpeed(200,200);
        }
      }
      return 0;
    }
    Und macht er hier jetzt das im if-Zweig oder im else-Zweig?
    Oder anders gefragt: Wie bewegt er sich?
    #ifndef MfG
    #define MfG

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    03.02.2010
    Beiträge
    32
    Also er macht das was im if-Zweig steht. Ich hab das mit der for -Schleife so verstanden das zuerst kommt was er ausführen soll und dann die for-Schleife. Ich habe das Sleep dort eingebaut weil das bei vielen anderen Ouelltexten dort so stand und weil es anders auch nicht ging.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Nein, es ist wie:

    Code:
    for(i=0;i<300;i++) 
          { 
            Sleep(10); 
          }
    300 mal Sleep(10);

    Nur das was zwischen {} steht wirdt ausgefuhrt, oder wen 's keine gibt, die einzige commando/stellung vorne von den ;

    Code:
    for(i=0;i<5;i++);
    5 mal nichts. Das heisst, nur i hochzählen bei jede durchlauf.

    Code:
    for(i=0;i<10;i++) Sleep(10);
    10 mal Sleep(10)

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    for(i=0;i<5;i++);
    fliegt sogar je nach Intelligenz/Einstellung des Compilers raus.
    Wenn z.B. erkannt wird, dass ja mit dem hochgezählten i nix gemacht wird... wozu dann hochzählen => weg damit.
    (ausser i ist volatile, dann wird trotzdem gezählt)
    #ifndef MfG
    #define MfG

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    for(i=0;i<5;i++); ist nur als theoretisches beispiel gemeint. Imprizip sollte der compiler einfach compilieren was geschrieben ist, ob es sinn macht oder nicht. Aber die codeoptimalisierung steht bei die meiste schon an.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    03.02.2010
    Beiträge
    32
    also muss ich das so schreiben

    Code:
    #include "asuro.h" 
    
    int main(void) 
    { 
        
    
        Init(); 
       unsigned char taste; 
       int i; 
        
       StatusLED(OFF); 
       MotorDir(FWD,FWD); 
        
       while(1){ 
       taste=PollSwitch(); 
        
       if(taste>0){ 
       for(i=0;i<300;i++){    
       MotorDir(RWD,RWD); 
       MotorSpeed(100,100); 
       Sleep(10); }
       for(i=0;i<1000;i++){ 
       MotorDir(BREAK,RWD);  
       MotorSpeed(0,125); 
       Sleep(10); } 
        
       StatusLED(RED); 
        
       } 
        
       else{ 
       MotorDir(FWD,FWD); 
       MotorSpeed(200,200); 
       } 
       } 
       return 0;
    }

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Nein, die MotorDir und MotorSpeed mussen im vorne von dem for(i=0;i<300;i++) und for(i=0;i<1000;i++) geschrieben werden. In deine code wird das 300 mal und 1000 wieder neu eingestellt. Das tut kein weh, aber nur einmal reichts.

    Code:
    #include "asuro.h" 
    
    int main(void) 
    { 
        
    
        Init(); 
       unsigned char taste; 
       int i; 
        
       StatusLED(OFF); 
       MotorDir(FWD,FWD); 
        
       while(1){ 
       taste=PollSwitch(); 
        
       if(taste>0){
          MotorDir(RWD,RWD);  /* nur ein mal drehrichtung einstellen  */ 
          MotorSpeed(100,100);  /* nur ein mal geschwindigkeit einstellen */
          for(i=0;i<300;i++){    /* 300 mal ... */
             Sleep(10); }            /*  ... 10/36000 sekunden warten   */
    
      /* 3000/36000=1/12 sekunde später nach die letzte Motorspeed */  
       
          MotorDir(BREAK,RWD);  /* nur ein mal drehrichtung einstellen  */
          MotorSpeed(0,125);    /* nur ein mal geschwindigkeit einstellen */
          for(i=0;i<1000;i++){   /* 1000 mal ... */
             Sleep(10); }     /*  ... 10/36000 sekunden warten   */
    
       /* 10000/36000 = 1/3.6 sekunden später nach die letzte MotorSpeed(0,125)   */
    
        
       StatusLED(RED); 
       }        /* ende if: irgend einer 'taster' bemerkt */ 
        
       else { 
          MotorDir(FWD,FWD); 
          MotorSpeed(200,200);   }  /*   ende else: kein taster  */
      
     }     /*   ende while(1), sollte er nicht passieren   */     
    
       return 0; 
    }

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    03.02.2010
    Beiträge
    32
    leider macht er immer noch das was in dem if-Zweig steht. Es kann aber nicht an den tastern liegen, da beim Selftstest alles okay ist.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Könnte doch an dem taster liegen. Oder eigentlich an dem motoren. PollSwitch wird einfach die falsche wert geben wenn es mit drehende motoren angerufen wirdt. Es ist etwas störungsempfindlich.

    Bitte versuch das mit:

    Code:
    #include "asuro.h" 
    
    int main(void) 
    { 
        
    
        Init(); 
       unsigned char taste; 
       int i; 
        
       StatusLED(OFF); 
       MotorDir(FWD,FWD); 
        
       while(1){ 
          taste=PollSwitch(); 
        
          if(taste==PollSwitch()){   /* Alte tastermessung vergleichen mit neue;  nicht gleich den warscheinlich nicht angeprellt  */
          Statusled(RED);         /* Boem!, gehe im ruckfahrt  */
          MotorDir(RWD,RWD);  /* nur ein mal drehrichtung einstellen  */ 
          MotorSpeed(100,100);  /* nur ein mal geschwindigkeit einstellen */ 
          for(i=0;i<300;i++){    /* 300 mal ... */ 
             Sleep(10); }            /*  ... 10/36000 sekunden warten   */ 
    
      /* 3000/36000=1/12 sekunde später nach die letzte Motorspeed */  
        
          MotorDir(BREAK,RWD);  /* nur ein mal drehrichtung einstellen  */ 
          MotorSpeed(0,125);    /* nur ein mal geschwindigkeit einstellen */ 
          for(i=0;i<1000;i++){   /* 1000 mal ... */ 
             Sleep(10); }     /*  ... 10/36000 sekunden warten   */ 
    
       /* 10000/36000 = 1/3.6 sekunden später nach die letzte MotorSpeed(0,125)   */ 
    
        
       StatusLED(OFF);     /* Fertig mit ruckfahrt  */
     
       }        /* ende if: irgend einer 'taster' bemerkt */ 
        
       else {
          StatusLED(GREEN);    /* Alles gut, gehe vorraus. */
          MotorDir(FWD,FWD); 
          MotorSpeed(200,200);
          for(i=0;i<300;i++){   /* 300 mal ... */ 
             Sleep(10); }     /*  ... 10/36000 sekunden warten   */
         /* sonnst könntest du die grünne led kaum aufmerken  */ 
    
       }  /*   ende else: kein taster, las StatusLED grün  */ 
      
     }     /*   ende while(1), sollte er nicht passieren   */      
    
       return 0; 
    }
    Dazu noch einer tip. Du schaltest die Statusled ab am start deines program. Am ende von der ruckfahrt (beim eingeprellte tastern) setzt du es auf rot. Aber es geht nie wieder aus oder auf grun. Wurde es nicht besser sein wann Asuro dich erzählst wan er mit den ruckfärht beschäftigt (statusled rot), und wan er versucht weiter zu fahren (statusled grün). Dan kannst du auch sehen ob er ein 'pfantom'-taster bemerkt hat.
    Du könntest es auch erweiteren mit den BackLEDs, womit du den 2 fasen von den ruckfährt deutlich macht. Habe das schon in den code eingefugt.

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad