Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR - przerwanie NAKED od UART\a

17 Sty 2017 04:42 1029 16
  • #1 17 Sty 2017 04:42
    22053
    Użytkownik usunął konto  
  • #2 17 Sty 2017 07:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    Dlaczego stos miałby się przepełnić poprawnie deklarując ISR?
    W jakim celu jest Ci to potrzebne?
    Innymi słowy, po co takie kombinowanie?

    A jeżeli już tak bardzo chcesz kombinować, to na początku funkcji przerwania odbioru danej przed wykonaniem sei wczytaj odczytaj UDR do jakiegoś rejestru lub pamięci.

    0
  • #3 17 Sty 2017 08:55
    2675900
    Użytkownik usunął konto  
  • #4 17 Sty 2017 11:10
    tmf
    Moderator Mikrokontrolery Projektowanie

    @R-MIK Jeśli dasz NAKED i wstawkę w ASM, to ta wstawka może przecież zapisać i odczytać rejestr. A jaki to wiesz, bo sam go wybrałeś :) Możesz też użyć składni gcc do operacji w asemblerze, wtedy nie operujesz na rejestrach, tylko wskazujesz grupę, a kompilator sam sobie to tłumaczy na konkretne instrukcje. W tym przypadku IMHO lepiej po prostu wstawić goły asembler.

    0
  • #5 17 Sty 2017 11:21
    BlueDraco
    Specjalista - Mikrokontrolery

    To nie zmierza w dobrym kierunku. Błąd w założeniach (nie wiemy, jakich), błędna koncepcja rozwiązania zapewne nieistniejącego problemu, próba dziwacznej implementacji. Nie tędy droga.

    0
  • #6 17 Sty 2017 12:08
    22053
    Użytkownik usunął konto  
  • #7 17 Sty 2017 12:17
    tmf
    Moderator Mikrokontrolery Projektowanie

    @R-MIK Po kolei. Pierwsze - po co ten naked? Co chcesz osiągnąć? Bo jeśli tylko odblokowanie przerwań, to przecież możesz dać sei w kodize normalnego przerwania, tyle, że przed skasowaniem stosownej flagi. Do czego tu chcesz użyć asemblera?

    0
  • #8 17 Sty 2017 12:21
    dondu
    Moderator Mikrokontrolery Projektowanie

    R-MIK napisał:
    dondu napisał:
    Dlaczego stos miałby się przepełnić poprawnie deklarując ISR?

    Nie wiesz? Przecież napisałem, że flaga IRQ jest kasowana po odczycie rejestru a nie po wejściu w nie.

    Zanim odpowiesz czytaj proszę dokładnie co napisałem.

    R-MIK napisał:
    dondu napisał:

    W jakim celu jest Ci to potrzebne?

    To oczywiste, przerwania wielopoziomowe.

    Na to jest bardzo dobra odpowiedź:

    BlueDraco napisał:
    To nie zmierza w dobrym kierunku. Błąd w założeniach (nie wiemy, jakich), błędna koncepcja rozwiązania zapewne nieistniejącego problemu, próba dziwacznej implementacji. Nie tędy droga.

    0
  • #9 17 Sty 2017 12:37
    22053
    Użytkownik usunął konto  
  • #10 17 Sty 2017 13:01
    BlueDraco
    Specjalista - Mikrokontrolery

    Czyli błąd w założeniach projektu - źle wybrany mikrokontroler. Należy albo obsługiwać Onewire w sposób nie wymagający mikrosekundowej precyzji przerwań (czyli przez UART, których zapewne Ci zabrakło), albo zmienić mikrokontroler na taki, który da sobie z tym radę - AVR z większą liczbą UARTów lub dowolny z prawdziwym wielopoziomowym systemem przerwań, np. dowolny Cortex (TMF zaraz napisze, że Xmega też to potrafi).
    Robiąc to na ATmega w taki sposób prosisz się o kłopoty. Proteza z odblokowaniem przerwań w przerwaniach zwykle kończy się paskudnymi błędami synchronizacji.

    0
  • #11 17 Sty 2017 13:15
    22053
    Użytkownik usunął konto  
  • #12 17 Sty 2017 13:25
    BlueDraco
    Specjalista - Mikrokontrolery

    Ano do Slave to potrzeba przyzwoitego timera, a pewnie takich nie ma w ATmega. Z mniej przyzwoitym przydałby się wielopoziomowy system przerwań, a takiego też nie ma. Bez wielopoziomowego systemu przerwań pozostają dziurawe jak sito protezy. R-MIKu, nie idź tą drogą! Wiem, że i tak pójdziesz, boś uparty i do AVR przyklejony. ;)
    Kłopoty z odblokowywaniem przerwań są zawsze, czasem tylko się nie ujawnią, kiedy całość jest b. prosta. Np. w Twoim dekoderze DCC była z tym niezła jazda...

    0
  • #13 17 Sty 2017 15:10
    22053
    Użytkownik usunął konto  
  • #14 17 Sty 2017 16:13
    tmf
    Moderator Mikrokontrolery Projektowanie

    @R-MIK Obawiam się, że nie masz racji. Poczytaj ABI gcc, dowiesz się dlaczego np. R1 musi być zachowany na stosie. R0 i RAMPZ praktycznie też. Oczywiście jeśli zmienisz kod na własny, to można w pewnych przypadkach R0 i R1 odpuścić.
    Natomiast podstawowe pytanie - jakie ma znaczenie czy sei wykona się po 5, czy 20 taktach? Masz jakieś inne przerwania, które muszą być obsłużone z latencją <11 taktów? Bo jeśli nie to omawiany przykład to czysto akademicka dyskusja. Tym bardziej, że jak kojarzę resztę twojego kodu slave, to masz tam m.in. delay, które mocno się kłóci z przerwaniami.
    BTW, w kodzie sei możesz dać o jedną instrukcję przed odczytem UDR - zyskasz na tym na latencji. AVR gwarantuje, że wykona przyjnajmniej jedną instrukcję po sei. To nie ARM :)

    Dodano po 3 [minuty]:

    BlueDraco napisał:
    Ano do Slave to potrzeba przyzwoitego timera, a pewnie takich nie ma w ATmega. Z mniej przyzwoitym przydałby się wielopoziomowy system przerwań, a takiego też nie ma. Bez wielopoziomowego systemu przerwań pozostają dziurawe jak sito protezy. R-MIKu, nie idź tą drogą! Wiem, że i tak pójdziesz, boś uparty i do AVR przyklejony. ;)
    Kłopoty z odblokowywaniem przerwań są zawsze, czasem tylko się nie ujawnią, kiedy całość jest b. prosta. Np. w Twoim dekoderze DCC była z tym niezła jazda...


    Nie masz racji. Przecież takim timerem może być UART. Jedyna różnica, że nie można go sprzętowo wyzwolić, ale to załatwi prosty kod. Bez problemu można też wykorzystać timery z ATMegi. Wielopoziomowy system przerwań? Po co w tak trywialnym kodzie? Poza tym, wielopoziomowy system przerwań to prawie taki sam bajzel jak odblokowanie przerwania w przerwaniu, przecież to w praktyce to samo.
    IMHO autor widzi problemy, tam gdzie ich nie ma.

    0
  • #15 17 Sty 2017 16:25
    22053
    Użytkownik usunął konto  
  • #16 17 Sty 2017 16:48
    jnk0le
    Poziom 17  

    Jeśli chcesz włączać przerwania w przerwaniach uarta, powinieneś wyłączać źródło konkretnego przerwania (bity UDRIE, RXCIE).
    Samo odczytanie UDR i sei prowadzi do klasycznego race condition, a przerwania UDRIE inaczej nie będzie się dało zrobić.

    0
  • #17 18 Sty 2017 01:11
    22053
    Użytkownik usunął konto