
#include <avr/io.h>
#include <avr/interrupt.h>

#define A       PIND1 // Schalter A im Drehgeber 
#define B       PIND0 // Schalter B im Drehgeber
#define P       PIND2 // Taster im Drehgeber
#define Geber   PIND  // Drehgeber Port
#define Ausgabe PORTB // Ausgabe Port zum Testen

volatile unsigned char richtung = 0;  // 0 ... 255

ISR(TIMER0_OVF_vect)
{
  static unsigned char alter_status = 0,step = 0;
  unsigned char        neuer_status;

  neuer_status = Geber & (_BV(A) | _BV(B));     // Änderung einlesen
  if ((neuer_status ^ step)==(_BV(A) | _BV(B)))
  {
    if ((neuer_status ^ alter_status)==_BV(A))
      richtung +=1; // Es war nach rechts
    else
      richtung -=1; // Es war nach links
    step = neuer_status;
  }
  alter_status = neuer_status;
}

int main( void )
{
  // Drehgeber Anschluß 
	DDRD  &= ~(_BV(PD0) | _BV(PD1)); // Pin's auf eingang setzen
	DDRB   = 0xFF;
  // Timer0 einstellen                   8,2ms bei 8MHz
	TCCR0B = 1<<CS01 | 1<<CS00;      // divide by 256 * 256 
	TIMSK  = 1<<TOIE0;               // enable timer interrupt
	sei();
	for(;;)                          // main loop
	Ausgabe  = ~richtung;
}
