You are on page 1of 2

::PICParteIIICaptulo2

RutinadeServiciodeInterrupciones(ISR):
Latareadeguardartodoslosregistrosimportantespuedesermasomenoscomplicadasielprogramaqueests
realizando es demasiado extenso o principalmente cuando en la ISR modificas alguno de los valores de esos
registros,enalgunoscasosnoesnecesarioyaqueporlogeneralsetratadenomodificarlosutilizandoregistros
alternativos,peroveamoscomohacerlo.
Primero debes guardar el contenido del registro W, el problema de mover W a otro registro (haciendo uso
de MOVF) es que esta instruccin corrompe la bandera Z, modificando el registro de Estado. Segn la hoja de
datosotorgadaporMicrochip,enunodesusapartadosrecomiendaunasecuenciadecdigoquepermiteguardar
yrestaurarlosregistrossinmodificarlos.
SupontequeW=0x0AyESTADO=0xAF,Laformadeguardarlosyrecuperarestosregistrosseralasiguiente:
========InicioRutinadeServiciodeInterrupcin=========
==========GuardandoWyelRegistrodeEstado==========
MOVWFReg_W
GuardamosWenReg_W(Reg_W=0x0A)
SWAPFESTADO,W
invertimoslosnibblesdelregistroESTADO

ylopasamosaW(ESTADO=0xAF),(W=0xFA)
MOVWFReg_S
GuardamoselcontenidodeESTADO(Reg_S=0xFA)
. .
. .

Atendemoslainterrupcin
. .
========FinRutinadeServiciodeInterrupcin===========
========RestaurandoWyelRegistrodeEstado===========
SWAPFReg_S,W
invertimoslosnibblesdeReg_S

ylopasamosaW(Reg_S=0xFA),(W=0xAF)
MOVWFESTADO

RestauramosESTADO(ESTADO=0xAF)
SWAPFReg_W,f

invertimoslosnibblesdeReg_W(Reg_W=0xA0)
SWAPFReg_W,W
ylopasamosawinvirtindolesnuevamente

AhoraW=0x0A
RETFIE

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

Escomodecirle"inviertelosnibblesdelregistroESTADOygurdalosenW".
La instruccin SWAPF invierte los nibbles del registro, por ejemplo si el registro tenia 0xAF luego de SWAPF
quedar0xFA,siespecificasWelvalorinvertidoseguardaenWsiindicasfseguardarenelmismoregistro,
as...
SWAPFReg_W,f

Escomodecirle"inviertelosnibblesdeReg_WygurdalosenReg_W".
Creoqueseentiende...
Bien,lobuenodeutilizarlainstruccinSWAPFenlugardeMOVFesquenoafectalabanderaZdelregistrode
ESTADO,yaunquelosnibblesseinvierten,alrestaurarloslosvuelvesainvertirnuevamenteparadejarloscomo
estaban.
Comodijeanteriormente,nosiempresernecesario,tododependedelprogramaqueestshaciendo.

Algoquenomencion,eslainstruccin...
RETFIE

Veamosytratemosderesumirunpocoloquevimoshastaahora...
Sisehaproducidounainterrupcin,obviamenteunadelasbanderasdelregistroINTCONcambiardeestadoyel
microiraladireccin0x04comosisehubieraproducidounCALL(unallamada)aesadireccinparaejecutarla
ISR,porlotantolapilaoSTACKsecargaunaposicinms,yelmecanismodelasinterrupcionessedeshabilita
(esdecirGIE=0)paradarlugaralaISR.
Ahora bien, debes recuperar los registros importantes (lo que acabamos de ver), averiguar la fuente de
interrupcin, atender la interrupcin, luego restaurar aquellos registros importantes, reponer el estado de las
banderas del registro INTCON (aquellas que fueron modificadas por la interrupcin) y regresar, pero no con un
RETURN, ya que no estas regresando de una rutina cualquiera, sino de una interrupcin, la cual est
deshabilitada,yparahabilitarlanuevamenteesrecomendableutilizarlainstruccinRETFIE,yyocumpl...!!!
Yahoratodaslasinterrupcionesestnhabilitadasnuevamente,esdecirGIE=1
NadaimpidequeutilicesRETURNperodebersusarunainstruccinmsparahabilitarGIEsideseascontinuar
usandolainterrupcin,estoquedaacriteriodelprogramador,MicrochiprecomiendaelusodeRETFIEyyocomo
chicobuenolautilizo.oP
Como era de esperarse no todo termina aqu, ya que algunos de los parmetros para las interrupciones se
encuentranenotroregistro,elregistroOPTION,veamosdequesetrata...

You might also like