Assolutamente il flip-flop non e indispensabile. Basta aggiungere poche righe di codice.
Per ogni ciclo di due inversioni l'errore di sincronismo sarà sempre è comunque di un singolo step. Piuttosto che matematicamente direi non prevedibile, ma in ogni caso ai fini pratici ininfluente. Gli strumenti di misura che utilizzo di solito non hanno una precisione assoluta e il valore reale sarà sempre compreso tra due valori, questo non mi impedisce di usarli!
Se ricordo bene nella tua prima versione di SW avevi una filettatura che si accorciava, ad ogni giro, di diversi step, non capisco come un'errore di sincronismo di un singolo step ti sia inaccettabile!
La sostanziale differenza tra utilizzo dell'interruzione su l'over flow del timer e l'interruzione sul cambio di stato di uno degli ingressi sono a mio avviso diverse:
1) Caricando il valore di divisone nel timer avrai un tempo tra un'interruzione e la successiva proporzionale al valore stesso di divisione, tu invece avrai sempre e comunque un'interruzione ad ogni fronte di salita. Quindi la tua routine di interrupt deve essere necessariamente breve, e contenuta (in termini di tempo) tra due fronti di salita, nel mio caso l'unico limite è il tempo impiegato per caricare il timer.
2) Volendo posso scegliere se caricare il valore di divisione nel timer direttamente o caricare valore 255 e leggere ogni singolo fronte di salita e discesa.
3) Utilizzando interruzione sul cambio di stato di uno degli ingressi, quando viene superata la frequenza massima di funzionamento, esso smette di funzionare, nel mio caso utilizzando timer e caricando il valore di divisione direttamente in esso, questo non succede.
4) Il timer di solito hanno dei divisori, che si possono impiegare per diminuire la risoluzione dell'encoder.
5)
Utilizzare encoder con risoluzioni maggiori, sul mio tornio con una vite madre di 4mm, ho una riduzione meccanica di 4:1, ed ho il driver impostato ad un'1/8 di step.
L'utilizzo del timer mi ha permesso, di avere sincronizzati anche gli avanzamenti, di implementare la rampa di accelerazione nella fase di ritorno e posso retrocede il carro ad una velocità differente da quella con cui avanza ed infine di utilizzare una risoluzione maggiore (mi infastidiva la tipica rotazione a scatti dei passo passo, sopratutto quando utilizzavo gli avanzamenti più piccoli).