/************************************************************************/ /* */ /* Reading rotary encoder */ /* one, two and four step encoders supported */ /* */ /* Author : Uwe Kolz ( encode function ) */ /* Example frame : Peter Dannegger */ /* */ /************************************************************************/ #include #include // target: ATtiny2313 ( was ATmega16 in original ) //------------------------------------------------------------------------ #define XTAL 8e6 // 8MHz #define PHASE_A (PIND & 1< return dgHist = dgHist<<2; dgHist = ( dgHist | dgVal ) & 0b00111111; //////////////////////////////////////////////////////////////////// // Uncomment one of the switch statement to select the resolution // //////////////////////////////////////////////////////////////////// switch (dgHist) // 1:1 single step encoders { case 0b100001: return 1; break; case 0b010010: return -1; break; default: return 0; break; } /* switch (dgHist) // 1:2 two step encoders { case 0b111000: return 1; break; case 0b000111: return 1; break; case 0b110100: return -1; break; case 0b001011: return -1; break; default: return 0; break; } */ /* switch (dgHist) // 1:4 four step encoders { case 0b111000: return 1; break; case 0b100001: return 1; break; case 0b000111: return 1; break; case 0b011110: return 1; break; case 0b110100: return -1; break; case 0b010010: return -1; break; case 0b001011: return -1; break; case 0b101101: return -1; break; default: return 0; break; } */ return 0; } ISR( TIMER0_COMPA_vect ) // 1ms for manual movement { enc_delta += encode( PHASE_A, PHASE_B ); } int8_t encode_read( void ) // read single step encoders { int8_t val; cli(); val = enc_delta; enc_delta = 0; sei(); return val; // counts since last call } int main( void ) { int32_t val = 0; LEDS_DDR = 0xFF; PIND = 0b11; encode_init(); sei(); val = 0b11111111; while (1) { val += encode_read(); // read a single step encoder LEDS = val; } }