Witam, mam dość specyficzny problem, z którym głowię się już od jakiegoś czasu.
Próbuje ustawić timer0 tak by generował mi przerwanie dokładnie co 1us. Zaczynam od ustawienia fusebitów (lfuse = 0xe4) co daje mi taktowanie wewnętrznym oscylatorem z częstotliwościa f_osc=8MHz.
Później zabieram się za ustawienie timera0:
Kod:
TCCR0 = (TCCR0 & 0b11111000);
TCCR0 |= (1<<CS00);
TIMSK |= (1<<TOIE0);
TCNT0 = 0xfe;
czyli kolejno czyszczenie starych ustawień na trzech ostatnich bitach rejestru TCCR0, wrzucenie tam nowej wartości (0b001), uruchomienie przerwania dla "przekręcenia" licznika timera oraz ustawienie licznika na 254. W przerwaniu ustawiam TCNT0 = 0xfe. W ten sposób powinienem uzyskać przerwanie generowane co 1us. Problem polega na tym, że generowane jest ono co 16us. Co dziwniejsze ustawienie preskalera z wartości no_preskaler (0b001 w rejestrze TCCR0) na wartość /8 (0b010 w rejestrze TCCR0) nie powoduje żadnych zmian w działaniu programu tj. przerwanie wywoływane jest cały czas co 16us. Z kolei zmiana na wartości preskalera większe większe niż /8 zmniejsza częstotliwość wywoływania przerwania w sposób prawidłowy (czyli dwukrotne zwiększenie preskalera powoduje zmniejszenie częstotliwości "przekręcania" licznika o połowę).
Przeglądałem notę katalogową i w rozdziale dotyczącym timerów nie znalazłem, żadnych dodatkowych ustawień mogących mieć wpływ na częstotliwość generowania przerwania. Powstaje pytanie - czy ja robię coś źle, czy jest to wina wadliwego uC czy może dochodzę do granic możliwości mikrokontrolera, który fizycznie nie jest w stanie generować przerwania z zadaną częstotliwością przy taktowaniu wewnętrznym oscylatorem 8MHz?
Z góry dziękuję za pomoc,
Pozdrawiam