Vorrei usare il tuo codice al posto del mio, questo è il tuo:
uint8_t S; // Stato dell'encoder.
uint8_t So; // Stato precedente dell'encoder.
uint8_t X; // Passaggio per lo zero, usato per evitare letture multiple.
int8_t E; // Lettura finale dell'encoder: +1, 0 o -1.
void leggi_Encoder(){
E=0;
// PD 76543210
// S=3-(PIND>>3)&B00000011; // Se l'encoder è collegato a PD4 e PD3, devo scorrere a destra di 3 bit, per farli diventare i bit 1 e 0.
// S=3-PIND&B00000011; // Se l'encoder è collegato agli I/O 1 e 0, che sono PD1 e PD0, non devo scorrere a destra.
S=3-((PIND>>4) & B00000011); // Se gli I/O 5 e 4 sono PD5 e PD4, devo scorrere a destra di 4 bit.
// Il valore binario di S rappresenta A e B. Il centrale dell'encoder è a massa, quindi faccio complemento a 3 (11).
// Volendo usare digitalRead (che è un po' più lento):
// S=3 -digitalRead(encoderA) -2*digitalRead(encoderB);
// digitalRead ritorna HIGH o LOW, definiti 1 e 0.
S^=S>>1; // Faccio XOR (^) fra S (gray) e il suo bit 1, facendolo scorrere a Dx: AB XOR A,
// ottenendo un binario che per ogni scatto fa 0-1-2-3-0 oppure 0-3-2-1-0.
if(S!=So && S==0) X=0;
if(X==0)
{
if(S==2)
{
X=1;
if(So==1) {E=1;}
else if(So==3) {E=-1;}
}
else if(S==0) {E=0; X=0;}
So=S;
}
} // FINE Encoder().
Questo è il mio:
void leggi_Encoder() {
direzione = 0;
premuto = 0;
while(direzione==0 && premuto==0){
int a = digitalRead(Clk);
int b = digitalRead(Dt);
if (a == HIGH && b == LOW) {
direzione--;
} else if (a == LOW && b == HIGH) direzione++;
if (digitalRead(pin_pul) == 0) premuto = 1;
}
}
Ho definito così le variabili dell'encoder:
#define Clk 3
#define Dt 2
#define pin_pul 4
Il mio codice è molto più semplice da capire.
Nella pratica qual'è la differenza tra il mio e il tuo?
Nel mio, il ciclo gira finchè non viene premuto il tasto o girato la manopola, restituendo -1 o 1 in base alla direzione, quando torna alla routine che l'ha chiamata, in base al valore della variabile direzione, viene incrementata o diminuita un'altra variabile.
Del tuo ho capito, solamente, che legge direttamente il bit del registro adibito ai pin da 0 a 7.
Come si può trasformare il tuo codice in modo da ottenere in uscita le variabili che interessano a me, cioè: direzione e premuto?
al mio file su Arduino ho aggiunto questo:
I pin si possono leggere anche tramite i registri adibiti ai pin.
PINB è un registro a 8 bit, legge i pin da 8 a 13, il bit 0 corrisponde al pin 8, cosi via fino al bit 5 che corrisponde al pin 13
PINC è un registro a 8 bit, legge i pin da A0 a A5, il bit 0 corrisponde al pin A0, così via fino al bit 5 che corrisponde al pin A5
PIND è un registro a 8 bit, legge i pin da 0 a 7, il bit 0 corrisponde fino al pin 0, così via fino al bit 7 che corrisponde al pin 7
E' tutto giusto?