ATMEGA8 i przerwania



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Pitucha" <piotrpitucha_at_nospam_poczta.onet.pl>
Subject: ATMEGA8 i przerwania
Date: Mon, 21 Mar 2005 07:46:08 +0100


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ń:

- startuję jakiś pomiar i zaczynam liczyć 1 minutę
- co sekundę sprawdzam stan napięcia na ADC i odpowiednio reaguję
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ę


Poprzedni Następny
Wiadomość
Spis treści
From: Krzysztof Rudnik <rudnik_at_nospam_kki.net.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Mon, 21 Mar 2005 10:06:44 +0100


Piotr Pitucha wrote:

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?

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

Krzysiek Rudnik


Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Pitucha" <piotrpitucha_at_nospam_poczta.onet.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Mon, 21 Mar 2005 10:30:33 +0100



Użytkownik "Krzysztof Rudnik" <rudnik_at_nospam_kki.net.pl> napisał w wiadomości
news:d1m38h$1ltf$1_at_nospam_node2.news.atman.pl...
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?

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

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


Poprzedni Następny
Wiadomość
Spis treści
From: "T.M.F." <tfrancuz_at_nospam_nospam-mp.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Mon, 21 Mar 2005 11:03:49 +0100


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

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Pitucha" <piotrpitucha_at_nospam_poczta.onet.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Mon, 21 Mar 2005 11:51:32 +0100



Użytkownik "T.M.F." <tfrancuz_at_nospam_nospam-mp.pl> napisał w wiadomości
news:d1m665$81j$1_at_nospam_polsl.gliwice.pl...
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).

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


Poprzedni Następny
Wiadomość
Spis treści
From: "T.M.F." <tfrancuz_at_nospam_nospam.mp.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Tue, 22 Mar 2005 00:40:01 +0100


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.




--
Inteligentny dom - http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Pitucha" <piotrpitucha_at_nospam_poczta.onet.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Tue, 22 Mar 2005 07:33:56 +0100



Użytkownik "T.M.F." <tfrancuz_at_nospam_nospam.mp.pl> napisał w wiadomości
news:bj24h2-upm.ln1_at_nospam_hermes.wizzard...
Skoro zliczasz impulsy jakiegos zewnetrznego przebiegu to nie prosciej
taktowac nimi timer? Wtedy zamiast jakielkolwiek procedury obslugi
przerwania odczytujesz sobie po prostu licznik timera.

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:
czytać w przerwaniu timera ADC
pomiarową która trwa 1 minutę
uruchamia sie proces od ktorego dostaję impulsy na wejście procesora, jesli
jest powyzej tej wartości to impulsy nie występują
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ś?



Poprzedni Następny
Wiadomość
Spis treści
From: "Piotrek Sz." <zumek_at_nospam_NOSPAM.gazeta.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Tue, 22 Mar 2005 15:53:23 +0000 (UTC)


Piotr Pitucha <piotrpitucha_at_nospam_poczta.onet.pl> napisał(a):
..
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ś?


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


--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Pitucha" <piotrpitucha_at_nospam_poczta.onet.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Wed, 23 Mar 2005 08:59:21 +0100



Użytkownik "Piotrek Sz." <zumek_at_nospam_NOSPAM.gazeta.pl> napisał w wiadomości
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ę ;)

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


Poprzedni Następny
Wiadomość
Spis treści
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: ATMEGA8 i przerwania
Date: Wed, 23 Mar 2005 09:39:20 +0100


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

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ł :(

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.

--
Pozdrowienia
Jurek Szczesiul