Ich hab sowas in Codevision für 2 Interrupts gemacht und den ATMEGA32. Läuft somit Quasi im Hintergrund.
Die Routine zählt zu einem Wert (li_frequ) entweder eine Variable (ui_increments) dazu oder zieht sie ab, je nach Drehrichtung.
Die Routine ist für einen optischen Drehencoder und hat deshalb keine Entprellung!

Code:
/* Called automaticly on INT 0 */
interrupt [2] void int0(void) {
     unsigned char uc_port=0,uc_mcucr=0;
     uc_port=PIND&0b00001000;
     uc_mcucr=MCUCR&0b00000001;
     if(uc_mcucr==0)
      {
      if (uc_port==8){
        li_frequ=li_frequ+ui_increments;
        }
      else{
        li_frequ=li_frequ-ui_increments;
        }
       MCUCR=MCUCR|0b00000011;
      }
     else{
        if (uc_port==8){
        li_frequ=li_frequ-ui_increments;
        }
        else{
        li_frequ=li_frequ+ui_increments;
        }
       MCUCR=MCUCR&0b11111110;    

      }
refresh=1;
}

/* Called automaticly on INT 1 */
interrupt [3] void int1(void) {
     unsigned char uc_port=0,uc_mcucr=0;
     uc_port=PIND&0b00000100;
     uc_mcucr=MCUCR&0b00000100;
     if(uc_mcucr==0)
      {
      if (uc_port==4){
        li_frequ=li_frequ-ui_increments;
        }
      else{
        li_frequ=li_frequ+ui_increments;
        }
       MCUCR=MCUCR|0b00001100;
      }
     else{
        if (uc_port==4){
        li_frequ=li_frequ+ui_increments;
        }
        else{
        li_frequ=li_frequ-ui_increments;
        }
       MCUCR=MCUCR&0b11111011;    
      }
refresh=1;
}