Dokładne pomiary czasu z przerwaniami w AVR: INT0 i T0 w praktyce
Przerwania w AVR
From: "Kicak" <wzr7696_at_nospam_zeus.polsl.gliwice.pl>
Subject: Przerwania w AVR
Date: Wed, 2 May 2001 09:37:11 +0200
Mam pare pytan dotyczacych przerwan w uC AVR
Jak wiadomo podczas zgloszenia przerwania kasowany jest znacznik zezwolenia
na przerwania globalne (I) w rejestrze znacznikow (SREG) (czyli zostają
zablokowane inne przerwania).
Zalozmy ze zostaje zgloszone przerwanie z licznika T0.
Czas wykonywania podprogramu obslogi przerwania niech wynosi 500 taktow
zegarowych. Jezeli podczas wykonywania podprogramu obslogi przerwan zostanie
wygenerowane inne przerwanie np. z INT0 (czyli o wyzszym priorytecie niz z
licznika T0) to zostanie wykonane natychmiast czyli zostaje przerwny
podprogram obslogi przerwania z T0 i wykonywany zostaje podprogram obslogi
przerwania z INT0 badz jest kontynulowany podprogram obslogi przerwania z T0
a dopiero po napotkaniu rozkazu RETI wykonany zostanie podprogram obslogi
INT0.
A teraz moze troche jasniej o co mi chodzi.
Problem polega na tym ze zalezy mi na dokladnym odmierzeniu czasu pomiedzy
wystąpieniem narastajacych zboczy na wejsciu INT0 (sygnal o czestotliwosci
ok 4kHz ). Realizuje to po przez licznik 16bit T1. Kazde przerwanie powoduje
wykonanie podprogramu w ktorym odczytany jest stanu licznika, zapamietanie
wyniku w SRAM (przepraszam za wyrazy ;-)), zerowanie licznika oraz pare
innych drobnych rzeczy. W sumie zajmuje to kolo 100 taktow zegarowych.
Dodatkowo generowane jest przerwanie z licznika T0 (czyli o nizszym
priorytecie niz z INT0) co okolo 5ms ktore zajmuje okolo 80 taktow
zegarowych.
Jezeli teraz zgloszone zostamie przerwanie z T0 a za kilka taktow zegarowych
zgloszone zostanie przerwanie z INT0 to moge liczyc na to ze:
1) Przerwanie z INT0 zostanie wykonane natychmiast po zgloszeniu mimo ze
wykonywany jest podprogram obslogi przerwania z T0. Wtedy moge sie liczyc z
malym bledem pomiaru czasu z licznika T1 (srednio okolo 10 taktow, bo wynika
to z czasu obslogi przerwania).
2) Przerwanie z INT0 zostanie wykonane zaraz po zakonczeniu wykonywania
podprogramu obslogi przerwania z T0 (dopiero po rozkazie RETI) badz bedzie
zignorowane. Wtedy moge sie liczyc w przypadku pesymistycznym z bledem okolo
4% .
3) A moze gdy wykonywany jest podprogram obslogi przerwania to zgloszone
przerwanie jest ignorowane.
Ktore z powyzszych pogladow jest prawdziwe?
Czy lekarstwem na problem z punktu 2 bedzie umieszczenie na samym poczatku
podprogramu obslogi przerwania z T0 instrukcji SEI ktora pozwolila by mi na
obsloge przerwania z INT0?
Za wszelka pomoc i dyskusje na ten temat szczere dzieki
I jeszcze jedno.
Do czego wykozystac mozna wyprowadzenie SS w 90S8515 oraz jaki jest sens
(praktyczny) wykorzystania przerwania generowanego przez SPI w tym uC.
Kicak
From: "Tomasz Gumny" <tgumny_at_nospam_idn.org.pl>
Subject: Re: Przerwania w AVR
Date: Sun, 6 May 2001 20:51:07 +0200
Problem polega na tym ze zalezy mi na dokladnym odmierzeniu czasu pomiedzy
wystąpieniem narastajacych zboczy na wejsciu INT0 (sygnal o czestotliwosci
ok 4kHz ). Realizuje to po przez licznik 16bit T1.
Podlacz sygnal do wejscia ICP, a T1 ustaw w tryb Capture i wszystkie problemy
znikna.
TG
PS. obsl_u_gi
From: Romuald Bialy <romekb_at_nospam_polbox.com>
Subject: Re: Przerwania w AVR
Date: Sun, 06 May 2001 22:27:46 +0200
Kicak wrote:
Mam pare pytan dotyczacych przerwan w uC AVR
[ciach]
1) Przerwanie z INT0 zostanie wykonane natychmiast po zgloszeniu mimo ze
wykonywany jest podprogram obslogi przerwania z T0. Wtedy moge sie liczyc z
malym bledem pomiaru czasu z licznika T1 (srednio okolo 10 taktow, bo wynika
to z czasu obslogi przerwania).
Tak wlasnie sie stanie jezeli INT0 bedzie na wyzszym priorytecie.
A najlepiej to faktycznie wykorzystac funkcje Capture timera T1. Zero
bledow bo stan licznika zostaje zatrzasniety w momencie pojawienia sie
zbocza na ICP, pozniej generowane jest przerwanie w ktorym sobie to
odczytujesz.
--
Pozdrawiam.... Romuald Bialy
E'mail: romekb_at_nospam_polbox.com
WWW: http://www.polbox.com/r/romekb
From: "Juliusz" <jul_at_nospam_fom.pl>
Subject: Re: Przerwania w AVR
Date: Mon, 7 May 2001 05:27:04 +0200
"Romuald Bialy" <romekb_at_nospam_polbox.com> wrote in message
news:3AF5B3C2.12FC86A0_at_nospam_polbox.com...
Kicak wrote:
Mam pare pytan dotyczacych przerwan w uC AVR
[ciach]
1) Przerwanie z INT0 zostanie wykonane natychmiast po zgloszeniu mimo ze
wykonywany jest podprogram obslogi przerwania z T0. Wtedy moge sie
liczyc z
malym bledem pomiaru czasu z licznika T1 (srednio okolo 10 taktow, bo
wynika
to z czasu obslogi przerwania).
Tak wlasnie sie stanie jezeli INT0 bedzie na wyzszym priorytecie.
Eee no chyba nie stanie sie tak. Priorytet jest wazny jedynie jak sie dwa
zrodla odezwa w tym samym momencie. Zeby przerwac przerwanie trzeba podobno
wstawic SEI w to akurat wykonywane o nizszym priorytecie. No ale nigdy nie
probowalem tego, tak mowia.
Juliusz