- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

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

  1. #11
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Wir sollten mal einen allumfassenden Tastenbeitrag im Wiki verfassen. Vieles wurde hier dazu schon geschrieben, aber finden kann man's leider nicht mehr so einfach. [Beispiel]

    Hier eine alternative Tastenabfrage (gepostet von asuro-henk im arexx-Forum):

    if(!(PINC & (1<<PC4)))

    Es wird nur geprüft, ob überhaupt eine Taste gedrückt wurde.

    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!

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8
    Zitat Zitat von damaltor
    dien programm sieht ok aus, bis darauf dass die funktion Init(); UNTER die variablendeklaration muss.
    Negativ, dann geht gar nichts mehr, das war das eine Problem mit den nur noch leuchtenden LEDs. Dein Programm zu den Tastern funktioniert, es werden auch die richtigen Werte ausgegeben.

    Aber auch die zuletzt gepostete Funktion funktioniert in meinem Programm nicht, irgendwie habe ich den Verdacht, dass ich die an die falsche Stelle setze, kann das nochmal jemand überprüfen?

    Ich habe das jetzt aus Gag nochmal umpositioniert, half aber auch nicht.
    Also jetzt sieht das Ganze so aus:

    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);
    	 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);
         }
        }
        if(!(PINC & (1<<PC4)))
        {
        MotorDir(BREAK,BREAK);
        MotorSpeed(0,0);
        BackLED(ON,ON);
        } 
       
    
    return 0;
    
    }

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Das wird so nichts werden. Um zu erkennen, ob während der Fahrt eine Taste gedückt wird, muss man den Tastenstatus im Programm auch einlesen. Wenn dein Programm also in einer while-Schleife ala

    while (Licht[links] < white)

    hängt und Licht[links] nie kleiner als white wird, wird auch nie etwas anderes gemacht, also auch kein PollSwitch(). Kein Einlesen der Tasten bedeutet eben auch, keine Reaktion auf Tasten.

    Du könntest nun alle while-Schliefen um ein zusätzliches Ende per Tastendruck ergänzen, oder du überdenkst deinen Code nochmals komplett und trennst dich von deinen vielen Whiles.

    Der Einbau der Tastenabfrage (keine Taste: Linienfolgen; Taste: Stopp) in deinen Code würde etwa so aussehen:

    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)
       
    /* Abfrage der Tasten 1
    	Wenn (PINC & (1<<PC4)) == true dann keine Taste gedrückt
    	Es wird dann die grüne StatusLED eingeschaltet und der Linie gefolgt
    
    	Durch die verschachtelten while-Anweisungen kommt das Programm aber
    	aus manche Stellen der Liniensuche nicht mehr raus, so dass weitere
    	Tastenabfragen nur in Abhängigkeit der Liniesitiation erfolgen.
    */
    	
           if (PINC & (1<<PC4))
    
    	{
    	   StatusLED(GREEN);
    
         LineData(Licht);
         MotorSpeed(180,180);
        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);
         }
        }
    
    /* Abfrage der Tasten 2
    	Bei gedrückter Taste wird dann der folgende Code ausgeführt, vorrausgesetzt,
    	beim Linienfolgen wurde die Kette der while-Anweisungen durchlaufend und der
    	neue Status der Tasten wird eingelesen.
    */
    
        else
        
        {
        StatusLED(RED);
        }
    
    return 0;
    
    }
    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!

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8
    So, das klappt jetzt, vielen Dank.

    Hier der endgültige Quellcode:

    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);
       
    
    
       while (1)
       
    
       if (PINC & (1<<PC4))
       {
          StatusLED(GREEN);
    
         LineData(Licht);
         MotorSpeed(180,180);
        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);
         }
        }
        
    	else
       
        {
        StatusLED(RED);
    	MotorDir(BREAK,BREAK);
    	MotorSpeed(0,0);
        }
    
    return 0;
    
    }

  5. #15
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Na wunderbar.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8
    Mh, aus irgendeinem Grund reagiert er nur manchmal auf die Taster...

  7. #17
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    ...weil dein Programm in einer while-Schleife festhängt.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8
    Zitat Zitat von radbruch
    ...weil dein Programm in einer while-Schleife festhängt.
    Also einfach die whiles durch ifs ersetzen?

  9. #19
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Naja, so einfach ist das nicht. Du must dazu dein Program ziemlich komplett umbauen. Dann allerdings würden z.B. auch deine vielen LineData()-Aufrufe verschwinden.

    Als Anregung mal meine Anfänge aus einem älteren Thread:

    Code:
    #include "../inc/asuro.h" 
    #include "../inc/asuro.c" 
    
    #define schwelle 15 
    #define power 175 
    
    unsigned char pow_l, pow_r, dir_l, dir_r; 
    unsigned int data[2], suchen; 
    unsigned int h_l, h_r, d_l, d_r; 
    
    int main(void) { 
    
    Init(); 
    FrontLED(ON); 
    dir_l=dir_r=FWD; 
    pow_l=pow_r=power; 
    d_l=d_r=0; 
    h_l=h_r=1023; 
    MotorDir(dir_l,dir_r); 
    MotorSpeed(pow_l,pow_r); 
    suchen=0; 
    
    do{ 
    LineData(data); 
    BackLED(OFF,OFF); 
    if ((data[0]-schwelle < d_l) && (data[1]-schwelle < d_r)) { 
       dir_l=dir_r=FWD; 
       pow_l=255-data[0]; 
       pow_r=255-data[1]; 
       suchen=0; 
       StatusLED(GREEN); 
       BackLED(ON,ON); 
    } else { 
       if (data[1]-schwelle > data[0]) { 
          pow_l=0; 
          pow_r=power; 
          d_l=(d_l+data[0])/2; 
          h_r=(h_r+data[1])/2; 
          suchen=1; 
          StatusLED(YELLOW); 
          BackLED(OFF,ON); 
       } 
       if (data[0]-schwelle > data[1]) { 
          pow_l=power; 
          pow_r=0; 
          h_l=(h_l+data[0])/2; 
          d_r=(d_r+data[1])/2; 
          suchen=1; 
          StatusLED(YELLOW); 
          BackLED(ON,OFF); 
       } 
       if (suchen==1) { 
          if ((h_l-schwelle < data[0]) && (h_r-schwelle < data[1])) { 
             StatusLED(RED); 
             if (pow_l==0) { dir_l=RWD; pow_l=power; } 
             if (pow_r==0) { dir_r=RWD; pow_r=power; } 
          } 
          suchen=2; 
       } 
        
    } 
    
    MotorDir(dir_l,dir_r); 
    MotorSpeed(pow_l,pow_r); 
    
    }while (1); 
    return 0; 
    }
    Damit macht mein asuro das:
    Bild hier  
    Bild anklicken für youtube-Video
    mit wirklicher Geschwindigkeit



    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!

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    27.05.2007
    Beiträge
    8
    Mh.. irgendwie steige ich da nicht durch...

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test