ATMEGA8 i przerwania

Mar 21, 2005 9 Replies

Witam Bawi³em siê '51 i tam by³y priorytety przerwañ, teraz przesiadam siê na ATMEGÊ i proszê o radê jak rozwi±zaæ problem dwu przerwañ:


- chodz± sobie przerwania od zegara i w tym przerwaniu robiê 2 rzeczy:



- startujê jaki¶ pomiar i zaczynam liczyæ 1 minutê



- co sekundê sprawdzam stan napiêcia na ADC i odpowiednio reagujê



- na INT przychodz± mi impulsy nieregularnie, max oko³o 1kHz, mam je zliczaæ przez t± minutê Co¶ doczyta³em ¿e po przyjêciu przerwania ATMEGA blokuje przyjêcie nastêpnych przerwañ, czy mam rozumieæ ¿e przyjêcie przerwania od INT zabokuje mi przerwania od zegara? Nie chcia³bym pogubiæ siê w liczeniu impulsów ani spowalniaæ zegara w czasie zliczania impulsów, z góry dziêkujê za radê


W sumie chyba wiekszosc procesorow tak ma - po prostu to drugie przerwanie troche poczeka.

Krzysiek Rudnik

U¿ytkownik "Krzysztof Rudnik" snipped-for-privacy@kki.net.pl> napisa³ w wiadomo¶ci news:d1m38h$1ltf$ snipped-for-privacy@node2.news.atman.pl...

No tak tylko z tego co doczytalem to po przyjêciu przerwania przerwania s± blokowane i co wtedy zegar nie odlicza do czasu odblokowania przerwañ?, czy te¿ ta blokada nie dotyczy timerów? W '51 ustawia³em priorytet na Timer i wiedzia³em co procesor zrobi

Po przyjeciu dowolnego przerwania przerwania sa blokowane. Jesli ci to przeszkadza to pierwsza instrukcja procedury obslugi moze byc odblokowanie przerwan. Jesli w trakcie obslugi przerwania (przy zablokowaniu przerwan) dojdzie do zgloszenia przerwania to zostanie ono obsluzone tuz po odblokowaniu przerwan, lub wykonaniu RETI. Takze problem pojawia sie dopiero jesli procedura obslugi przerwania jest dluzsza niz odstep pomiedzy przerwaniami (a i wtedy jesli odblokujesz wczesniej przerwania to problem zniknie).

U¿ytkownik "T.M.F." snipped-for-privacy@nospam-mp.pl napisa³ w wiadomo¶ci news:d1m665$81j$ snipped-for-privacy@polsl.gliwice.pl...

Pocieszy³e¶ mnie :) Zliczam narastaj±ce zbocza, inkrementujê zmienn± i tyle, po tym RETI (mam nadziejê ¿e kompilator tego nie rozwlecze bo pisane w C) czyli w zasadzie nie muszê odblokowywaæ jawnie przerwañ, sprawdzê dzi¶ jak to wygl±da w pramiu :)

Skoro zliczasz impulsy jakiegos zewnetrznego przebiegu to nie prosciej taktowac nimi timer? Wtedy zamiast jakielkolwiek procedury obslugi przerwania odczytujesz sobie po prostu licznik timera.

U¿ytkownik "T.M.F." snipped-for-privacy@nospam.mp.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@hermes.wizzard...

Nie rozumiem Twojego sposobu... To chyba w moim przypadku niemo¿liwe, je¶li uwa¿asz ¿e tak to proszê o szczegó³y, procedura jest taka:

- badam sobie ADC, powiedzmy ¿e wystarczy co 1s, czyli muszê odpaliæ Timer i czytaæ w przerwaniu timera ADC

- jak ADC dojdzie do pewnej ustalonej warto¶ci to zaczynam procedurê pomiarow± która trwa 1 minutê

- je¶li w tej minucie napiêcie na ADC jest ponizej okreslonej wartosci to uruchamia sie proces od ktorego dostajê impulsy na wej¶cie procesora, jesli jest powyzej tej warto¶ci to impulsy nie wystêpuj±

- konczy sie minuta koñczê proces i prowadzê obliczenia na zliczonych impulsach Gdybym by³ pewien ¿e liczba impulsów nie przekroczy 16 bitów to czu³bym Twój sposób, ale takiej pewno¶ci nie mam, wiêc przy przepe³nieniu licznika te¿ generowa³bym przerwanie, fakt ¿e kilka na pomiar a nie przy ka¿dym impulsie :) Czy o tym my¶la³e¶?

Piotr Pitucha snipped-for-privacy@poczta.onet.pl> napisał(a): ..

Pozwólcie wtrącić słówko :) Z danych (które podałeś) czyli częstotliwość impulsów ~1kHz , to wychodzi mi ~60000 impulsów na minutę ,więc 16-to bitowy counter(timer) spokojnie je pomieści.Załóżmy jednak , że częstotliwość impulsów > 0kHz < 2kHz wtedu w ciągu 1 min. licznik może się przepełnić 1 raz , ale przerwania od tego licznika nie musisz wogóle wlączać.Wystarczy na początku pomiaru inpulsów wyzerować licznik i flagę przepełnienia tegoż licznika.Po zakończonym pomiarze ilości impulsów , wystarczy sprawdzić flage przepełnienia licznika i jeśli ustawiona to do zawartości licznika dodać 65536 i masz ilość impulsów , które nadeszły w ciągu tej nieszczęsnej 1 min. Tak myślę ;)

Piotrek

U¿ytkownik "Piotrek Sz." snipped-for-privacy@NOSPAM.gazeta.pl> napisa³ w wiadomo¶ci

Dobrze my¶lisz :) to wszystko wyjdzie pro¶ciej ni¿ mi siê wydawa³o, jedyny problem, to dalej nie przeæwiczê przerwañ w ATMEGA8 i dalej nic nie bêdê o nich wiedzia³ :( , ale dziêki za rozja¶nienie sprawy. Piotr

Wed, 23 Mar 2005 08:59:21 +0100, na pl.misc.elektronika, Piotr Pitucha napisał(a):

To jednak zrób na przerwaniach, tylko trochę w inny sposób. Pisz handlery jak najkrótsze, a resztę operacji rób w pętli głównej według ustawionych w handlerach flag. W ten sposób zachowujemy atmelowską sprzętową zasadę blokady pozostałych przerwań w trakcie obsługi bieżącego ale ewentualne poślizgi są niewielkie i nie grozi zgubienie zdarzenia. Atmega brak priorytetów przerwań nadrabia tutaj świetnie swoją szybkością : np. przy Twoim przebiegu 1 kHz impulsy pojawią się co 1 ms; dla 8MHz atmegi to jest

8000 ticków czyli niewiele mniej rozkazów. Inkrementacja licznika zajmie nie więcej niż kilkadziesiąt więc widać ile pozostaje rezerwy ( dla ciekawości można zajrzeć do wynikowego kodu asemblera ). Więc tak : na przerwaniach jednego timera zrób 1 ms zegar systemowy; na jego bazie ustawisz w pętli głównej timery 1 min dla cyklu i 1 s dla odczytu ADC. Po rozpoczęciu cyklu co 1 s startujesz pojedynczy pomiar ADC, ktorego wynik odczytasz w przerwaniu ADC; oraz włączasz przerwanie zewnętrzne INT, w którym tylko inkrementujesz licznik impulsów. Po jednej minucie wyłączasz i odczytujesz licznik.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required