neingeist
/
arduinisten
Archived
1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

82 lines
1.2 KiB
C++

15 years ago
#include <avr/interrupt.h>
#include <avr/io.h>
#include "WProgram.h"
void setup();
void loop();
int pinA = 11;
int pinB = 12;
int ledPin = 13;
void setup() {
//Timer2 Settings
TCCR2A = 0;
TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20;
//Timer2 Overflow Interrupt Enable
TIMSK2 = 1<<TOIE2;
// pullups
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
Serial.begin(9600);
}
volatile int8_t enc_delta; // -128 ... 127
static int8_t last;
ISR(TIMER2_OVF_vect) {
int8_t neu, diff;
// convert gray to binary
neu = 0;
if(digitalRead(pinA))
neu = 3;
if(digitalRead(pinB))
neu ^= 1;
diff = last - neu; // difference last - new
if( diff & 1 ) { // bit 0 = value (1)
last = neu; // store new as next last
enc_delta += (diff & 2) - 1; // bit 1 = direction (+/-)
}
}
int8_t val_alt;
void loop() {
int8_t val;
digitalWrite(13,HIGH);
cli();
val = enc_delta;
// enc_delta = val & 1;
sei();
if (val != val_alt) {
Serial.println(val>>1);
}
val_alt = val;
delay(100);
digitalWrite(13,LOW);
delay(100);
}
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}