2012-01-17 18 views
8

¿Cuál es el mecanismo utilizado para conservar el registro de estado, sreg, en un microcontrolador AVR? RETI implica que estos bits no están en la pila. ¿Uno de los registros de propósito general es también el sreg o algo así?Preservar sreg en interrupciones AVR

+1

El registro de estado no es un registro de propósito general. Reside en el archivo de registro de E/S y se puede acceder mediante las instrucciones 'in' y' out'. –

Respuesta

11

Esto se explica en cada hoja de datos de AVR. Por ejemplo, en la página 8 de la ATtiny2313 datasheet que dice:

el registro de estado no se guarda automáticamente al entrar en una rutina de interrupción y restaurado al volver de una interrupción. Esto debe ser manejado por software.

Esto se puede conseguir mediante el almacenamiento en un registro temporal:

interrupt: 
    in r16, SREG ; save SREG 

    ... 

    out SREG, r16 ; restore SREG 
    reti 

También tenga en cuenta que si estás acceso a los registros que no se usan exclusivamente en esta rutina de interrupción, lo que necesita para salvar a aquellos, también. Además se puede insertar el valor de SREG a la pila si estás bajo de registros:

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 

Para más información lee here.

1

Alternativamente

PUSH Rn 
LDS Rn, SREG 
PUSH Rn 

y

POP Rn 
STS SREG, Rn 
POP Rn 

parece ser válida.