Witam!
Mam następujące zadanie: pomierzyć dokładnie (najlepiej z maksymalną możliwą dokładnością) czas pomiedzy przerwaniami zewnętrznymi podawanymi na nogi INTx procesora AVR (konkretnie 90S2313).
Niestety sprawa jest troszke skomplikowana. Mianowicie czas pomiedzy przerwaniami będzie bardzo rózny - od paru cykli do paru milionów.
Podstawowe liczniki 2^8 i 2^16 mają za małą pojemnośc i należało by ją powiększyć mniej więcej tak:
... volatile unsigned long counter; ... void TimerOverflow(void) { counter++; }
Teraz mając do dyspozycji "counter" i wartośc jednego bajtu timera (dla zegarka 2^8 lub 2 bajtów dla 2^16) chciałbym w przerwaniu zewnątrznym uzyskać ilośc cykli od ostatniego przerwania. Niestety mam problem następujący: jak odczytać wartośc zmiennej "counter" oraz timera traktując całą tą operację jako atomową ? Wszak timer kręci się niezależnie od "counter" i może zdarzyć się sytuacja że przekręci się akurat podczas obsługi przerwania zewnątrznego. Ma ono większy priorytet od overflow timera i stąd mogę przeoczyć jedno oczko zmiennej "counter".
Czy ktoś zna na to jakąs sensowną poradę ? Zakładam, że aplikacja jest na tyle prosta, że można traktować obydwa timery jako tylko do tego zastosowania. Program główny będzie obsługiwał wyłącznie UARTa w pętli. Interesuje mnie odmierzanie precyzyjne pomiędzy przerwaniami możliwie z dokładnością do pojedynczych cykli kwarcu.