Приветствую. Использую код для обработки энкодера представленный здесь.
C digitalRead все работает (правда " перелистывает " сразу по 4 значения ) 0...4...8...12........
по совету из комментариев пытаюсь читать "0" из PIN на выходе белиберда. Подскажите , что я не так делаю?
C++:
// алгоритм с "таблицей", позволяющий увеличить точность энкодера
// в 4 раза, работает максимально чётко даже с плохими энкодерами.
// Для увеличения скорости опроса используйте PCINT и чтение из PINn
#define CLK 3
#define DT 2
long pos = 0;
byte lastState = 0;
const int8_t increment[16] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
void setup() {
Serial.begin(9600);
}
void loop() {
byte state = digitalRead(CLK) | (digitalRead(DT) << 1);
if (state != lastState) {
pos += increment[state | (lastState << 2)];
lastState = state;
Serial.println(pos);
}
}
по совету из комментариев пытаюсь читать "0" из PIN на выходе белиберда. Подскажите , что я не так делаю?
C++:
long pos = 0;
int8_t lastState = 0;
const int8_t increment[16] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
void setup() {
Serial.begin(9600);
DDRC &=~((1<<PC2)|(1<<PC3));
PORTC |= (1 << PC2)| (1 << PC3) ;
PCICR |= (1 << PCIE1);
PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);
}
ISR(PCINT1_vect) {
// uint8_t state = ~PINC&(1<<PC2) | (~PINC&(1<<PC3) << 1);
uint8_t state = digitalRead(A2) | (digitalRead(A3) << 1);
if (state != lastState) {
pos += increment[state | (lastState << 2)];
lastState = state;
pos=constrain(pos,0,255);
Serial.println(pos);
}
}
void loop() {
}