Witam. Może mi ktoś wytłumaczyć jak to jest z tymi przerwaniami?
Z tego co wyczytałem to avr maja sprzętowy priorytet przerwań i nie da się go zmienić i że przerwanie o niższym wektorze ma większy priorytet. Jednak nie do końca mi to działa w avr-gcc.
Obsługuję trzy zewnętrzne przerwania INT0, INT4 i INT7. Może podam uproszczny przykład kodu:
SIGNAL(SIG_INTERRUPT4){ printf_P(PSTR("Przerwanie 4\r\n")); sei(); while(1); //sprawdzenie priorytetów przerwań }
SIGNAL(SIG_INTERRUPT0){ printf_P(PSTR("Przerwanie 0\r\n")); } SIGNAL(SIG_INTERRUPT7){ printf_P(PSTR("Przerwanie 7\r\n")); }
Rozumiem że po wiejściu w przerwanie 4 wszystkie inne przerwania domyślnie są zablokowane nawet te o wyższym priotytecie jak IN0. Więc odblokowałem sei(). Rozumiem też że w tym momencie już może wykonać się przerwanie INT0 i tak się dzieje. Nie rozumiem tylko dlaczego wykonuje się też przerwanie INT7? Przecież ma niższy priorytet i nie powinno? A może powinno?
Proszę o wyjaśnienie. Dziękuję i pozdrawiam Paweł