79 lines
2.5 KiB
C++
79 lines
2.5 KiB
C++
|
|
|
|
|
|
|
|
int encoderPin1 = 2;
|
|
int encoderPin2 = 3;
|
|
|
|
volatile int A_lastEncoded = 0;
|
|
volatile long A_encoderValue = 0;
|
|
volatile int B_lastEncoded = 0;
|
|
volatile long B_encoderValue = 0;
|
|
|
|
long A_lastencoderValue = 0;
|
|
long B_lastencoderValue = 0;
|
|
|
|
int lastMSB = 0;
|
|
int lastLSB = 0;
|
|
ISR (PCINT1_vect){
|
|
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
|
|
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
|
|
|
|
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
|
|
int sum = (A_lastEncoded << 2) | encoded; //adding it to the previous encoded value
|
|
|
|
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) A_encoderValue ++;
|
|
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) A_encoderValue --;
|
|
|
|
A_lastEncoded = encoded;
|
|
}
|
|
void setup() {
|
|
Serial.begin (9600);
|
|
*digitalPinToPCMSK(A5) |= bit (digitalPinToPCMSKbit(A5)); // enable pin
|
|
PCIFR |= bit (digitalPinToPCICRbit(A5)); // clear any outstanding interrupt
|
|
PCICR |= bit (digitalPinToPCICRbit(A5));
|
|
*digitalPinToPCMSK(A4) |= bit (digitalPinToPCMSKbit(A4)); // enable pin
|
|
PCIFR |= bit (digitalPinToPCICRbit(A4)); // clear any outstanding interrupt
|
|
PCICR |= bit (digitalPinToPCICRbit(A4));
|
|
pinMode(encoderPin1, INPUT);
|
|
pinMode(encoderPin2, INPUT);
|
|
|
|
digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
|
|
digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
|
|
int i;
|
|
for(i = 6; i<13; i++)
|
|
pinMode(i,OUTPUT);
|
|
digitalWrite(10,1);
|
|
digitalWrite(11,0);
|
|
|
|
//call updateEncoder() when any high/low changed seen
|
|
//on interrupt 0 (pin 2), or interrupt 1 (pin 3)
|
|
attachInterrupt(0, updateEncoder, CHANGE);
|
|
attachInterrupt(1, updateEncoder, CHANGE);
|
|
|
|
}
|
|
int j=100;
|
|
void loop(){
|
|
//Do stuff here
|
|
analogWrite(9,j);
|
|
|
|
Serial.print(j);Serial.print("\t");Serial.println(B_encoderValue);
|
|
j++;B_encoderValue=0;
|
|
delay(500); //just here to slow down the output, and show it will work even during a delay
|
|
if(j==256)return;
|
|
}
|
|
|
|
|
|
void updateEncoder(){
|
|
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
|
|
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
|
|
|
|
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
|
|
int sum = (B_lastEncoded << 2) | encoded; //adding it to the previous encoded value
|
|
|
|
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) B_encoderValue ++;
|
|
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) B_encoderValue --;
|
|
|
|
B_lastEncoded = encoded;
|
|
}
|