Это объясняется в каждой таблице AVR.Например, на странице 8 таблицы ATtiny2313 написано:
Регистр состояния не сохраняется автоматически при вводе подпрограммы прерывания и восстанавливается при возврате из прерывания.Это должно обрабатываться программным обеспечением.
Этого можно добиться, сохранив его во временном регистре:
interrupt:
in r16, SREG ; save SREG
...
out SREG, r16 ; restore SREG
reti
Также обратите внимание, что если вы обращаетесь к регистрам, которые не являютсяиспользуется в этой подпрограмме прерывания, вы должны сохранить их тоже.Кроме того, вы можете поместить значение SREG в стек, если у вас мало регистров:
interrupt:
push r16 ; save global registers on stack
push r17
push r18
in r16, SREG ; save SREG
push r16 ; do this if you want to use r16 in your interrupt routine
...
pop r16 ; do this if you pushed SREG above
out SREG, r16 ; restore SREG
pop r18 ; restore global registers
pop r17
pop r16
reti
Для получения дополнительной информации смотрите здесь .