Witam!
Od niedawna zmagam się z problemem którego nie mogę rozwiązać, dlatego zwracam się do was z prośbą o pomoc.A więc tak: potrzebuję zrobić odmierzanie czasu.Zamysł jest taki: taktuję Timer0 (8 bitowy) zegarem 4Mhz bez preskalera.Licznik przepełnia się po 256 taktach zegara czylo flaga przepełnienia ustawiana jest co 64us.Następnie wywoływane jest przerwanie które zlicza te przepełnienia.Po czasie powiedzmy 100ms powinna w zmiennej liczącej być wartość 1562.A jest 2195 a więc wygląda tak jakby zmienna zliczająca przepełnienia była inkrementowana szybciej.Czyli tak jakby licznik nie zliczał do 256 tylko przepełniał się wcześniej.Licznik pracuje w trybie Normal Mode gdzie maksymalna wartość licznika wynosi 256 właśnie.Nie wiem co robię źle...
fragmenty kodu:
ustawienia timera
obsługa przerwania
pomiar
ponadto startowanie i stopowanie timera:
funkcja lcdwynik() działa poprawnie i służy do wyświetlania liczby typu long int.
Czekam na sugestie z góry dziękuje za pomoc;)
Od niedawna zmagam się z problemem którego nie mogę rozwiązać, dlatego zwracam się do was z prośbą o pomoc.A więc tak: potrzebuję zrobić odmierzanie czasu.Zamysł jest taki: taktuję Timer0 (8 bitowy) zegarem 4Mhz bez preskalera.Licznik przepełnia się po 256 taktach zegara czylo flaga przepełnienia ustawiana jest co 64us.Następnie wywoływane jest przerwanie które zlicza te przepełnienia.Po czasie powiedzmy 100ms powinna w zmiennej liczącej być wartość 1562.A jest 2195 a więc wygląda tak jakby zmienna zliczająca przepełnienia była inkrementowana szybciej.Czyli tak jakby licznik nie zliczał do 256 tylko przepełniał się wcześniej.Licznik pracuje w trybie Normal Mode gdzie maksymalna wartość licznika wynosi 256 właśnie.Nie wiem co robię źle...
fragmenty kodu:
ustawienia timera
TCCR0A=0x00;//timer0 normal mode
TIMSK|=(1<<TOIE0);
TCCR0B=0x00;//timer zatrzymanyobsługa przerwania
ISR(TIMER0_OVF_vect)
{
if (licznik<65535) licznik++;
}pomiar
licznik=0;
TCNT0=0;
timer_start;
_delay_ms(100);
timer_stop;
LCD_CLEAR;
LCD_LOCATE(0,0);
lcdwynik((licznik*256)+TCNT0);//wynik w mikrosekundach
LCD_LOCATE(0,1);
lcdwynik(licznik);
ponadto startowanie i stopowanie timera:
#define timer_start TCCR0B|=(1<<CS00) // preskaler 1
#define timer_stop TCCR0B&=~(1<<CS00)funkcja lcdwynik() działa poprawnie i służy do wyświetlania liczby typu long int.
Czekam na sugestie z góry dziękuje za pomoc;)