Eccomi, ho trovato il tempo per giocare col codice.
Visto che di millis() e micros() non ci fidiamo, ho fatto altre prove:
1. impostato il pin 8 come output. Messo basso (tramite i registri) a inizio loop e messo alto a fine loop (nel mezzo c'e' la mia routine di interrupt). Attaccato l'oscilloscopio al pin 8 leggo circa 4uS di periodo.
2. ho usato proteus per contare i cicli di clock. Da quello che dice proteus, l'interrupt dovrebbe durare 11uS (stesso codice che ho provato con l'oscilloscopio).
Quando ho tempo provo a vedere il codice che produce il compilatore di arduino confrontato con quello di proteus... uno dei due imbroglia (o io non sono capace di usare proteus, che puo' starci).
McMax, ho capito quello che mi dici, vedro' di modificare il programma per rendere la routine di interrupt piu' snella.
E vedro' di commentare meglio il programma (avevo avvisato che era scritto da cani).
Per quanto riguarda il fatto di leggere un solo canale, se l'encoder ha risoluzione sufficiente perche' non dovrei? Tu usi un encoder da 3-400ppr x 4, io uso un encoder da 2000ppr x 1. Correggimi se sbaglio ma non credo che un encoder da 500ppr x 4 abbia maggior risoluzione rispetto ad un encoder da 2000ppr x 1.
Per quanto riguarda usare logiche esterne, avrei potuto ma a che pro? Mi sarei trovato sempre un segnale di clock e uno di dir. Il clock da mettere sotto interrupt e controllare il dir. Tanto vale farglielo fare direttamente al programma, mi risparmio spazio sul pcb. Sempre se sbaglio correggimi.
@Mimoletti: si, ricordi giusto. La mia routine di interrupt e' praticamente identica a quella del russo. Ho solo fatto qualche adattamento ma il concetto resta quello.
Per le rampe vedremo quando montero' il tutto sul tornio (e' gia' tutto pronto, devo solo collegare l'arduino). Se funziona bene, altrimenti correggeremo il programma (per fortuna non ho scadenze e posso permettermi di fare-disfare quante volte voglio. E non e' una perdita di tempo perche' ogni volta imparo qualcosa di nuovo e mi diverto un sacco
)