RTV forum PL | NewsGroups PL

Odmierzanie czasu między przerwaniami zewnętrznymi na AVR 90S2313 z maksymalną dokładnością

Odmierzanie czasu między przerwaniami zewną trznymi na AVR

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Odmierzanie czasu między przerwaniami zewnętrznymi na AVR 90S2313 z maksymalną dokładnością

Sebastian Bialy
Guest

Wed Oct 06, 2004 1:51 pm   



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.

--
Sebastian Bialy - heby@poczta.onet.pl

Tomasz Gumny
Guest

Wed Oct 06, 2004 1:59 pm   



Quote:
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).

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

Pablo C
Guest

Wed Oct 06, 2004 2:28 pm   



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

Rafal Baranowski
Guest

Wed Oct 06, 2004 2:32 pm   



Użytkownik "Sebastian Bialy" <heby@poczta.onet.pl> napisał w wiadomości
news:ck10pd$s37$1@atlantis.news.tpi.pl...
Quote:
(...)
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".
(...)

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.

ziel
Guest

Wed Oct 06, 2004 10:05 pm   



On Behalf Of Sebastian Bialy
Quote:
Niestety sprawa jest troszke skomplikowana. Mianowicie czas pomiedzy
przerwaniami będzie bardzo rózny - od paru cykli do paru milionów.
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


--
Archiwum grupy: http://niusy.onet.pl/pl.misc.elektronika

Sebastian Bialy
Guest

Thu Oct 07, 2004 3:49 pm   



Sebastian Bialy wrote:
Quote:
[ciach!]

Dziękuje za odpowiedzi, na razie skłaniam się do rozwiązania
zaproponowanego przez Rafała czyli analiza flagi przepełnienia i stanu
licznika. Jednak bardzo kusi mnie przerzucenie problemu na hardware
czyli jakaś logika programowalna. Na razie jednak sobie daruje z uwagi
na dośc krótki czas w którym ma powstać urządzenie, a praktycznego
doświadczenia z logiką prog nie mam. Nawet głupich GALów nie
programowałem jeszcze ...

PS. Okazuje się, że po weryfikacji pewnych założeń wystarcza mi mniejsza
dokładność, ale dalej przynajmniej f_osc/32 przy f_osc=10MHz. Zobacze,
czy mi to coś ułatwi.

--
Sebastian Bialy - heby@poczta.onet.pl

elektroda NewsGroups Forum Index - Elektronika Polska - Odmierzanie czasu między przerwaniami zewnętrznymi na AVR 90S2313 z maksymalną dokładnością

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map