- LiFePO4 Speicher Test         
Ergebnis 1 bis 3 von 3

Thema: Brauche Hielfe bei Funktionen aufruf und SerPrint

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.02.2008
    Beiträge
    35

    Brauche Hielfe bei Funktionen aufruf und SerPrint

    Hallo

    bin dabei ein Programm mit Funktionen, SerPrint und switched zu schreiben
    Benutze die AsuroLib und Asuroflash. SerPrint bringt mir nur Mist, ist deshalb auskommentiert.
    Wenn ich GoTurnFront ohne Tastencheck betreibe, bleib das Monster jedes mal stehen, wenn switched einen Taster erkennt.
    In dem unterren Programm will ich über Taste 1 gerade aus fahren und über Taste 3 im Quadrat.
    Tastencheck unterscheidet die Tasten und aktiviert die SatutsLED sowie programmiert. Nur die !switched verhält sich bei quadrat richt ( bleibt sofort stehen wenn ein Taster switched verändert. Bei geradeaus wird kein switched erkannt.
    Code:
    //##############################################################################
    // DemoProgramm für 08032008 über Taster Module auswahlbar
    // Hinderniserkennung immer bei allen Modulen
    // quadrat fahren
    // gerade fahren  50cm ok Front ok
    
    
    #include <asuro.h>
    #include <myasuro.h>
    
    
      int  programme=0;    // Programmnummer  0 = kein Programm gewählt
    
    
    // GoTurnFront  Funktion wie GoTurn plus Hindernisserkennung
      void GoTurnFront  (
      int distance,
      int degree,
      int speed)
    {
      int l_speed =speed;      // linke Geschwindigkeit
      int r_speed = speed;     // rechte Geschwindigkeit
      int tot_count = 0;       // gefahrene Ticks
      int diff = 0;            // differenz zwischen linkes und rechtes Odometer
      unsigned  long  enc_count; // Vorgabewert der Ticks
    
      /* if distance is NOT zero, then take this value to go ... */
      if (distance != 0)
      {
        // Umrechnen der mm in Ticks
        enc_count  = abs (distance) * 10000L;
        enc_count /= MY_GO_ENC_COUNT_VALUE;
        // positiv Vorwaert negativ Rueckwaerts
        if (distance < 0)
          MotorDir (RWD, RWD);
        else
          MotorDir (FWD, FWD);
      }
      // wenn keine distance dann nur dregree drehen auf der stelle
      else
      {
        // Umrechnen des degree Winkels in Ticks
        enc_count  = abs (degree) * MY_TURN_ENC_COUNT_VALUE;
        enc_count /= 360L;
      // positiv in Uhrzeigersinn negativ gegen Uhrzeigersinn
        if (degree < 0)
          MotorDir (RWD, FWD);
        else
          MotorDir (FWD, RWD);
      }
    
      // encoder Vorgabewert linke und rechte Seite ist null
      EncoderSet (0, 0);
    
      StartSwitch();     // Frondkontakte aktivieren Flag=0 kein Kontakt,1= Kontakt
      switched = FALSE;  // Vorbereitung für neuen Aufruf von StartSwitch()
    
      // Motoren einschalten mit linker und rechter Geschwindigkeit
      MotorSpeed (l_speed, r_speed);
    
    
    //Begin der while Schleife   #####################################
    // sollange Ist Ticks kleiner Soll Ticks und kein Frondkontakt (!switched
      while (tot_count < enc_count && !switched)
      {
         StatusLED(RED);    // in der While Schleife
         switched = FALSE;  // Vorbereitung für neuen Aufruf von StartSwitch()
    
         tot_count += encoder [LEFT];    //IstTick ist linke Seite
         diff = encoder [LEFT] - encoder [RIGHT];  // differenz bilden
    
         if (diff > 0)     // wenn differnz groesser als null
         { // Linke Seite schneller wie Soll oder rechte Seite ist groeßer 244
            if ((l_speed > speed) || (r_speed > 244))
              l_speed -= 10;     // linke seite um 10 reduzieren
            else
              r_speed += 10;     // rechte Seite um 10 erhoehen
         }
    
         if (diff < 0)          // wenn differnz kleiner als null
         { //rechte Seite schneller wie Soll oder linke Seite ist groeßer 244
            if ((r_speed > speed) || (l_speed > 244))
              r_speed -= 10;     // rechte seite um 10 reduzieren
            else
              l_speed += 10;     // linke seite um 10 erhoehen
         }
         /* reset encoder */
         EncoderSet (0, 0);
         // Motoren einschalten mit linker und rechter Geschwindigkeit
         MotorSpeed (l_speed, r_speed);
         Msleep (1);
    
      } // Ende der Endlosschleife Nr.1
    
      MotorDir (BREAK, BREAK);
      Msleep (200);
      StatusLED(YELLOW);
      Msleep(200);
      StatusLED(RED);
      Msleep(200);
      StatusLED(GREEN);
      Msleep(200);
    
      StatusLED(YELLOW);
    
    } // Ende GoTurnFunktion
    //##########################################################################
    void geradeaus50cm(void)
    {
    
      GoTurnFront (2000,  0, 150);
    
      programme=0;       // Programmnummer auf 0 kein Programmm gewählt
    } // Ende Funktion
    //##########################################################################
    void geradeaus(void)
    {
      int i;          // Laufvariable i
       // Laesst den Asuro ein gerade von 500 mm fahren,
       // bei einer Geschwindigkeit von 150.
    
       for (i = 0; i < 1; i++)      // nur 1 mal
       {
           GoTurnFront (500,  0, 150);
           Msleep(10);
       }
       programme=0;       // Programmnummer auf 0 = kein Programmm gewählt
    } // Ende Funktion
    //##########################################################################
    void quadrat80cm(void)
    {
      int i;          // Laufvariable i
       // Laesst den Asuro ein Quadrat von 500 mm fahren,
       // bei einer Geschwindigkeit von 150.
    
       for (i = 0; i < 4; i++)      // 4 mal von 0 bis 3
       {
           // GoTurnFront aufrufen
           //         (distance,degree,speed)
           // SerPrint ("GoTurn 200, 0,150\r");
           GoTurnFront (0,  90, 150);  // entspricht Go   (200, 150)
           Msleep(10);
           GoTurnFront (  500, 0, 150);  // entspricht Turn ( 90, 150)
       }
       programme=0;       // Programmnummer auf 0 kein Programmm gewählt
    } // Ende Funktion
    //##########################################################################
    void Kontakt1(void)          // Kontakt 1
    { //  Anfang Funktion
            //    FrontLED(OFF);
                StatusLED(RED);
                Msleep(1000);     // warte 1 sekunde
                programme=1;
    } // Ende Funktion
    //##########################################################################
    void Kontakt2(void)          // Kontakt 2
    { //  Anfang Funktion
             //   FrontLED(OFF);
                StatusLED(YELLOW);
                Msleep(1000);     // warte 1 sekunde
                programme=2;
    } // Ende Funktion
    //##########################################################################
    void Kontakt3(void)          // Kontakt 3
    { //  Anfang Funktion
            //    FrontLED(OFF);
                StatusLED(GREEN);
                Msleep(1000);     // warte 1 sekunde
                programme=3;
    } // Ende Funktion
    //##########################################################################
    void Kontakt4(void)          // Kontakt 4
    { //  Anfang Funktion
            //    FrontLED(ON);
                StatusLED(RED);
                Msleep(1000);     // warte 1 sekunde
                programme=1;
    
    } // Ende Funktion
    //##########################################################################
    void Kontakt5(void)          // Kontakt 5
    { //  Anfang Funktion
           //     FrontLED(ON);
                StatusLED(YELLOW);
    } // Ende Funktion
    //##########################################################################
    void Kontakt6(void)          // Kontakt 6
    { //  Anfang Funktion
            //    FrontLED(ON);
                StatusLED(GREEN);
    } // Ende Funktion
    //##########################################################################
    void Kontaktnull(void)          // Kontakt kein
    { //  Anfang Funktion
            //   FrontLED(OFF);
                StatusLED(OFF);
    } // Ende Funktion
    
    //##########################################################################
    void Tastencheck(void)
    { //  Anfang Funktion
      unsigned char sw;
      //SerPrint("Tastencheck\r\n");
      //for (;;)
      //{
        sw = PollSwitch();
        if (sw == 0x00) Kontaktnull();
        if (sw == 0x01) Kontakt1();
        if (sw == 0x02) Kontakt2();
        if (sw == 0x04) Kontakt3();
        if (sw == 0x08) Kontakt4();
        if (sw == 0x10) Kontakt5();
        if (sw == 0x20) Kontakt6();
      //}
    } // Ende Funktion
    //##########################################################################
    
    
    // Anfang Hauptschleife
    int main(void)
    {
    //##########################################################################
    // Anfangsbediengungen Initialisieren
        Init();          // damit ATMEGE8 weiss was seine Pinne machen sollen
        EncoderInit();   // Wird fuer Odometer gebraucht
    
      //FrontLED(ON);     // Rote Led unten an
      StatusLED(GREEN); // Statusanzeige ist Grün an
     StartSwitch();
     switched = FALSE;  // Vorbereitung für neuen Aufruf von StartSwitch()
    
      //SerPrint("Demo Roboterplattform\r\n");
    
      Msleep(1000);     // warte 1 sekunde
    //##########################################################################
      while (1)     // Beginn der Endlosschleife Nr.1
       {
            Tastencheck();    // Tasten interpretieren
    
           Msleep(100);     // warte 0,1 sekunde
           if (programme==1) geradeaus();
           if (programme==3) quadrat80cm();
    
       }             // Ende der Endlosschleife Nr.1
       while (1) {}     // verhindert ein Aufrufen alter Programme
       return 0;
    }
    
    //##########################################################################
    Bin für jeden Rat dankbar
    Gruß
    Juelicher

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    06.02.2008
    Beiträge
    35
    Hallo

    hat jemand das Programm bei sich probiert, um zu bestätigen das Taster 1 geradeaus fahren ohne Hinderniserkennung und Taster 3 mit Hinderniserkennung ist?
    Wenn der Effekt nur bei mir ist, könnte ich ein Problem mit asuro.h, asuro.c, myasuro.h haben.

    Gruß
    Juelicher

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    06.02.2008
    Beiträge
    35
    Hallo zusammen,

    Habe mit SerPrint folgendes herausgefunden,
    char Text[12] muss als unsigned char text [12] im Programm vorgegeben werden, ob wohl es in der print.c schon so ist?

    Mein Problem mit dem Hinderniserkennen funktioniert, nur beim zweiten durch lauf der GoTurnFront Funktion, weiß aber nicht warum?

    Gruß
    Juelicher

Berechtigungen

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

Labornetzteil AliExpress