Hallo spomue,
willkommen im Forum.

Es sollte reichen, wenn du das ausserhalb der main() while(1)-Loop liegende EncoderInit(); in die While(1)-Schleife verschiebst. Im EncoderInit() wird alles für die Odometrie- und damit für die Encoder-Funktionalität wieder initialisiert.

Wie von trapperjohn schon angedeutet bringt das Schalten an den Back-LED's tatsächlich alles durcheinander.
Sinnvoll wäre dann wohl die Position direkt nach deinem BackLED(OFF,OFF);. Denn auch ein (OFF,OFF) fummelt an den Port-Pins PC0 und PC1 rum.

Viel Erfolg
Gruß Sternthaler

P.S.: Warum kommt dann immer eine 0 aus der Speed()-Funktion?
Es müsste daran liegen, dass die Umschaltung des doppelt belegten Port-Pins (Odometrie bzw. Back-LED's) dazu führt, dass beim ODO messen immer ein gleiches Ergebnis gemessen wird. Ist aber das Ergebnis immer gleich, kann die Encoder-Funktion keinen Schwarz-/Weis-Wechsel feststellen. Somit werden keine Tik's gezählt und somit steht der Asuro. -> Speed() = 0;