Hallo InFaIN,

den vorgeschlagenen Ansatz von hai1991 kann ich nur unterstützen.
Hier ist mal eine formatierte Version. Es ist nichts geändert, sondern nur mal ordentlich eingerückt. Dann wird der Fehler auch sichtbar.
Code:
#include "asuro.h"

#define  TRIGGERLEVEL   655
#define  HYSTERESIS     10
#define  LOW            0
#define  HIGH           1
#define  GESCHW         65

                  int   main (void)
{
         unsigned int   z, ll, rr;
         unsigned char  taste1, taste2 ,taste3, taste4;
         unsigned int   data [2];
         signed   int   status [2] = {0, 0};
         signed   int   difference = 0;
                  int   lData [2];
                  int   i, donl, doffl, donr, doffr, l, r;

   MotorDir (FWD, FWD);

   Init ();

   while (1)
   {
      taste4 = PollSwitch ();
      taste2 = PollSwitch ();
      taste1 = PollSwitch ();
      taste3 = PollSwitch ();

      if (taste1           &&
          taste1 == taste2 &&
          taste3 == taste4 &&
          taste1 == taste3 &&
          taste1 == taste4)
      {
         ll = 0;
         rr = 0;
         if (taste1 == 1)
         {
            //////////////////////////////////////////////
            ///// Kolision
            //////////////////////////////////////////////
      
            while (1)
            {
               taste4 = PollSwitch ();
               taste2 = PollSwitch ();
               taste1 = PollSwitch ();
               taste3 = PollSwitch ();

               if (taste1           &&
                   taste1 == taste2 &&
                   taste3 == taste4 &&
                   taste1 == taste3 &&
                   taste1 == taste4)
               {
                  l = 0;
                  r = 0;

                  if (taste1 ==  1) { l = 120; r =   0; }
                  if (taste1 ==  2) { l =   0; r = 160; }
                  if (taste1 ==  4) { l =   0; r = 120; }
                  if (taste1 ==  8) { l = 120; r =   0; }
                  if (taste1 == 16) { l = 160; r =   0; }
                  if (taste1 == 32) { l =   0; r = 120; }

                  StatusLED  (RED);
                  MotorDir   (RWD, RWD);
                  MotorSpeed (l, r);
      
                  for (z = 0; z < 250; z++)
                  {
                     Sleep (255);
                  }
               }
               else
               {
                  StatusLED  (GREEN);
                  MotorDir   (FWD, FWD);
                  MotorSpeed (120, 120);
               }
               taste2 = 0;
               taste1 = 0;
            }
            return 0;

            //////////////////////////////////////////////
            ///// Kolision
            //////////////////////////////////////////////
         }

         if (taste1 == 2)
         {
            //////////////////////////////////////////////
            ///// Odometer
            //////////////////////////////////////////////

            while (1)
            {
               // Helligkeitswerte der Lichtschranken auslesen
               OdometrieData (data);

               // Wechsel linker Sensor von niedrig auf hoch?
               if (status [0] == LOW &&
                   data [0]    > TRIGGERLEVEL + HYSTERESIS)
               {
                  status [0] = HIGH;
                  difference++;
               }
               // Wechsel linker Sensor von hoch auf niedrig?
               if (status [0] == HIGH &&
                   data [0]    < TRIGGERLEVEL - HYSTERESIS)
               {
                  status [0] = LOW;
                  difference++;
               }

               // Wechsel rechter Sensor von niedrig auf hoch?
               if (status [1] == LOW &&
                   data [1]    > TRIGGERLEVEL + HYSTERESIS)
               {
                  status [1] = HIGH;
                  difference--;
               }

               // Wechsel rechter Sensor von hoch auf niedrig?
               if (status [1] == HIGH &&
                   data [1]    < TRIGGERLEVEL - HYSTERESIS)
               {
                  status [1] = LOW;
                  difference--;
               }

               // zur Sicherheit: verhindern, dass der Differenzz?ler
               // den erlaubten Wertebereich verl?st
               if (difference <- 255)
                  difference = -255;
               if (difference > 255)
                  difference = 255;
      
               // Status-LED noch entsprechend der erkannten Segmente
               // aufleuchten lassen, grn fr links, rot fr rechts
               StatusLED (status [0] + status [1] * 2);

               // Zaeldifferenz passend auf die Motoren verteilen
               if (difference > 0)
                  MotorSpeed (255 - difference - 50, 255 - 50);
               else
                  MotorSpeed (255 - 50, 255 + difference - 50);
            }
            return 0;
      
            //////////////////////////////////////////////
            ///// Odometer
            //////////////////////////////////////////////
         }

         if (taste1 == 4)
         {
            //////////////////////////////////////////////
            ///// Linien
            //////////////////////////////////////////////
      
            while (1)
            {
               FrontLED (OFF);      // Umgebungslicht filtern
               Sleep (10);          // kurz warten bis LED aus
               LineData (lData);    //
               LineData (lData);    //
               doffl =  lData [0];  //
               doffr =  lData [1];  //
               FrontLED (ON);       //
               Sleep (10);          // kurz warten bis LED an
               LineData (lData);    //
               LineData (lData);    //
               donl =   lData [0];  //
               donr =   lData [1];  //
               l = donl - doffl;    //
               r = donr - doffr;    // r und l sind nun die werte von T9 und
                                    // T10 mit gefiltertem Umgebungslicht
               i = (l + r) / 2;

               if (l < r)           // gegenlenken
               {
                  MotorSpeed (GESCHW - i + 68, GESCHW + i);
               }
               else
               {
                  MotorSpeed (GESCHW + i + 68, GESCHW - i);
               }
            }
            return 0;
      
            //////////////////////////////////////////////
            ///// linien
            //////////////////////////////////////////////
         }

         if (taste1 ==  8) { l = 120; r =   0; }
         if (taste1 == 16) { l = 160; r =   0; }
         if (taste1 == 32) { l =   0; r = 120; }
         StatusLED (RED);

         taste2 = 0;
         taste1 = 0;
      }
      return 0;
   }
}
Wird jetzt mal alles aus dem ersten if() in der while()-Schleife hinter dem Init() entfernt, bleibt nur noch folgendes übrig:
Code:
#include "asuro.h"

