logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega16 - jak ustawić priorytet przerwań dla timerów i INT0/INT1?

piotrg85 20 Lut 2008 20:18 2093 20
REKLAMA
  • #1 4827523
    piotrg85
    Poziom 12  
    Posty: 90
    Pomógł: 3
    Ocena: 4
    Witam,
    Mam małe, może i banalne pytanie, ale czy w ATmega16 istnieje rejestr, który zmienia poziom priorytetu przerwań? Chodzi mi o podobny rejestr jak -> IP w uK '51,<- za pomocą ,którego można było programowo umieścić dane przerwanie na wyższym lub niższym poziomie.
    W programie, który piszę, timery 0 i 1 zgłaszają przerwanie co ściśle określony czas i nie chciałbym, aby przerwanie przychodzące w tym samym czasie z INT0 i INT1 przeszkodziło w wykonaniu przerwania od timera 0 lub 1. (wg. tabeli producenta, gdy w tym samym czasie przyjdzie przerwanie np. z INT0 i z TIMER1, to "pojedynek wygra" INT0.... u mnie ma być odwrotnie :wink: )
    Pozdr.
  • REKLAMA
  • #2 4827715
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    W ATmega 16 nie ma możliwości zmiany priorytegów przerwań. Ale jest lekarstwo na Twoją bolączkę, możesz poprostu włączyć przerwania zaraz na początku obsługi przerwania od INT0. Przerywanie przerwań wcale nie jest takie niebezpieczne.
  • #3 4827999
    piotrg85
    Poziom 12  
    Posty: 90
    Pomógł: 3
    Ocena: 4
    Dr_DEAD napisał:
    możesz poprostu włączyć przerwania zaraz na początku obsługi przerwania od INT0.Przerywanie przerwań wcale nie jest takie niebezpieczne.


    Można jaśniej ? :wink:
    W sumie nie chodzi mi o przerywanie przerwań, a raczej o pierwszeństwo wykonania danego przerwania. W moim przypadku, gdy jednocześnie zgłosi się przerwanie od TIMER1 i INT0, to ma zostać najpierw obsłużone od TIMER1, tymczasem wg. noty katalogowej najpierw zostałoby obsłużone przerwanie od INT0.
  • REKLAMA
  • #4 4828048
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    piotrg85 napisał:

    Można jaśniej ?

    Priorytet przerwań rozpatrywany jest tylko wtedy gdy rywalizujące przerwania nadejdą dokładnie w jednym i tym samym cyklu zegarowym. Taki przypadek zdarza się raz na milion obsługiwanych przerwań.

    Druga sprawa to to, że jak masz jakieś ważne przerwanie które nie może czekać to zauważ że jeżeli przyjdzie ono w momencie gdy obsługiwane jest jakieś inne mniej ważne to i tak to ważniejsze będzie czekało na obsługę tego mniej ważnego, chyba że jawnie zezwolisz na przerwanie tego mniej ważnego przerwania przez przerwanie ważniejsze.

    Chyba to co napisałem jest niezrozumiałe, bo za dużo razy użyłem słowa "przerwanie" ;-).
  • #5 4828572
    piotrg85
    Poziom 12  
    Posty: 90
    Pomógł: 3
    Ocena: 4
    Ok, możliwe, że się za bardzo rozdrabniam... i tak naprawdę zgłoszenie obsługi dwóch przerwań w tym samym momencie jest mało realne.
    Szkoda tylko, że producent Avr'ków nie pomyślał o wprowadzeniu poziomów priorytetu przerwań... w przyszłości programy mogły by być bardziej elastyczne :wink: (rejestr IP w uK '51 to jest jednak fajna sprawa)

    Acha, nawiązując do Twojej wypowiedzi.. jest jednak możliwość w ATmedze na przerwanie mniej ważnego przerwania przez ważniejsze ?? Chciałbym na przyszłość wiedzieć.
  • REKLAMA
  • #6 4828615
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Jak już kolega Dr_DEAD napisał w obsłudze przerwania możesz zezwolić na inne przerwania niezależnie od priorytetów.
  • #7 4828890
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    don diego napisał:
    Jak już kolega Dr_DEAD napisał w obsłudze przerwania możesz zezwolić na inne przerwania niezależnie od priorytetów.

    Dodama tylko że chyba w każdym uC można tak zrobić.
  • #8 4828959
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    piotrg85 napisał:
    Ok, możliwe, że się za bardzo rozdrabniam... i tak naprawdę zgłoszenie obsługi dwóch przerwań w tym samym momencie jest mało realne.
    Szkoda tylko, że producent Avr'ków nie pomyślał o wprowadzeniu poziomów priorytetu przerwań... w przyszłości programy mogły by być bardziej elastyczne :wink: (rejestr IP w uK '51 to jest jednak fajna sprawa)

    Acha, nawiązując do Twojej wypowiedzi.. jest jednak możliwość w ATmedze na przerwanie mniej ważnego przerwania przez ważniejsze ?? Chciałbym na przyszłość wiedzieć.


    Mnie się wydaje że w AVR jest to lepiej rozwiązane. Nie musisz sie zastanawiac który jest ważniejszy. ja stosuje taką zasada: zawsze w obsłudze przerwania na początku odblokowywuje przerwania globalne (chyba ze akutat przerwanie musi wykonac sie w całości) albo odblokowywuje w miejscu w którym to można zrobić (nie czekam na koniec) Wadą tego rozwiazania jest to że trzeba przewidziec duży rozmiar stosu bo zdarza sie ze przerwanie jest przerywane przez 5 innych. Ale o zaletach nie musze wspominac
  • #9 4829710
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Strategia proponowana przez przedmówcę jest bardzo ryzykowna, oto do czego doprowadziła w przypadku krachu programu sondy Mars Pathfinder:
    http://en.wikipedia.org/wiki/Priority_inversion
    Jeżeli kol. piotrg85 musi mieć obsługę przerwania od licznika dokładnie w danym czasie to można programowo sprawdzać w pętli głównej ten licznik i zablokować odpowiednio z wyprzedzeniem inne przerwania.
    Po odblokowaniu wykonają się kolejno.
    Ciekawe tylko po co taka procedura bo nie napisał jaki to program, widać lubi aby czytelnicy forum pobawili się w zgadywanki.
    Pzdr. N.
  • #10 4829843
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    Nawigator -> to jest całkiem inna bajka.
  • #11 4830020
    piotrg85
    Poziom 12  
    Posty: 90
    Pomógł: 3
    Ocena: 4
    Nawigator napisał:
    można programowo sprawdzać w pętli głównej ten licznik i zablokować odpowiednio z wyprzedzeniem inne przerwania.
    Po odblokowaniu wykonają się kolejno.
    Ciekawe tylko po co taka procedura bo nie napisał jaki to program, widać lubi aby czytelnicy forum pobawili się w zgadywanki.
    Pzdr. N.


    Witam,
    Jest to dobry pomysł, by na krótko, przed wystąpieniem przerwania od TIMER1, wyłączyć przerwanie od INT0 (skasować znacznik INT0 w GICR) by przy wyjściu z przerwania znowu ustawić znacznik na "1". Wtedy mam pewność, że INT0 nie zakłóci pracy danego fragmentu kodu.
    Jeśli chodzi o program, to przymierzam się do zbudowania m.in. sterownika serwomechanizmu. TIMER1 będzie odpowiedzialny za generowanie syg. prostokątnego o okresie 20ms( generowanie przerwania co 20ms) co jest bardzo ważne,by nie stracić synchronizacji , natomiast pod INT0 będzie podłączony przycisk. Temat powstał, po to, aby się dowiedzieć, jak uniknąć sytuacji, w której naciśnięcie przycisku, mogło by zmienić okres tego syg. prostokątnego. Pomysł podany przez kol. Nawigator jest całkiem niezły.
    Tutaj jeszcze wyjaśnię, że kiedyś pisałem prog. pod '51 i tam w takich sytuacjach, za pomocą rejestru IP, można było wrzucić przerwanie, np. tego TIMER'ka na wyższy poziom, i było po problemie. Avr'kami zajmuję się od niedawna, więc pierwszym odruchem było szukanie analogicznego rejestru :wink: Jak widać, tutaj trzeba będzie to programowo zrobić.

    Pozdr.
  • #12 4830347
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Przycisk powiadasz. Wg. mnie przyciski najlepiej obsługiwać w polling-u, załatwiając od razu kwestię eliminacji odbić styków. W tym, konkretnym przypadku, może w przerwaniu TIMER1 najpierw wykonywać rzeczy krytyczne czasowo, a potem sprawdzać przycisk?
  • #13 4833780
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    1) cyt: to jest całkiem inna bajka - ale co konkretnie Doktorze?
    2) ramka 20ms w serwomechanizmach modelarskich może być niedokładna, nie ma znaczenia dla pracy dekodera, służy tylko do synchronizacji czyli określenia początku ramki i może być nierównomiernie wysyłana nawet kolejna ramka.
    Ważne są tylko impulsy poszczególnych serw.
    3) czyli niepotrzebnie się martwisz a przyciski w tej sytuacji zrób jak pisze szelus.
    Tego typu kodery można napisać w całości w oparciu o jeden prosty licznik.
    Pzdr. N.
  • REKLAMA
  • #14 4834323
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    Nawigator napisał:
    1) cyt: to jest całkiem inna bajka - ale co konkretnie Doktorze?

    Racja, niesprecyzowałem. Chodziło mi o inversje priorytetów, która jak wyczytałem w linku który podałeś dotyczy wielowątkowości i systemów operacyjnych.
    Nie widzę nic ryzykownego w zgnieżdżaniu sie przerwań. A już napewno nie jest to bardziej ryzykowne niż ogulnie używanie przerwań. Oczywiście zawsze trzeba dokładnie wiedzieć co się robi.
  • #15 4834975
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    ja też uważam, że lepiej koledze autorowi, który jak widać zaczyna z AVR (przesiadka z '51) doradzić jak sobie radzić szczególnie w tak prostych przypadkach bez zagnieżdżania przerwań i budowy sztucznych priorytetów celem dopasowania myślenia do pisania softu pod '51. Oczywiście procki '51 dzięki priorytetom i ich technologii wewn są super też do specjalnych zastosowań, ale w AVRkach warto troszkę się przestawić przy pisaniu kodu bo i rozkazy inne, wydaje się ich jakby mniej, brak priorytetów a też można pisać b.wydajny kod w niewielu liniach jeśli chodzi o porównianie asemblerów.

    tak więc też się przychylę do tego żebyś spróbował podejść do tego tematu tokiem rozumowania kolegi szelus i nie angażował do tego setki przerwań - powinno to pięknie wyjść

    pozdrawiam
  • #16 4835315
    piotrg85
    Poziom 12  
    Posty: 90
    Pomógł: 3
    Ocena: 4
    Witam, dziękuje wszystkim za odpowiedzi...

    szelus napisał:
    Wg. mnie przyciski najlepiej obsługiwać w polling-u


    Szczerze mówiąc, nie spotkałem się jeszcze z określeniem "polling". Można bardziej przybliżyć to zagadnienie? :)
  • #17 4835323
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    polling- odpytywanie. Okresowe testowanie stanu pinów.
  • #18 4835655
    piotrg85
    Poziom 12  
    Posty: 90
    Pomógł: 3
    Ocena: 4
    jest to mi ,od dawna,znany sposób, ale nie wiedziałem, że określa się go też mianem "polling":oops: .... dzięki za wyjaśnienie.
  • #19 4836751
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    >>> DrDead,
    w szczególności chodzi tu o to że jeżeli bezkrytycznie posłuchamy rady, jak to robi Kol. asembler:
    'ja stosuje taką zasada: zawsze w obsłudze przerwania na początku odblokowywuje przerwania globalne' to:
    1) ryzykujemy że nastąpi blokada wykonywania przerwań o wyższym priorytecie gdyż zakłócamy naturalną kolejkę wykonywania przerwań opartą o stos. Również zewnętrznym przerwaniom umożliwiamy łatwe seryjne wzbudzenie (np. iskrzące styki itp.)
    2) przedłużamy niejako wykonywanie pętli głównej co może być niekorzystne czasowo
    3) pozbawiamy się cennej własności jaką jest sposób wyjścia z przerwania w avr który zawsze wykonuje 1 rozkaz z pętli głównej zanim wykona następne przerwanie co w sytuacjach krytycznych pozwala zazwyczaj przejść dalej z programem, mimo opóźnień z powodu kolejki przerwań
    AVR jest szybkim procesorem i przerwania muszą być krótkie a jeśli jakiś proces ma trwać dłużej to należy stosować flagi. Unikamy w ten sposób potencjalnych problemów.
    Pzdr. N.
    PS polling nie musi być okresowy jak chce Kol. don diego tylko jest raczej 'na żądanie' np. moze być 1 raz po resecie.
  • #20 4837400
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    Nawigator napisał:

    w szczególności chodzi tu o to że jeżeli bezkrytycznie posłuchamy rady, jak to robi Kol. asembler:
    'ja stosuje taką zasada: zawsze w obsłudze przerwania na początku odblokowywuje przerwania globalne'

    No zgadza się, słowo "zawsze" też mi tu zbytnio nie pasuje.
    Nawigator napisał:

    1) ryzykujemy że nastąpi blokada wykonywania przerwań o wyższym priorytecie gdyż zakłócamy naturalną kolejkę wykonywania przerwań opartą o stos.

    No właśnie tyle że "naturalna kolejka" nie zawsze nam odpowiada, np. autorowi tematu nie odpowiada.
    Nawigator napisał:

    Również zewnętrznym przerwaniom umożliwiamy łatwe seryjne wzbudzenie (np. iskrzące styki itp.)

    Ale działa to też w drugą stronę, jesteśmy pewni że nigdy nie zgubimy żadnego przerwania.
    Nawigator napisał:

    2) przedłużamy niejako wykonywanie pętli głównej co może być niekorzystne czasowo

    Pętla główna ma zazwyczaj zadania o najniższym priorytecie.
    Jednym słowem zawsze trzeba wiedzieć co sie robi i jakie to może mieć skutki.bi
  • #21 4840666
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Oczywiście ze słowo zawsze trzeba zastąpić słowem przeważnie, aczkolwiek u mnie to 9 na 10 jest tak robione i wcale nie uwazam to za niebezpieczne a raczej za ułatwiające napisanie programu a na pewno powoduje wyciśniecie ostatnich potów z procesora..
    Niekiedy jest to wręcz koniecze a wszczególności gdy powierzymy obsługę wyświetlacza LCD procesorowi. Wtedy każde przerwanie nadchodzace dla wyświelacza LCD nie mogłoby być osłużone w ścisle określonym czasie co skutkuje efektami wizualnymi na ekranie.

    -

