#include "avr/interrupt.h";
volatile int value = 0;
volatile int lastEncoded = 0;
void setup()
{
// set pins 3 and 4 to input
// and enable pullup resisters
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(1, OUTPUT); // set pins 1 and 2 to output
pinMode(2, OUTPUT);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
GIMSK = 0b00100000; // Enable pin change interrupts
PCMSK = 0b00011000; // Enable pin change interrupt for PB3 and PB4
sei(); // Turn on interrupts
}
void loop()
{
if( value == 1 || value == 2)
{
digitalWrite(value, LOW);
delay(15);
value = 0;
}
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
}
// This is the ISR that is called on each interrupt
// Taken from http://bildr.org/2012/08/rotary-encoder-arduino/
ISR(PCINT0_vect)
{
int MSB = digitalRead(3); //MSB = most significant bit
int LSB = digitalRead(4); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
value = 1;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
value = 2;
lastEncoded = encoded; //store this value for next time
}