Hey Hardest,
Valen schreibt ja schon, dass dein Programm gut aussieht.
Es funktioniert auch gut.

Fahre für 10 Sekunden ohne Hindernis, dann 1 Sec zurück. --> OK

Fahre, und wenn Hindernis rechts/links auftaucht, weiche rückwärts links/rechts aus. --> OK

Wenn ein Hindernis erkannt wurde, die Rückwärtsfahrt gerade beendet ist, und dann auch noch die 10 Sekunden abgelaufen ist, dann sieht es sehr Merkwürdig aus, da nach dem rückwärtigen Ausweichen mit Drehung ja noch ein Stück gerade rückwärts gefahren wird. --> Aber das ist auch OK


Du solltest die beiden Strippen an deinem rechten Motor mal tauschen, dann muss nicht jeder in deinem Programm das RWD und FWD auf einen korrekten Motoranschluss anpassen.

Valen hat den Spannungsabfall angesprochen.
Wichtig ist der Jumper neben dem Ein-/Ausschalter in Kombination mit der Stromversorgung.
Akku -> Jumper gesteckt
Batterie -> Jumper weglassen

Beide Fälle sind nur so sinnvoll.

Akkus bringen nur 4 * 1,2V = 4,8V. Der Jumper überbrückt eine Diode, so dass die 4,8 V als Betriebspannung da sind. --> Saft reicht gerade noch.

Batterien haben 4 * 1,5V = 6,0V. Ohne Jumper ist nun die Diode noch in Reihe mit der Stromversorgung und reduziert nun die 6,0V um 0,7V auf 5,3V. --> CPU bleibt heile.

Hier nochmal eine von mir 'aufgeräumte' Version von deinem Programm:
Code:
#include "asuro.h"

/*----------------------------------------------------------------------------
  Funktionsdeclarationen
----------------------------------------------------------------------------*/
                  void  erwarten  (
        unsigned  int   male);
                  void  FWARD (
                  void);
                  void  RWARD (
                  void);
                  void  RWDL (
                  void);
                  void  RWDR (
                  void);
                  void  STOP (
                  void);
                  void  collision (
        unsigned  int   lang);

/*----------------------------------------------------------------------------
  Hauptprogramm
----------------------------------------------------------------------------*/
                  int   main (
                  void)
{
  Init ();

  /*
    Ab hier beginnt Rolf zu "Leben"
    Morgenmassage senden
  */
  SerPrint ("\r\nMuah... muss ich aufstehen?\r\n");

  /*
    Rolfs Ablaufchema in eine unendliche Schleife setzen.
  */
  while (1)
  {
    /*
      Rolf wartet erstmal ab.
    */
    erwarten (1);

    /*
      Rolf startet Kollisionsfahrt.
    */
    collision (10000);

    /*
      miau
    */
    RWARD ();
    Msleep (1000);
    STOP ();
  }

  /*
    Rolfs Durchdrehverhinderungsschleife
  */
  while (1);
  return 0;
}

/*----------------------------------------------------------------------------
  Funktion erwarten()
  Rolf wartet auf etwas
----------------------------------------------------------------------------*/
                  void  erwarten  (
        unsigned  int   male)
{
        unsigned  int   i;

  for (i = 0; i <= male; i++)
  {
    Msleep (500);
    StatusLED (GREEN);
    Msleep (10);
    BackLED (OFF, ON);
    Msleep (500);
    StatusLED (OFF);
    Msleep (10);
    BackLED (ON, OFF);
    Msleep (500);
    BackLED (OFF, ON);
    Msleep (500);
    BackLED (ON, OFF);
  }
  StatusLED (OFF);
  BackLED (OFF, OFF);                   // Schalte alles ab
}

/*----------------------------------------------------------------------------
  Funktion FWARD()
  Rolf vorwaerts
----------------------------------------------------------------------------*/
                  void  FWARD (
                  void)
{
  FrontLED (ON);                        // Kuendige Anfahren an
  Msleep (300);
  FrontLED (OFF);
  Msleep (150);
  FrontLED (ON);
  Msleep (300);
  FrontLED (OFF);
  MotorDir (FWD, FWD);                  // Beide Motoren vorwaerts
  MotorSpeed (150, 150);                // Los gehts
}

/*----------------------------------------------------------------------------
  Funktion RWARD()
  Rolf rueckwaerts
----------------------------------------------------------------------------*/
                  void  RWARD (
                  void)
{
  MotorDir (RWD, RWD);                  // Beide Motoren rueckwearts
  MotorSpeed (120, 120);                // Los gehts
}

/*----------------------------------------------------------------------------
  Funktion RWDL()
  Rolf rueckwaerts links
----------------------------------------------------------------------------*/
                  void  RWDL (
                  void)
{
  MotorDir (RWD, RWD);                  // Beide Motoren rueckwearts
  MotorSpeed (120, 0);                  // Los gehts
}

/*----------------------------------------------------------------------------
  Funktion RWDR()
  Rolf rueckwaerts rechts
----------------------------------------------------------------------------*/
                  void  RWDR (
                  void)
{
  MotorDir (RWD, RWD);                  // Beide Motoren rueckwearts
  MotorSpeed (0, 120);                  // Los gehts
}

/*----------------------------------------------------------------------------
  Funktion STOP()
  Rolf stoppen
----------------------------------------------------------------------------*/
                  void  STOP (
                  void)
{
  MotorSpeed (0, 0);                    // Feierabend
  FrontLED (OFF);                       // Nix Licht
}


/*----------------------------------------------------------------------------
  Funktion collision()
  Rolf Kollisionsprogramm
----------------------------------------------------------------------------*/
                  void  collision (
        unsigned  int   lang)
{
        unsigned  long  zeit = 0;
        unsigned  long  startzeit = Gettime ();
        unsigned  char  t1;
        unsigned  char  t2;

  while (zeit < (startzeit + lang))     // Fahre so lange wie zeit gegeben ist
  {
    t1 = PollSwitch ();
    t2 = PollSwitch ();

    /*
      Nur dann die Tasten auswerten, wenn beide Abfragen identische Werte
      geliefert haben. Sonst gehen wir von Schrottdaten aus.
    */
    if (t1 == t2)
    {
      if (t1 == 0)                      // Keine Taste gedrueckt, vorwaerts
      {
        FWARD ();                       // Auf gehts (dauert 750 ms)
      }
      else
      {
        STOP ();                        // Stoppen
        if (t1 & 0x07)                  // Linke tasten beruehrt
        {
          RWDL ();                      // LinksRueckwaerts ausweichen
          SerPrint ("\r\n     Hab links was beruehrt, weiche aus...\r\n");
        }
        if (t1 & 0x38)                  // Rechte tasten beruehrt
        {
          RWDR ();                      // RechtsRueckwearts ausweichen
          SerPrint ("\r\n     Hab rechts was beruehrt, weiche aus...\r\n");
        }
        Msleep (1000);                  // Eine Sekunde rueckwarts fahren
      }
    }
    zeit = Gettime ();

    SerPrint ("\r\nWiederhole Schleife fuer Collisionsfahrt\r\n"); // 44*5ms= 200 ms
    PrintLong (zeit);
  }
  STOP ();
  SerPrint ("\r\nVerlasse Collisionsschleife.\r\n");
}
Leider musst du nun RWD und FWD wieder tauschen. Oder besser löten.

Gruß Sternthaler