Durante mucho tiempo he usado este codigo que saco de la hoja de datos del pic 16f88 para salvar W,STATUS y PCLATH mientras se ejecutan mis interrupciones
MOVWF W_TEMP ;Copy W to TEMP register
SWAPF STATUS, W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using page 1
MOVWF PCLATH_TEMP ;Save PCLATH into W
CLRF PCLATH ;Page zero, regardless of current page
:
:(ISR) ;(Insert user code here)
:
MOVF PCLATH_TEMP, W ;Restore PCLATH
MOVWF PCLATH ;Move W into PCLATH
SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP, F ;Swap W_TEMP
SWAPF W_TEMP, W ;Swap W_TEMP into W
Este codigo se me hace muy rebuscado , preferiria usar algo asi
MOVWF W_TEMP ;MUEVE W A WTEMPORAL
MOVF STATUS,W ;MUEVE STATUS A W
MOVWF STATUS_TEMP ;MUEVE STATUS DE W A STATUS_TEMP
MOVF PCLATH,W ;MUEVE PCLATH A W
MOVWF PCLATH_TEMP ;MUEVE W A PCLATH
BCF STATUS,RP0 ;BANCO 0
CLRF PCLATH ;PAGINA 0
:
: (ISR) ;(Insert user code here)
:
MOVF PCLATH_TEMP,W ;MUEVE PCLATH_TEMP A W
MOVWF W,PCLATH ;RESTAURA PCLATH (PAGINA ORIGINAL RESTAURADA)
MOVF STATUS_TEMP,W ;MUEVE STATUS A STATUS A W
MOVWF STATUS ;MUEVE STATUS A A STATUS ORIGINAL(BANCO ORIGINAL RESTAURADO)
MOVF W_TEMP,W ;RESTAURA W ORIGINAL
¿Ambos codigos son lo mismo? o ¿Por que uno es mejor que otro?
Si se puede cambiar el valor de W por otro valor en cualquier momento ¿Cuando y por que se usa CLRW?
Gracias de antemano por su ayuda.