Du lehrst schnell. Nur ein par kleinigkeiten.

Code:
int i,o1,l1;
int lData[2], oData[2];
char t1,t2,t3, taste;
Diesen variablen declarationen gehoren eigentlich im main funktion. Nur wenn sie 'global' benutz werden (das heist jeder function muss zugang haben oder andern konnen) mussen sie ausen die main funktion deklariert werden. Sondern konnte man damit fehlerhafte Code produzieren wenn mehrere funktionen auch die variablen i, t1, t2, t3, taste, lData[], oData[] in ihren code anrufen. (lies mal uber "Gültigkeitsbereich" in diesem C-tutorial hier im Roboternetz: http://www.rn-wissen.de/index.php/C-Tutorial)

while (1)
{
l1 = (lData[1]);
o1 = (oData[1]);


t1 = PollSwitch();
t2 = PollSwitch();
t3 = PollSwitch();

FrontLED(ON);
LineData (lData);
OdometrieData (oData);

Diesen vet gedruckte Zeilen wurde ich umdrehen. Erst mal die lData und oData mit Werte einstellen im LineData und OdometriData funktionen, und danach den Rechter Werten in i1 und o1 ubertragen. Am anfang des ausfuhren einer Programm kan jeder speicherplatz einer unbekante werte haben. Die sind nicht immer 0 (vieleicht schon 'immer nicht 0'), oder eine sichere wert die das program nicht absturzen lasst. Bei dem ersten eintrit der While-schleife werden diesen unsichere werten im speicherplatz im nachsten If's verglichen. Deine If's hier sind nicht kritisch, aber was wen da einer Wurzel-funtion steht der etwas von einer negatiefe werte machen mus? Das ist unmoglich! (na ja, ohne 'komplizierte' mathematik )

Code:
		if (l1 < 50)
		{
			if (o1 > 600) {rechts();}
			else {links();}
		}
Eigentlich sind die Variabelen l1 und o1 uberflussich. Du konnte hier auch (oData[1]>600) und (lData[1]<50) hinter if's setzen.