Vielen Dank schon mal für eure Hilfe.

@ranke: Wie ich gerade sehe, gibt es diese sehr kleinen Lichtschranken (4x5x5mm) leider bei Pollin nicht mehr. Im Datenblatt wird eine Reaktionszeit von 10µs versprochen, was 100kHz entspricht. Sollte also reichen. Ich kann aber leider nicht überprüfen wie sehr die Signale verschiffen werden, daher habe ich ja auch einen Schmitt-Trigger dahinter geschaltet. Die Hysterese sollte die Signale wieder verbessern.
Diesen Punkt werde ich aber sicher anschauen, wenn ich ein Oszi finde.
Das mit den nicht symmetrischen Flanken war mir auch bei meinen ersten Versuchen aufgefallen. Die Scheibe ist sicher nicht ganz eben und eiert ein ganz wenig. Auch ist es nicht leicht nur mit bloßem Auge die Lichtschranken an der Scheibe auszurichten. Ich dachte aber, dass dies kein Problem sei und nur die Dauer einer Periode zählt. Die Signalverläufe von A und B sind nur etwas verschoben, so dass zwei Flanken dicht hintereinander kommen und dann eine längere Pause ist.
Kommen zwei Flanken dicht hintereinander, so wird bei der ersten, die ISR angestoßen und bei der zweiten der Interrupt zwar gesetzt, aber erst im Anschluss an die erste ISR bearbeitet. Dann liegen die Signale ja immer noch an und sollten daher auch richtig verarbeitet werden. Der dritte Interrupt kommt wieder ganz normal.

@pongi
Leider habe ich nicht so viele Timer in µC. Einen verwende ich bereits für die PWM, ein zweiter ist für periodische Abfragen (mach alle 100ms etwas) und die Uhrzeit zuständig. Der letze Timer wird wohl ein RC-Signal von einer Fernsteuerung auswerten und im Moment mache ich ja eigentlich auch nichts anderes als bei jedem Interrupt einen Zähler hochzusetzen und alle 100ms nachzuschauen welchen Wert dieser hat.

@oberallgeier
Noch ist unser Robi kein Pendel und er fährt ganz „normal“ mit Stützrad. Für die Regelung der Motoren ist es auch gar nicht von so großer Bedeutung, außer die nötige Reaktionszeit und die häufigen Richtungswechsel. Daher soll bei der Motorregelung dieses ja mit bedacht werden. Durch die häufigen Richtungswechsel müssen also beide Flanken ausgewertet werden, sonst gehen Richtungswechsel verloren. Naja und je schneller, desto besser.
Das mit dem Lagerspiel habe ich ehrlichgesagt gar nicht richtig bedacht und du hast absolut recht, das es keinen Sinn macht die Motordrehung hoch genau zu messen, um hinterher das Lagerspiel auszuregeln.
Nun denn, ich habe eine Getriebeübersetzung von 1:40 und Reifen mit einem Umfang von 31cm.
Bild hier  
Hmm, 0.07° Auflösung nach dem Getriebe, das ist ja echt verdammt wenig. Dann würde ich ja auch 0,06 mm Strecke messen können. Also mit Panzern auf Spatzen schießen kann man als Vergleich ruhig heranziehen.
Die Übertragung der Daten wurde aber nicht in der ISR, sondern im Hauptprogram gemacht.

Ziel war es eigentlich die Regelung der Motoren alle 10 ms durchführen zu können. Das schnellst was wir geschafft haben waren aber 20ms mit Fehlern. Wir haben mal das ganze in einem Diagramm aufgezeichnet. Der Motor ist ohne Belastung angeschlossen. Der Sollwert (grüne Linie) wird immer weiter erhöht, bei 255 gehalten und dann auf 0 gesetzt. Die lila Linie zeigt die Drehzahl des Motors in Flanken/20ms, wobei gut zu sehen ist, dass der Motor am Anfang noch etwas steht und sich dann der Solllinie nähert. Ab etwa 210Flanken/20ms (etwa 4900 upm) steigt der Fehlerzähler und die wirkliche Drehzahl wird nicht mehr richtig gemessen.

Fazit
Ich werde also die Schlitze auf 16 halbieren und die Regelung verlangsamen.