Podsumowanie tematu

✨ W ATmega16 nie istnieje rejestr umożliwiający programową zmianę priorytetu przerwań, tak jak w mikrokontrolerach rodziny 8051 (rejestr IP). Priorytety przerwań w ATmega16 są ustalone przez producenta i dotyczą sytuacji, gdy przerwania zgłoszone są dokładnie w tym samym cyklu zegarowym, co jest bardzo rzadkie. Możliwe jest jednak zagnieżdżanie przerwań poprzez ręczne odblokowanie globalnych przerwań wewnątrz obsługi przerwania, co pozwala na przerwanie przerwania mniej ważnego przez ważniejsze, ale wymaga ostrożności i dobrej znajomości działania systemu przerwań. W praktyce, aby uniknąć zakłóceń, można programowo wyłączać i włączać konkretne przerwania (np. wyłączyć INT0 przed obsługą TIMER1 i włączyć je ponownie po zakończeniu), co zapewnia kontrolę nad kolejnością obsługi. W przypadku sterowania serwomechanizmem, gdzie TIMER1 generuje przerwania co 20 ms, a INT0 jest podłączony do przycisku, zaleca się obsługę przycisku w trybie polling (okresowe odpytywanie stanu pinu) lub wykonywanie w przerwaniu TIMER1 najpierw krytycznych operacji, a następnie sprawdzanie stanu przycisku. Dyskusja podkreśla różnice w podejściu do przerwań między AVR a 8051 oraz ryzyka związane z nieprzemyślanym zagnieżdżaniem przerwań, takie jak blokada priorytetów czy komplikacje w pętli głównej programu. Zaleca się krótkie i efektywne procedury przerwań oraz stosowanie flag do sygnalizacji dłuższych zadań.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA