Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const byte XORout_pin = 2; // XOR output pin
- const byte chanA_pin = 4; // XOR channel A pin
- const byte chanB_pin = 5; // XOR channel B pin
- int chanA, chanB, XOR;
- long pos_counter = 0; // position counter
- short XORstate = 4;
- short XORstate_ = XORstate; // buffer
- boolean hasChanged = 0; // checking for changes in the position counter
- void setup() {
- pinMode(XORout_pin, INPUT);
- pinMode(chanA_pin, INPUT);
- pinMode(chanB_pin, INPUT);
- attachInterrupt(digitalPinToInterrupt(XORout_pin), trigger, CHANGE);
- Serial.begin(9600);
- }
- void trigger() {
- hasChanged = true;
- }
- void loop() {
- if(hasChanged) {
- hasChanged = false;
- XOR = digitalRead(XORout_pin);
- chanA = digitalRead(chanA_pin);
- chanB = digitalRead(chanB_pin);
- XORstate = (1 << 2) | ((chanA != 0) << 1) | (chanB != 0);
- if (XORstate_ == XORstate) {
- Serial.println("XOR state is identical");
- } else if ((~XORstate_ & 3) == (XORstate & 3)) {
- Serial.println("XOR state is inverted");
- } else if ((XORstate_ & 1) == ((XORstate & 2) >> 1)) {
- pos_counter--;
- } else {
- pos_counter++;
- }
- XORstate_ = XORstate;
- Serial.println(pos_counter);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement