Odmierzanie czasu między przerwaniami zewną

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.

Reply to
Sebastian Bialy
Loading thread data ...

Jeśli wystarczy jeden kanał, to proponuję przenieść się na pin ICP. Wprawdzie to też tylko 16 bitów, ale same przepełnienia łatwo zliczyć... TG

Reply to
invalid unparseable

skoro przerwanie zewnętrzne ma większy priorytet od timera to chyba korzystnie. wchodzisz do obsługi przerwania zewnętrznego i zatrzymujesz timer a np startujesz drugi skoro potrzebujesz aż takiej precyzji a on i tak jest niewykorzystany. wtedy z danymi z pierwszego robisz sobie co chcesz.

PC

Reply to
Pablo C

Użytkownik "Sebastian Bialy" snipped-for-privacy@poczta.onet.pl> napisał w wiadomości news:ck10pd$s37$ snipped-for-privacy@atlantis.news.tpi.pl...

Może tak (zakładam, że f_tim1=f_osc):

in R20, TIFR ; zachowaj TOV1 in R16, TCNT1L mov R18, COUNTER in R17, TCNT1H ; jeśli zachowane TOV1 było ustawione ; lub jeśli TOV1 było wyzerowane i TCNT1==0x0000, ; to do zawartości R18 dodać 1

Pzdr, Raf.

Reply to
Rafal Baranowski

On Behalf Of Sebastian Bialy

No to już znalazłeś rozwiązanie. Jeśli czas na obsługę przerwania może zająć tylko parę cykli, to należy podejść do problemu inaczej. Sugeruję Alterkę. Masz szybki zegar i skonfigurowane w/g własnego uznania liczniki. I całą masę innych pierdułek na dokładkę.

pzdr Artur

Reply to
ziel

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.