Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMEGA 2560 czy można zmienić priorytety danych przerwań

madiz08 31 Lip 2017 12:24 1047 15
  • #1 31 Lip 2017 12:24
    madiz08
    Poziom 14  

    Witam
    W każdej nocie katalogowej danej atmegi jest tabela wektorów przerwań. Ich pozycja chyba oznacza priorytet. Chodzi mi czy przerwanie USART2 będące pod numerem 52, mogło by miec wyższy priorytet niż przrerwanie Timera1 pod numerem 18? Chodzi mi o to czy jest możliwość zmiany priorytetów dla konkretnych przerwań?

  • Pomocny post
    #2 31 Lip 2017 12:42
    excray
    Poziom 38  

    Po co chcesz zmieniać priorytet przerwań? On ma znaczenie tylko wtedy, gdy oba przerwania wystąpią jednocześnie, co jest raczej bardzo rzadką sytuacją.

  • #3 31 Lip 2017 13:12
    madiz08
    Poziom 14  

    No właśnie timer1 ma przerwania co 1ms. Używam panelu dotykowego nextion, korzystając z gotowej biblioteki arduino przesyłam dane po RS z prędkością 9600bodów. Nadawanie zostaje przerwane przez timer1, a przy dokończeniu nadawania cała transmisja nie zawsze sie zgadza, dlatego zależałoby mi żeby zmienić priorytet przerwania USART2 na wyższy niż timer1

  • Pomocny post
    #4 31 Lip 2017 13:20
    excray
    Poziom 38  

    To nic Ci nie da, nawet jeśli dałoby się zrobić. Problem nie leży w priorytecie przerwań ale w obsłudze przerwań. Musisz ją tak napisać aby nie były zbyt długie, albo zastosować obsługę nie blokującą.

  • Pomocny post
    #5 31 Lip 2017 13:25
    kamyczek
    Poziom 33  

    Nie ,nie ma takiej możliwości ,żeby zmienić w prosty sposób priorytety przerwań. Można to zrobić przez zabiegi programowe lub zastosować mikrokontroler z rodziny x-mega ,który ma znacznie bardziej rozbudowany mechanizm przerwań i możliwość ustawienia priorytetów .Poza tym może warto przemyśleć sens takiego zabiegu ,bo to rzadka sytuacja kiedy uart miał by mieć wyższy priorytet od timera .Z taką sytuacją nie spotkałem żeby uart miał wyższy priorytet od timera i nie widzę w tym jakiegoś sensu . Napisz coś więcej o programie i tym dlaczego chcesz akurat tak zrobić to z pewnością uzyskasz poradę jak rozwiązać twój problem .

  • #6 31 Lip 2017 13:44
    madiz08
    Poziom 14  

    No właśnie na przerwanie USART nie mam wpływu (korzystam z gotowej biblioteki), przerwanie Timera1 wywołuja normalnie na rejestrach i w wektorze przerwań. Czy mógłbym jakoś je poprawić aby nie przerywało przerwania USART?

  • Pomocny post
    #7 31 Lip 2017 13:46
    excray
    Poziom 38  

    madiz08 napisał:
    Czy mógłbym jakoś je poprawić aby nie przerywało przerwania USART?

    Z pewnością.

  • Pomocny post
    #8 31 Lip 2017 15:12
    ex-or
    Poziom 9  

    Jakoś nie mogę sobie tego wyobrazić. Żeby ISR od Timera zakłócał ISR od UARTA musiałby trwać dłużej niż interwał. Podejrzewam, że raczej program główny nie wyrabia się ze skonsumowaniem zawartości bufora UARTa. Tak czy inaczej pokaż program, a co najmniej procedurę obsługi przerwania timera.

  • Pomocny post
    #9 31 Lip 2017 15:42
    kamyczek
    Poziom 33  

    Twój problem nie wynika z priorytetu przerwań tylko braku umiejętności prawidłowego ich wykorzystania i zastosowania biblioteki która jest źle napisana . Zazwyczaj dzieje się tak gdy użytkownik w przerwaniu umieszcza całą procedurę obsługi bufora , wyświetlacza lub innych peryferii lub po prostu timer odmierza krótszy czas niż trwa obsługa przerwania od uarta . Pozostaje więc przeanalizować program pod kątem wydajności i możliwości mikrokontrolera bo teraz jak znam życie to liczba i czas obsługi wszystkich przerwań jest dłuższy wraz z programem niż to co jest w stanie wykonać mikrokontroler ....

  • #10 01 Sie 2017 11:58
    madiz08
    Poziom 14  

    Poniżej przesyłam kod

    Kod: c
    Zaloguj się, aby zobaczyć kod


    użyłem timera2. Pod koniec jest przerwanie timera2. Po pracy puszcze filmik jak wygląda dokładnie problem. W petli loop co jakiś czas dokonywany jest odczyt analogowy. Przez przerwania timera 2 nie działa mi płynnie panel dotykowy (czasami kilka razy muszą dotknąć w dane pole), tak jakby przerwanie timera zakłócało transmisje RS[/code]

  • Pomocny post
    #11 01 Sie 2017 13:47
    dondu
    Moderator Mikrokontrolery Projektowanie

    Zacznijmy od pytań:

    1. Które bity według Ciebie ustawiłeś w TCCR2B :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    pomijając już fakt, że ten fragment się nie skompiluje.
    A może wszystko jest ok, tylko to problem wklejania kodu na forum?

    2. Gdzie jest przerwanie USART?

  • #12 01 Sie 2017 15:17
    madiz08
    Poziom 14  

    faktycznie, jakoś dziwnie sie skompilowało
    ATMEGA 2560 czy można zmienić priorytety danych przerwań
    na powyższym zdjeciu biblioteka NExConfig.h, wcześniej było Serial2, zmieniłem na Serial1. Tu juz nie jestem pewien czy Serial1 to USART1? Jeżeli chodzi o przerwania USART idące po RS to wszystko jest w bibliotece Nextion.h niestety i nie wiem jak to si odbywa i ile trwa
    ATMEGA 2560 czy można zmienić priorytety danych przerwań
    Patrząc w note katalogową zobaczyłem, że timer5 ma niższy priorytet także napisałem taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    i ku mojemu zdziwieniu odczyt wykonujący sie i przesyłający dane na wyświetlacz co 50ms (jeżeli dobrze licze) zablokował wszystko w dalszym ciągu. Klikając na każdy z przycisków na panelu prawie nie było reakcji, albo musiałem si jakoś wstrzelić z przyciśnieciem. Zobaczyłem, że diody TX i RX na Arduino cały czas sie świecą, także chyba wychodzi na to że te przerwanie Serial1 cały czas sie na siebie nakładają. Dopiero jak zwiekszyłem przesył co 150ms było ok. Zmieniłem na Timer1 i też było ok. Także moje przemyślenia o priorytecie przerwań były bezpodstawne.
    No nie wiem, czy to by wychodziło na to, że przesył danych do panelu jest tak długi, przerwania sie nakładają i wcisjając jakikolwiek przycisk na panelu, zadanie nie zostaje wykonane? Każde przerwanie timera wykonuje sie co 1ms, także samo przerwanie timera faktycznie nie wplywa na zaden interwal USART. Ale ponad 100ms na przesył danych pomiedzy arduino a nextionem to strasznie dużo.
    W załączniku przesyłam biblioteke nextiona, jeżeli ktoś z kolegów mógłby zajrzeć

  • Pomocny post
    #13 01 Sie 2017 15:23
    maciej_333
    Poziom 33  

    dondu napisał:
    Zacznijmy od pytań:

    1. Które bity według Ciebie ustawiłeś w TCCR2B :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    pomijając już fakt, że ten fragment się nie skompiluje.
    A może wszystko jest ok, tylko to problem wklejania kodu na forum?

    2. Gdzie jest przerwanie USART?


    Autor tematu pisał, że stosuje gotową bibliotekę do obsługi jakiegoś panelu dotykowego. Z tego, co zrozumiałem, to przerwanie to znajduje się we "wnętrzu" tej biblioteki. Takie efekty są oczywiście normalne, gdy ktoś mało świadomy tego, co się dzieje w jego programie stosuje gotowe biblioteki. We wklejonym fragmencie kodu jest więcej tego typu zagadnień na które zwróciłeś uwagę kolego dondu.

    Oczywiście w AVR nie ma możliwości zmiany priorytetów przerwań, to naprawdę proste mikrokontrolery. Priorytety są na sztywno ustawione zgodnie z wektorem przerwań. Zresztą zmiana ta ma sens tylko w jednoczesnym zgłoszeniu dwóch przerwań. Mam też wątpliwości czy nawet w ARM jest sens to zmieniać.

    Wklej na forum kod obsługi przerwania USART z zastosowanej biblioteki. Z pewnością to przerwanie wykonuje się za długo. Jeżeli w trakcie obsługi tego przerwania jednak obsługiwany jest Timer to znaczy, że ktoś piszący bibliotekę bardzo namieszał. Tzn. wstawił sei() w tym ISR. Jest to bardzo ryzykowna zabawa. Grozi to choćby przepełnieniem stosu. Z tego, co widzę to mamy tu do czynienia z mieszaniną Arduino i programowania w C na rejestrach. Trzeba się na coś zdecydować. Arduino wykorzystuje pewne bloki (np. Timery) niejako wewnętrznie, gdyż samo w sobie stanowi pewną nakładkę na AVR. Łatwo tu o konflikty.

  • Pomocny post
    #14 02 Sie 2017 13:20
    kamyczek
    Poziom 33  

    Jeśli chcesz nie mieć kłopotu z przerwaniami to najlepiej jest pisać je maksymalnie krótkie . Jeśli masz przerwanie od uarta czytasz znak z udr wstawiasz w bufor i koniec . Rób w przerwaniach to co musisz i czego one dotyczą, resztę w programie głównym . Będzie działać płynnie i zwalniać sukcesywnie z całym kodem .

  • #15 02 Sie 2017 15:09
    maciej_333
    Poziom 33  

    Zajrzałem do załączonego kodu dotyczącego biblioteki do tego modułu LCD. Wykorzystane są tu dwa USART'y. Jeden do komunikacji z samym modułem, drugi zaś to pewnie konsola Arduino i zarazem ten sam USART przez który Arduino IDE przesyła program. Wszystko wskazuje na to, że ta biblioteka nie korzysta z przerwań. Nie udało mi się znaleźć definicji klasy, która zawiera np. metody print, write itd. Jest to wykorzystywane do komunikacji z modułem Nextion.

    Jaką mam radę dla autora ? Skoro korzystasz z Arduino, to należy przy tym pozostać. Jeżeli potrzebne są jakieś Timery, to należy stosować biblioteki Arduino do tego przewidziane. Jeżeli zrezygnujesz z edycji zawartości rejestrów AVR, to wszystko powinno pracować znacznie lepiej. Podejrzewam, że jest tu jakiś konflikt. Zresztą komunikacja z tym wyświetlaczem zajmie na pewno więcej niż Ci się wydaje.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME