.. Aber beiden Drehrichtungen macht "Direction" zwischendurch Pegelwechsel. Ist das richtig und wie würde man das im µC auswerten? ..
Es gibt sicher mehrere Lösungswege. Meine Lösung benutzt den Interrupt 0 oder 1 (evtl. bei mehreren Motoren/Encoderspuren zusätzliche Interrupts). Getriggert wird auf "jede Flanke" - und dann guckt man eben: ist das triggernde Signal high und das der zweiten Encoderspur low, oder hh, ll oder lh, und reagiert darauf. Ausserdem wird natürlich der Zeitablauf zwischen zwei Interrupts festgehalten und daraus die momentane Geschwindigkeit errechnet. Fehler durch verzögerten Interrupt entstehen natürlich. Siehe auch das Schema (vom Motortreiber archie):

......Bild hier  

Meine Auswerteroutine sieht dann z.B. so aus (mega1284) :
Code:
// ============================================================================= =
// ===  Nicht unterbrechbare ISR für EXT_INT0 auf mega1284      ================ =
// Der Timer tmrE0 für Laufzeit des EXT_INT0 wird ausgelesen
 ISR(INT0_vect)                 // INT0 triggert auf RISING edge => 
 {                              //   => Wenn Aufruf, dann PORTD2 = high
//      Encoderticks Iencdrx nur hochzählen, IencBx rauf- od runterzählen
  Iz_diff0  = tmrE0;    // Hier die Zeit (in x 50µs-tupsi) seit letztem ISR-Aufruf
  tmrE0     =    0;     // Resetten ##>> IN der ISR ohne CLI/SEI möglich
  Iencdr0 ++;           // Incrementiere Encodercounter, zählt NUR aufwärts
  if (IsBitSet (PINC, 2)) IencB0++;     // Rad treibt vorwärts,  math. negativ
  else                    IencB0--;     // Rad treibt rückwärts, math. positiv
 }      // Ende ISR(INT0_vect)
// ============================================================================= =
Aus dem Stand von Iencdr0 leite ich die Geschwindigkeit (Drehzahl bzw. Umfangsgeschwindigkeit Rad) ab. Der Stand IencB0 ergibt mir den aktuell zurückgelegten Winkel resp. Weg.