Qualche idea?
questo è il codice che uso ora, ma che calcola gli rpm solo dopo aver generato l'impulso di uscita.
void counterISR()
{
TCCR1B |= (1 << CS11);
val=!val;
fire=true;
}
ISR(TIMER1_COMPA_vect)
{
if(!NotRun && fire) PORTD = PORTD | B00010000;
else PORTD =PORTD & B11101111;
TCCR1B &= ~(1 << CS11);
fire=false;
flag=true;
if(val) tempo_iniziale=micros();
if(!val)tempo_finale=micros();
if(tempo_finale>=tempo_iniziale) {freq=(int)(1000000.0/(tempo_finale-tempo_iniziale));}
if(tempo_finale<tempo_iniziale) {freq=(int)(1000000.0/(tempo_iniziale-tempo_finale));}
if(freq<0) freq=0;
if(freq>250) freq=250;
}
al fronte di salita in ingresso si va in counterISR dove abilito il conteggio di timer 1 in ctc.
Quando timer1 arriva a OCR1A (settata di volta in volta nel loop in base alla freq di rotazione) si passa in TIMER1_COMPA_vect che alza il pin di uscita così ritardato del valore che voglio e poi calcolo la freq di rotazione...lo faccio così perchè introduco meno ritardo rispetto a farla quando arriva il primo fronte nell counterISR.
Facendo così però, il ritardo che applico (OCR1A) è calcolato sulla frequenza tra un fronte e quello successivo e quindi il timer applica il vero valore di ritardo solamente al secondo fronte, perchè al primo fronte OCR1A non è settato al valore giusto in quanto per ricavare tale valore serve la frequenza che viene calcolata solo all'arrivo del fronte successivo, il secondo.