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

Jak ustawić wyższy priorytet przerwania INT w Bascom na AVR?

smalski 25 Lis 2004 11:30 2109 4
REKLAMA
  • #1 1011828
    smalski
    Poziom 17  
    Posty: 317
    Pomógł: 2
    Ocena: 8
    Witam!!
    Mam problem,gdyz chce napisac program w bascom na AVR, ktory bedzie mial dwa przerwania.Jedno przerwanie od timera a drugie od wejscia INT.
    Jak zrobic aby obsluga przerwania od INT miala wyzszy priorytet...
    Pozdrawiam /smalski
  • REKLAMA
  • #2 1012080
    Celetron
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Witam,

    Ja mam podobny problem - dwa timery i INT. Chciałbym, żeby przerwanie od jednego timera nie było przerywane aż do momentu jego ukoczenia. Wykombinowałem, żeby podczas wykonywania tego przerwania zablokować pozostałe, a potem odblokować. Nie wiem niestety jak jest tłumaczone "enable interrupts" na assembler - jeżeli to kilka instrukcji, to mogę nie zdążyć tego zrobić... tzn. co się stanie jak przerwanie przyjdzie w np. "połowie" tej instrukcji?

    Pozdrawiam,
  • REKLAMA
  • #3 1012294
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    smalski->O priorytecie przerwań w AVR-ach , można powiedziec tak , że im niższy(mniejszy) adres wektora , tym wyższy priorytet posiada dane przerwanie.

    Celetron->
    Żeby zablokować wszystkie przerwania na czas wykonywania przerwania od np.T1 trzeba postąpić jak poniżej:
    
    On Timer1 EtykietaT1 , NOSAVE
    ...
    EtykietaT1:
    Disable Interrupts 'co kompilator przełoży na "CLI"
    PushAll
    ...
    'Twój kod
    ...
    PopAll
    Enable Interrupts   'co kompilator przełoży na "SEI"
    Reti
    


    Pzdr.
    Piotrek Sz.
  • REKLAMA
  • #4 1012359
    Celetron
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Dzięki - chyba o to właśnie mi chodziło.
  • #5 1012403
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    zumek napisał:
    smalski->O priorytecie przerwań w AVR-ach , można powiedziec tak , że im niższy(mniejszy) adres wektora , tym wyższy priorytet posiada dane przerwanie.

    To jest zasada stosowana w PC, (np przerwanie 2h ma prorytet wyższy od 3h, ale niższy od 0h... 0h (dzielenie przez zero) ma najwyższy priorytet..)..
    w AVR wszystkie przerwania mają taki sam priorytet.. zasada jest taka że każde przerwanie ma swoją flage.. i wywołane zostanie to przerwanie które szybciej będzie miało ustawioną flage... po obsłudze nastapi przejście do kolejnej obsługi...

    można programowo zmniejszyć priorytet: po wejściu do przerwania o (wg. nas) niższym priorytecie z początku ustawić flage I (instrukcja sei) co pozwoli na wywoływanie innych przerwań... na samym końcu nietrzeba kasować flagi I.. gdy nastąpi powrót z przerwania (instrukcja reti) flaga I zostanie ponownie ustawiona.. w ten sposób jeśli podczas obsługi przerwania o niższym priorytecie wystąpi inne przerwanie - zostanie ono obsłużone odrazu..
    pamiętac trzeba żeby stworzyć odpowiednio duży stos, który pomieści wywołania kilku przerwań,..

    aha.. przed ustawieniem flagi I trzeba skasować flage IE (interrupt enable) aktualnego przerwania aby nienastąpiło ponowne wywołanie tego samego przerwania podczas jego trwania.. takie zapełnienie sie stosu przez jedno przerwanie jest groźne z oczywistych względów.. pod koniec obsługi przerwania trzeba wtedy flage IE tegoż przerwania ustawić..
REKLAMA