Buona Domenica a tutti,
ho scritto questo codice per conoscere la posizione di un encoder in quadratura
il canale A e connesso con il PIN 2 che richiama un interrupt ogni volta che cambia stato
il canale B e connesso con il PIN 4 per determinare la direzione
volatile int encoder0Pos = 0; // posizione attuale
void setup(){
Serial.begin(57600);
pinMode(2, INPUT);
pinMode(4, INPUT);
attachInterrupt(0, doEncoderA, CHANGE); // encoder A channel on interrupt 0 (arduino's pin 2)
}
void loop(){
Serial.println(encoder0Pos);
}
void doEncoderA() { // pin no 2
digitalRead(2) ^ digitalRead(4) ? encoder0Pos -- : encoder0Pos ++ ; // se i due segnali sono uguali decremente, altrimenti incrementa
//PIND & _BV(2) ^ PIND & _BV(4) ? encoder0Pos -- : encoder0Pos ++ ;
}
il codice funziona, ma per rendere la routine interrupt più veloce volevo cambiare questa riga
digitalRead(2) ^ digitalRead(4) ? encoder0Pos -- : encoder0Pos ++ ;
con questa
PIND & _BV(2) ^ PIND & _BV(4) ? encoder0Pos -- : encoder0Pos ++ ;
andando a leggere direttamente lo stato dei PIN
in questo caso girando l'encoder in un senso encoder0Pos diminuisce, girando nell'altro senso varia da 0 a 1 poi 0 poi 1 .......
Mi sfugge qualcosa? cosa non và?
grazzie a tutti