Klar, sobald er den Strich verlässt gilt Bedingung 3: Mit SPEED vorwärts.

Hier sind wir nun am Beginn eines tollen neuen Linienfolgeprogramms made by inka ...

Nachtrag: Das ist mir natürlich peinlich, aber man sollte immer die Version Posten die auch im asuro läuft. Es war oben ein Bug drin, bei i==0 wurde MotorSpeed erst nach der } gesetzt. Sorry. Hier das selbe mit Korrektur:
Code:
#include "asuro.h"
#define SPEED  200 
int speedLeft,speedRight; 
unsigned int lineData[2]; 
int ADOffset; 
void LineLeft (void) //fahre nach rechts zu linie 
{ 
   speedRight  -=5; //rechts bremsen
   if (speedRight < 100) speedRight = 100; //min speed rechts 
} 
void LineRight (void) //fahre nach links zu linie 
{ 
   speedLeft  -=5; //links bremsen 
   if (speedLeft < 100) speedLeft = 100; //min speed links 
} 
void LineDemo(void)
{ 
int i; 

unsigned char j; 
   FrontLED(ON); 
   // Die folgende Mehrfachabrage der LineDatas ist völlig sinnfrei! 
   for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re 
   //  Hier beginnt der Ernst des asurolebens 
   LineData(lineData); 
   // bei data[0]=data[1] ist adoffset=0 d.H. der Unterschied wird einmalig 
   // berechnet und als adoffset gespeichert das gibt Probleme bei 
   // Helligkeitsänderungen von der Seite bei der Fahrt. 
   // Es wird dann später auf grösser/kleiner null geprüft. 
   ADOffset = lineData[0] - lineData[1]; 
   speedLeft = speedRight = SPEED; 
   MotorSpeed(speedLeft,speedRight); 
   for(;;) { 
      LineData(lineData); 
      i = (lineData[0] - lineData[1]) - ADOffset; 
     SerWrite("\n\r  i: ",9); 
     PrintInt(i); 

/*  dadurch muss auch darauf geprüft werden, also i<0 oder i>0 
     aber bei i==0 darf nichts passieren, sonst ewige Kurve! 
     deshalb vorsichtshalber 3 vollwertige ifs 
*/ 
      if ( i > 0 ) { 
         //StatusLED(GREEN); 
       BackLED(OFF,ON); //blinker rechts 
         LineLeft(); //fahre nach rechts zu linie 
      } 
      if ( i < 0) { 
         //StatusLED(RED); 
       BackLED(ON,OFF); //blinker links 
         LineRight(); //fahre nach links zu linie 
      } 
      if ( i == 0) { 
         StatusLED(YELLOW); 
         speedLeft = speedRight = SPEED; 
      MotorSpeed(speedLeft,speedRight);
      } 
   }
}
int main(void) 
{ 
   Init(); 
   LineDemo (); 
   while(1); 
   return 0; 
}
Das ganze ist natürlich nicht optimal. Der in adoffset gespeicherte Wert gilt nur für den Startpunkt, wirkt sich aber immer aus! Wie geschrieben, viel Spass beim Entwickeln eines eigenen Programms.