Przerwania przeciez musza zachowac rejestr stanu i odtworzyc go przed powrotem z przerwania. Nie programowalem duzo w assemblerze AVR, ale wydaje mi sie ze bez jednego skoku sie nie da. Kod ktory proponuje to:
rejest Rr zawiera tu wartosc w ktorej jest interesujacy nas bit SET ; ustaw bit T SBRS Rr, numer_bitu_zrodlowego ; bit = 1 -> omin nastepny rozkaz CLT ; wyzeruj bit T CLI ; atomowa zmiana zawartosci portu - zablokuj przerwania IN Rd, port_wyjsciowy ; stan portu BLD Rd, numer_bitu_docelowego ; ustaw odpowiedni bit na rowny T OUT port_wyjsciowy, Rd ; wpisz nowa zawartosc portu SEI ; przywrocenie stanu przerwan
przy czym w oznaczeniach Rd i Rr d i r to numery z odpowiednich zakresów (np r <0, 31>, a d <0, 15> - musisz sprawdzić w dokumentacji procesora)
Jak w przerwaniach nie modyfikujesz port_wyjsciowy mozesz zrezygnowac z instrukcji CLI oraz SEI
Mariusz