Scusa Paolo ma quelli che citi tu sono i comportamenti da osservare all'interno di una ISR. Io avevo chiesto il motivo perché invece viene fatto una riscrittura del vecchio valore del registro SREG per riattivare gli interrupt globali.
Ma se io disabilito gli interrupt globali, nessun interrupt viene chiamato, quindi nessuna istruzione RETI viene eseguita. Quindi nessuno mi tocca il bit SREG_I.
Il valore che salvi in cSREG è quello con il registro interrupt disabilitato, riscrivendolo pari pari all'uscita lo lasci disabilitato e poi è il micro al rientro dalla ISR che li riabilita globalmente.
Sì, ma come detto io stavo parlando di una condizione esterna ad una ISR. Cioè salvare lo stato del registro con interrupt globali abilitati, non disabilitati.
Difatti, la macro ISR istruisce il codice a mettere il salvataggio del registro
Meglio allora usare le macro predefinite, come ha suggerito Mauro, così siamo sicuri che il compilatore farà esattamente quel che si vuole.
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html