Dalej jest źle. Timer2 liczy za szybko w stosunku do prędkości wykonywania się programu głównego. Bo on zgłasza przerwanie co 25ms a program główny wykonuje się ponad 2000ms.
Musisz zatrzymywać Timer2 do czasu obsłużenia wyświetlacza.
Mniej więcej tak (algorytm):
While (1)
{
LCD "Start"
_delay_ms(1000); 'Nie wiem po co, ale jak to delay ma ma gdzieś być to tutaj.
Timer1 = 0
Timer2 = 0
pr = 0
Start Timer1
Start Timer2
while (pr == 0);
Stop Timer1
Stop Timer2
freq=(int)(i*0.025);
LCD freq
}
ISR( TIMER2_OVF_vect )
{// 0,025 s - 40 Hz
pr=1;
}
A tak przy okazji to teraz i się zwiększa o 1 co 65536 impulsów. Więc przy okresie zliczania 25ms zliczy Ci 1 dopiero przy częstotliwości wejściowej równej 2621440Hz. A tak chyba nie miało być?
Poza tym to:
freq=(int)(i*0.025);
źle liczy częstotliwość. Powinno dzielić a nie mnożyć przez 0.025. Czyli mnożyć przez 40.