Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Interrupciones y Temporizaciones (2 de 15)  

.: Rutina de Servicio de Interrupciones (ISR):

La tarea de guardar todos los registros importantes puede ser mas o menos complicada si el programa que estás realizando es demasiado extenso o principalmente cuando en la ISR modificas alguno de los valores de esos registros, en algunos casos no es necesario ya que por lo general se trata de no modificarlos utilizando registros alternativos, pero veamos como hacerlo.

Primero debes guardar el contenido del registro W, el problema de mover W a otro registro (haciendo uso de MOVF) es que esta instrucción corrompe la bandera Z, modificando el registro de Estado. Según la hoja de datos otorgada por Microchip, en uno de sus apartados recomienda una secuencia de código que permite guardar y restaurar los registros sin modificarlos.

Suponte que W=0x0A y ESTADO=0xAF, La forma de guardarlos y recuperar estos registros sería la siguiente:

; ======== Inicio - Rutina de Servicio de Interrupción =========
; ========== Guardando W y el Registro de Estado ==========

MOVWF   Reg_W		; Guardamos W en Reg_W (Reg_W=0x0A)
SWAPF    ESTADO,W		; invertimos los nibbles del registro ESTADO
			; y lo pasamos a W (ESTADO=0xAF), (W=0xFA) 
MOVWF   Reg_S		; Guardamos el contenido de ESTADO (Reg_S=0xFA)
  .	.
  .	.		; Atendemos la interrupción
  .	.

; ======== Fin - Rutina de Servicio de Interrupción ===========
; ========  Restaurando W y el Registro de Estado ===========

SWAPF    Reg_S,W		; invertimos los nibbles de Reg_S
			; y lo pasamos a W (Reg_S=0xFA), (W=0xAF)
MOVWF   ESTADO		; Restauramos ESTADO (ESTADO=0xAF)
SWAPF    Reg_W,f		; invertimos los nibbles de Reg_W (Reg_W=0xA0)
SWAPF    Reg_W,W		; y lo pasamos a w invirtiéndoles nuevamente
			; Ahora W=0x0A
RETFIE
			

Reg_W y Reg_S son registros alternativos para guardar los valores del registro W y del registro de estado respectivamente.

SWAPF    ESTADO,W

Es como decirle "invierte los nibbles del registro ESTADO y guárdalos en W".

La instrucción SWAPF invierte los nibbles del registro, por ejemplo si el registro tenia 0xAF luego de SWAPF quedará 0xFA, si especificas W el valor invertido se guarda en W si indicas f se guardará en el mismo registro, así...

SWAPF    Reg_W,f

Es como decirle "invierte los nibbles de Reg_W y guárdalos en Reg_W".

Creo que se entiende...

Bien, lo bueno de utilizar la instrucción SWAPF en lugar de MOVF es que no afecta la bandera Z del registro de ESTADO, y aunque los nibbles se invierten, al restaurarlos los vuelves a invertir nuevamente para dejarlos como estaban.

Como dije anteriormente, no siempre será necesario, todo depende del programa que estés haciendo.

Algo que no mencioné, es la instrucción...

RETFIE

Veamos y tratemos de resumir un poco lo que vimos hasta ahora...

Si se ha producido una interrupción, obviamente una de las banderas del registro INTCON cambiará de estado y el micro irá a la dirección 0x04 como si se hubiera producido un CALL (una llamada) a esa dirección para ejecutar la ISR, por lo tanto la pila o STACK se carga una posición más, y el mecanismo de las interrupciones se deshabilita (es decir GIE=0) para dar lugar a la ISR.

Ahora bien, debes recuperar los registros importantes (lo que acabamos de ver), averiguar la fuente de interrupción, atender la interrupción, luego restaurar aquellos registros importantes, reponer el estado de las banderas del registro INTCON (aquellas que fueron modificadas por la interrupción) y regresar, pero no con un RETURN, ya que no estas regresando de una rutina cualquiera, sino de una interrupción, la cual está deshabilitada, y para habilitarla nuevamente es recomendable utilizar la instrucción RETFIE, y yo cumplí...!!!

Y ahora todas las interrupciones están habilitadas nuevamente, es decir GIE=1

Nada impide que utilices RETURN pero deberás usar una instrucción más para habilitar GIE si deseas continuar usando la interrupción, esto queda a criterio del programador, Microchip recomienda el uso de RETFIE y yo como chico bueno la utilizo.  ;oP

Como era de esperarse no todo termina aquí, ya que algunos de los parámetros para las interrupciones se encuentran en otro registro, el registro OPTION, veamos de que se trata...



R-Luis...

<-- Anterior   Introducción   Siguiente -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
Tabla de Referencias


    
--| |--