Код
void freg1(void){
TCCR1B=(0<<ICES1)|(0<<CS10);//stop
TCNT1=0;
TIFR =(1<<TOV1);
TIMSK &=~_BV(TOIE1);
nover=0;
mover=0;
TCCR1B=(0<<ICES1)|(1<<CS10);//start
TIFR=(1<<ICF1);
while((TIFR&_BV(ICF1))==0);
if(TIFR &_BV(TOV1))
{
nover++;
TIFR =_BV(TOV1);
}
ntick2=nover;
ntick1=ICR1;
TIMSK |=_BV(TOIE1);
mtick1=TCNT0;
mtick2=mover;
N1=((uint32_t)(ntick2)<<16)+(uint32_t) ntick1; //системные тики
M1=((uint32_t)(mtick2)<<8) +(uint32_t) mtick1; //входные тики
}
void freg2(void){
while(TCNT1<65525);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
TIFR=(1<<ICF1);
while((TIFR&_BV(ICF1))==0);
ntick2=nover;
ntick1=ICR1;
mtick1=TCNT0;
mtick2=mover;
N2=((uint32_t)(ntick2)<<16)+(uint32_t) ntick1;
M2=((uint32_t)(mtick2)<<8) +(uint32_t) mtick1;
N=N2-N1;
M=M2-M1;
Fx=12000000.0*(float)M/(float)N;
}
TCCR1B=(0<<ICES1)|(0<<CS10);//stop
TCNT1=0;
TIFR =(1<<TOV1);
TIMSK &=~_BV(TOIE1);
nover=0;
mover=0;
TCCR1B=(0<<ICES1)|(1<<CS10);//start
TIFR=(1<<ICF1);
while((TIFR&_BV(ICF1))==0);
if(TIFR &_BV(TOV1))
{
nover++;
TIFR =_BV(TOV1);
}
ntick2=nover;
ntick1=ICR1;
TIMSK |=_BV(TOIE1);
mtick1=TCNT0;
mtick2=mover;
N1=((uint32_t)(ntick2)<<16)+(uint32_t) ntick1; //системные тики
M1=((uint32_t)(mtick2)<<8) +(uint32_t) mtick1; //входные тики
}
void freg2(void){
while(TCNT1<65525);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
TIFR=(1<<ICF1);
while((TIFR&_BV(ICF1))==0);
ntick2=nover;
ntick1=ICR1;
mtick1=TCNT0;
mtick2=mover;
N2=((uint32_t)(ntick2)<<16)+(uint32_t) ntick1;
M2=((uint32_t)(mtick2)<<8) +(uint32_t) mtick1;
N=N2-N1;
M=M2-M1;
Fx=12000000.0*(float)M/(float)N;
}
Может коряво

Еще охота избавится от флоат, но не знаю как.