Cuando se produce una interrupción el procesador ejecuta una Rutina de Servicio
de Interrupción (RSI), y, al terminar, el programa principal continúa donde fue
interrumpido. La dirección en la que se debe situar la rutina de interrupción es la 0x04,
y es recomendable, para terminarla, usar la instrucción RETFIE, en lugar de RETURN,
puesto que, al activarse una interrupción, el mecanismo de las mismas se deshabilita
como medida de seguridad. RETFIE sirve para rehabilitarlas.
Como las rutinas pueden modificar el contenido de los registros del procesador, al
iniciarlas conviene guardar en la pila el valor de los mismos y restaurarlos antes del
RETURN. Antes de regresar la RSI debe determinar la causa de la interrupción, borrar
la bandera apropiada antes de salir y, por supuesto, dar servicio a la interrupción.
A primera vista, salvar y restaurar los registros sin modificar sus contenidos
no es una tarea fácil. El contenido del registro W debe guardarse primero, junto con
todos los registros que han pasado por W para el almacenamiento temporal de sus
posiciones. El hecho de mover W a otro registro corrompe la bandera Z, modificando el
registro de Estado. Microchip recomienda una secuencia de código que permite salvar y
restaurar los registros sin modificarlos. La mostramos en la siguiente secuencia de
código:
; ************************** SALVAR *************************
MOVWF Almacen1_W
SWAPF estado,w
MOVWF Almacen2_S
...
...
...
; Guardamos contenido de W en su sitio
; Swap del contenido de estado en W
; Guarda el contenido de ESTADO
;********************** FIN RUTINA RSI ***********************
SWAPF Almacen2_S,w
; Deja estado como estaba
MOVWF estado
; Y lo restaura
SWAPF Almacen1_W,f
SWAPF Almacen1_W,w
RETFIE
La instrucción SWAPF mueve los datos sin afectar a la bandera Z del registro de
ESTADO. Aunque los conjuntos de 4 bits se invierten en el proceso, posteriormente son
restaurados en su situación inicial. Si se empleara la instrucción MOVF se corrompería el bit Z.
64