#define  TRIGGERLEVEL   655
#define  HYSTERESIS     10
#define  LOW            0
#define  HIGH           1
#define  GESCHW         65

                  int   main (void)
{
         unsigned int   z, ll, rr;
         unsigned char  taste1, taste2 ,taste3, taste4;
         unsigned int   data [2];
         signed   int   status [2] = {0, 0};
         signed   int   difference = 0;
                  int   lData [2];
                  int   i, donl, doffl, donr, doffr, l, r;

   MotorDir (FWD, FWD);

   Init ();

   while (1)
   {
      taste4 = PollSwitch ();
      taste2 = PollSwitch ();
      taste1 = PollSwitch ();
      taste3 = PollSwitch ();

      if (taste1           &&
          taste1 == taste2 &&
          taste3 == taste4 &&
          taste1 == taste3 &&
          taste1 == taste4)
      {
      }
      return 0;
   }
}
Das geht zwar durch den Compiler, aber dieses Programm verläßt die main()-Funktion mehr oder weniger sofort nach dem einschalten wieder. Und das ist leider falsch.

Wenn alle 'return 0'-Zeilen entfernt werden sollte es auf alle Fälle schon mal besser gehen.

Wird der Asuro eingeschalte, sollte das 'Menü' aktiv sein:
- Taste1 = 1: Kollision
- Taste1 = 2: Odometer
- Taste1 = 4: Linien

- Taste1 = 8: Variablen l und r setzen, aber nichts weiteres.
- Taste1 = 16: Sollten hier Motorbewegungen angestoßen werden?
- Taste1 = 32: Es scheint dann ein MotorSpeed() zu fehlen

Ob die Funktionen bei Taste1 = 1, 2, 4 gehen weiss ich nicht.
Das formatieren kostet viel überflüßige Zeit, wenn man es nicht sofort macht.

Gruß Sternthaler

P.S.: Versuch einmal, ob der Asuro anders reagiert, wenn du sofort nach dem Einschalten einen der ersten 3 Taster drückst.
Dann sollte das 'Menü' ja schon ausgewählt werden. Aber ob dann nicht die 4-fach-Tastenabfrage blockiert?