Timer 1 usato due volte in modi diversi

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.