Wątek przeniesiony 2018-11-08 11:15 z Newbie przez Marooned.

Odmierzanie czasu TIMER0 w AVR

0

Cześć!

Czy ktoś mógłby wyjaśnić jak obliczyć potrzebne wartości aby TIMER0 odmierzał ustalony czas np. 1s, 1ms, 1us, albo 10us itd? Mam mikrokontroler Atmega8 taktowany zegarem 8MHz. Bity preskalera ustawiam w następującej konfiguracji

TCCR0 |= 1 << CS00;

CS00 = 1, CS01 = 0, CS02 = 0, czyli zgodnie z notą katalogową TIMER0 będzie taktowany częstotliwością 8 000 000 Hz.

TIMER0 jest 8 bitowy czyli liczy 256 wartości z zakresu: 0 - 255.

I utknąłem, bo nie wiem w jak wyliczyć odmierzanie czasu?

1

Nie wiem, czy pytanie nadal aktualne, ale odpowiem dla potomnych:

Odmierzanie czasu realizowane jest przez zliczanie impulsów docierających do licznika TIMERx. Ogólnie chodzi o to, że jeśli masz zegar clk o częstotliwości x to oznacza, że wysyła on do licznika TIMERx liczbę sygnałów x w ciągu sekundy. Licznik jednak ma w sobie preskaler, który odpowiada za "pomijanie" co ileś sygnałów, dzięki czemu zliczany jest tylko co drugi, co ósmy, co któryś impuls. Krótko mówiąc: Jeśli preskaler ustawiony jest przykładowo na y, to w ciągu sekundy zliczysz nie x, ale x/y sygnałów.
Jeśli więc y = 4, to w ciągu sekundy zliczysz 2 000 000 impulsów.

Dalej następuje etap "pojemności" danego licznika TIMERx. Jeśli jego rejestr jest właśnie 8 bitowy, to pomieści właśnie 255 takich impulsów. Co oznacza, że w ciągu sekundy przepełni się dokładnie 2000000/255 => 7843 razy. Czyli jeśli ustawisz przerwanie na przepełnienie licznika, to w ciągu sekundy wygenerujesz aż 7843 przerwań.

Teraz aby odmierzać czas trzeba tak dobrać preskaler, lub tak skonfigurować przerwanie (lub zwiększać jakąś tam zmienną co któreś przerwanie) aby uzyskać informacje o pełnej sekundzie, milisekundzie, mikrosekundzie, itd...

1 użytkowników online, w tym zalogowanych: 0, gości: 1