Está en la página 1de 25

Manejo de Interrupciones

1.1. Introduccin
Se le llama interrupcin a un salto especial a una subrutina que no est contemplado en un punto especfico del programa principal, sino que puede ocurrir en cualquier punto de ste y no es provocado por una instruccin en el programa, sino por un evento interno o externo al sistema del microcontrolador. Es decir, una interrupcin es una tcnica particular del PIC que permite: interceptar eventos externos de un programa en ejecucin interrumpiendo momentneamente la operacin del programa, controla el evento con una subrutina apropiada, y retorna para continuar con la ejecucin del programa en el punto donde se produjo la interrupcin. Los dispositivos que manejan eventos capaces de provocar una solicitud de interrupcin se denominan fuentes de interrupcin. La familia del PIC16F87x cuenta con hasta 14 fuentes de interrupcin, de las cuales algunas de ellas se habilitan por medio del registro de control INTCON, otras, sin embargo, como la del convertidor A/D se encuentra en el registro PIE1, en este mismo registro est el bit del TIMER1 (TMRIE ,PIE1<0>) entre otros. En el registro INTCON slo se encuentran tres controles de interrupciones. Interrupciones ocasionadas en la patilla RBO/INT, las ocasionadas por cambios de estado en las patillas RB7:RB4 y las que tienen lugar por el desbordamiento del temporizador TMR0, el resto de los controles de perifricos y funciones especiales se encuentran en los registros PIR1, PIR2. El bit GIE (INTCON<7> habilita las interrupciones no enmascaradas, por el contrario, cuando est a cero, deshabilita todas las interrupciones con independencia de cmo se encuentren los bits individuales de interrupciones. Cuando tiene lugar una interrupcin, el valor del Contador de Programa (PC) se enva al Stack y se carga con 0004 hex (vector de interrupcin). El microcontrolador comenzar a ejecutar las instrucciones de la subrutina de interrupciones y cuando se encuentre una instruccin RETFILE dar por finalizada la subrutina volviendo a la siguiente direccin de la ltima instruccin ejecutada antes de producirse la interrupcin. Hay que tener en cuenta que cuando se produce un Reset se borra el bit GIE, por lo que se deshabilitan todas las interrupciones, aunque se habiliten los bits individuales. Al atender una interrupcin, el bit GIE se borra automticamente con lo que se deshabilita la posibilidad de futuras interrupciones, la direccin de retorno se enva al Stack y el Contador de Programa se carga con la direccin 0004 hex. (vector de interrupcin). En esta direccin comenzar la subrutina de servicio de interrupciones. Para determinar qu perifrico o funcin ha ocasionado la interrupcin se debern leer los bits de control de las correspondientes interrupciones Cada fuente de interrupcin posee dos bits asociados a ella: Una Bandera (terminada en F) de Interrupcin, la cual es activada (en alto) por el evento para solicitar una interrupcin. Una Mscara (terminada en E) Local de Interrupcin, la cual si est desactivada (en bajo) bloquear la solicitud de interrupcin correspondiente, pero si est activada
2

(en alto) permitir la solicitud de Interrupcin. Adems existe una mscara de interrupcin global GIE (INTCON<7>), la cual bloquear todas las solicitudes de interrupcin si est desactivada (GIE=0). Algunas fuentes de interrupcin tambin poseen una segunda mscara de interrupcin global denominada PEIE (INTCON<6>). De hecho, acta sobre todas las fuentes de interrupcin, excepto las interrupciones debidas a la patita INT, el sobre flujo del Timer 0 y las interrupciones del puerto B (INTF, T0IF y RBIF).

De acuerdo a lo anterior, la nica manera en que una solicitud de interrupcin provoca en efecto una interrupcin en el programa es cuando: La mscara global est activada (GIE=1). (En su caso) la mscara global de perifricos est activada (PEIE=1) La mscara local est activada Ocurre un evento que activa la bandera correspondiente.

1.2. Tipos de Eventos y Bits de Habilitacin


En el registro INTCON slo se encuentran tres controles de interrupciones: 1. Un cambio de estado sobre la lnea RB0 ( pin de interrupcin externa RB0/INT ) 2. Desbordamiento de la cuenta del registro TMR0 ( TMR0 overflow interrupt ) 3. Un cambio de estado sobre una de las lneas de RB4 a RB7 ( PORTB change interrupts ). Los cuales se describen a continuacin: 1. Interrupcin de TMR0 Si el temporizador TMR0 se ha desbordado, el flag de overflow (TOIF) del registro INTCON se habr puesto a uno. Es evidente que previamente se habrn borrado todos los flags que pudieran ocasionar una interrupcin, as se evitarn interrupciones recursivas. 2. Interrupcin externa por RB0/INT Las transiciones de bajo a alto, o viceversa, de la patilla RB0/INT puede ocasionar una interrupcin, el flanco que la producir se elige con el bit INTEDG (OPTION_REG<6>). Cuando este bit se pone a uno, la interrupcin tendr lugar en la transicin de cero a uno, por el contrario, el flanco de bajada ocasionar la interrupcin cuando el bit se coloque a cero. En cuanto tenga lugar en la patilla RB0/INT el flanco elegido, el bit INTF (INTCON<1>) se pondr a uno; el estado de los bits de interrupciones globales (GIE) e interrupcin externa (INTE) determina si se atender o no la interrupcin. Si estn habilitadas y el microcontrolador se encuentra en reposo (Sleep) ste despertar. 3. Interrupcin por cambio de estado en RB4:RB7 Adems de la interrupcin externa descrita, estos microcontroladores se disponen de otro modo de ocasionar una interrupcin externa; cualquier cambio de estado que se produzca
3

en las patillas RB7:RB4 tambin la ocasionar, para habilitarla, hay que poner a uno el flag de interrupciones RBIE (INTCON<3>). Cualquier cambio de estado que haya en estas patillas har que el bit RBIF (INTCON<0>) se ponga a uno y se produzca la interrupcin. Para que el sistema pueda ocasionar una interrupcin por cambios de estado en las patillas RB7:RB4 es necesario realizar algunas actuaciones previas que no son necesarias en otro tipo de interrupciones ya que el estado de estas cuatro patillas es comparado continuamente, en la fase Q1 del reloj, con el estado previo de los latch del puerto. Por consiguiente, antes de habilitar esta interrupcin habr que leer o escribir en l para que su contenido se quede almacenado en los latch; solamente los bits configurados como entradas se comparan y si son diferentes a los previamente almacenados pueden ocasionar una interrupcin. El resto de los controles de perifricos y funciones especiales se encuentran en los registros PIR1, PIR2 (Banderas) y PIE1, PIE2 (Mascaras). Una interrupcin de cualquiera de estos eventos puede ser conseguida habilitando o deshabilitando independientemente los siguientes bits de los registro INTCON, PIR1 y, PIR2: INTE. Si este bit est en 1 habilitar la interrupcin de cambio de estado sobre la lnea RB0 T0IE. Si este bit est en 1 habilitar la interrupcin de final de conteo del registro TMR0 RBIE. Si este bit est en 1 habilitar la interrupcin de cambio de estado sobre una de las lneas de RB4 a RB7 EEIE. Si este bit est en 1 habilitar la interrupcin de final de escritura sobre la EEPROM PSPIE. Si este bit est en habilitar la interrupcin por lectura/escritura en el PSP ADIF. Si este bit est en 1 habilitar la interrupcin del convertidor A/D RCIE. Si este bit est en 1 habilitar interrupcin por recepcin en el USAR TXIE. Si este bit est en 1 habilitar la interrupcin de transmisin por el USAR SSPIE. Si este bit est en 1 habilitar la interrupcin del SSP CCP1IE. Si este bit est en 1 habilitar la interrupcin del CCPI TMR2IE. Si este bit est en 1 habilitar la interrupcin por desbordamiento de TMR2 emparejado a PR2 TMR1IE. Si este bit est en 1 habilitar la interrupcin por desbordamiento de TMR1 CCP2IE. Si este bit est en 1 habilitar la interrupcin de CCP2 BCLIE. Si este bit est en 1 habilitar la interrupcin por colisin de bus SSP Existe otros dos bits de habilitacin: Interrupcin global GIE (INTCON<7>), la cual bloquear todas las solicitudes de interrupcin si est desactivada (GIE=0) y si este bit est en 1 habilitar todas las interrupciones. Algunas fuentes de interrupcin tambin poseen una segunda mscara de interrupcin global denominada PEIE (INTCON<6>). De hecho, acta sobre todas las fuentes de interrupcin, excepto las interrupciones: debidas a la patita INT,
4

el sobreflujo del Timer 0 y las interrupciones del puerto B (INTF, T0IF y RBIF).

1.3. Vector de Interrupcin y Control de Interrupcin


Cualquier evento que sea habilitado, o se manifieste, el PIC interrumpe la ejecucin del programa, almacena automticamente en el STACK el valor actual del PROGRAM COUNTER y este pasa a ejecutar la instruccin presente en la direccin de memoria 0004H, denominada Interrupt Vector ( vector de interrupcin ). Por lo tanto, desde este punto debemos colocar la llamada a la subrutina de control denominada Interrupt Handler ( control de interrupcin ). Se puede habilitar varias interrupciones simultneamente, porque la primera providencia del control de interrupcin es la de verificar cul evento habilitado genera la interrupcin de la ejecucin de parte del programa. Este control puede ser efectuado utilizando Interrupt Flag ( bandera de interrupcin ).

1.4. Bandera de Interrupcin


Dado que cualquier interrupcin genera una llamada a la direccin 04H, en los registros INTCON, PIR1 y PIR2 est presente varias banderas que indican cul evento es el que genera la interrupcin, las cuales se describen a continuacin:
Interrup. INTF T0IF RBIF Descripcin Registro Externa. Se coloca en 1 cuando la interrupcin INT ocurre, es decir cuando INTCON cambia de estado la lnea RB0. Desbordamiento del TMR0. Se coloca en 1 cuando el TMR0 pasa de 00FFh INTCON a 00h, es decir cuando termin de contar el timer TMR0 Por cambios en el PortB. Se coloca en 1 cuando una de las entradas ( RB4 a RB7 ) cambia, es decir cuando cambia de estado de una las lneas de RB4 a INTCON RB7 Finalizacin de escritura en la memoria EEPROM. Se coloca EEIF en 1 cuando la operacin de escritura ha terminado, debe ser colocada a 0 por PIR2 software. Lectura/Escritura puerto paralelo. PIR1 Convertidor A/D. PIR1 Recepcin USAR. PIR1 Transmisin USAR. PIR1 Puerto Serie Sncrono. PIR1 Capturador/Comparador 1. PIR1 Temporizador TMR2. PIR1 Temporizador TMR1. PIR1 Capturador/Comparador 2. PIR2 PIR2 Indica la colisin en el bus SSP

EEIF PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF CCP2IF BCLIF

Importante. Una vez conocida cual de las banderas est activada, el control de interrupcin debe generar la interrupcin correspondiente.

1.5. Retorno de un control de interrupcin


5

Cuando se genera una interrupcin el PIC deshabilita automticamente el bit GIE ( Global Interrupt Enable ) del registro INTCON, de modo que deshabilita todas las interrupciones restantes. Para poder retornar al programa principal y reinicializar este bit se debe utilizar la instruccin:
RETFIE

1.6. Proceso de reconocimiento de una interrupcin


Cuando se cumplen las siguientes tres o cuatro condiciones simultneamente: El bit GIE est activado (en alto) El bit PEIE est activado (en alto), en las respectivos eventos Se produce un evento que solicita interrupcin (se activa alguna de las banderas de interrupcin) Est activada la mscara correspondiente a la bandera activada. Entonces la CPU es interrumpida inmediatamente y ejecuta lo siguiente: Termina la ejecucin de la instruccin actual. Desactiva el bit GIE (GIE=0) para bloquear cualquier otra solicitud de interrupcin. La direccin de programa de la siguiente instruccin a ejecutar es guardada en el stack. Ejecuta un salto a la localidad de programa 0004h denominada vector de interrupcin, en donde el usuario deber haber colocado el inicio de la rutina de atencin a la interrupcin. Ejecuta la rutina de atencin a la interrupcin escrita por el usuario, en la cual ste podr constatar la fuente de interrupcin consultando por poleo las banderas de interrupcin. La rutina de atencin a la interrupcin deber limpiar los bits de las banderas que solicit la interrupcin antes de rehabilitar las interrupciones, para evitar interrupciones recursivas. La rutina de atencin deber terminar con una instruccin RETFIE, la cual activa nuevamente el bit GIE (GIE=1) y lee el stack para continuar la ejecucin del programa que fue interrumpido en la siguiente instruccin.

1.7. Diagrama lgico de las interrupciones


La lgica de activacin de mscaras y banderas descrita arriba puede entenderse en trminos del diagrama lgico mostrado en la siguiente figura. En este diagrama se muestran las 14 fuentes de interrupcin de los microcontroladores de la familia PIC16F87x y se usan los nombres especficos de cada fuente de interrupcin para sus respectivas banderas y mscaras de interrupcin.

La siguiente tabla se muestra las diferencias entre los dos modelos de 28 y 40 pines:

1.8. Salvar el contexto durante una interrupcin


Dado que el programa principal no puede prever en qu punto ser interrumpido, la rutina de atencin a la interrupcin debe ser tal que no altere ninguno de los registros que requiere paso a paso el programa principal para su operacin normal. Estos registros son los que van guardando el contexto del programa (tal como en qu banco est, el resultado de la ltima operacin, etc.) y son: Registro STATUS Registro W Registro PCLATH (si se estn usando las pginas 1, 2 o 3). Estos microcontroladores disponen de ocho niveles de Stack y cuando se produce una interrupcin slo se salva en l la direccin de retorno (PC). Cualquier operacin que se realice en la subrutina de interrupciones podr destruir, o modificar, el contenido de los datos almacenados en ciertos registros y que podran ser necesarios cuando se retorne de la, subrutina de servicio de interrupciones. Si esto fuera as, se debern guardar los datos de los registros cuyo contenido sea de inters y que vayan a ser modificados a lo largo de la subrutina de servicio de interrupciones. Una vez finalizada la subrutina, se debern recuperar para que queden en su estado original. Un ejemplo para salvar los registros de estado, W y PCLATH en memoria puede ser el siguiente:
7

El siguiente es un ejemplo del cdigo que deber incluirse al inicio y al final de la rutina de atencin a la interrupcin para salvar y recuperar el contexto:
;* Salva informacin de contexto previo a la ruitna de atencin a la interrupcin MOVWF W_Temp ;Salva el registro W en en un registro temporal SWAPF STATUS,W ;Copia STATUS en W (usa SWAP para no alterarlo al copiarlo) CLRF STATUS ;Banco cero, sin importar banco actual MOVWF STATUS_temp ;Salva STATUS en STATUS_temp (Banco 0) ; MOVF PCLATH,W ;slo se requiere si se estn usando las pginas 1,2,y/o 3 ; MOVWF PCLATH_temp ;salva PCLATH ; CLRF PCLATH ;pgina 0 sin importar pgina actual ... ;aqu se escribe el cdigo de la rutina de atencin a la interrupcin ... ;* A continuacin restablece la informacin de contexto que salv al inicio ; MOVF PCLATH_Temp.,W ;rescata PCLATH ; MOVWF PCLATH ;si se usan las paginas 1,2 y/o 3 SWAPF STATUS_temp,W ;rescata el STATUS original MOVWF STATUS ;restablece banco original SWAPF W_temp,F ;rescata el W original SWAPF W_temp,W ;sin alterar el STATUS ya rescatado. RETFIE

El programa est dividido en dos partes, la primera guarda el contenido de los registros y se ejecutan las instrucciones propias de la subrutina de servicio de interrupciones (comprobar quin ocasion la interrupcin, etc.) y la segunda recupera de la memoria los registros previamente almacenados. La instruccin RETFIE llevar el flujo del programa a la direccin siguiente a la ltima instruccin ejecutada (recupera el PC del Stack) con los registros ya actualizados. 1.9. REGISTROS INVOLUCRADOS 1. REGISTRO INTCON (Direccin 0Bh, 8Bh, l0Bh, 18Bh) El registro INTCON es un registro de lectura y escritura que contiene los bit de habilitacin de interrupciones por desbordamiento de TMR0 por cambio de nivel en el PORTB e interrupciones externas por la lnea RBO/INT.
R/W-0 GIE Bit 7 bit 7: R/W-0 PEIE R/W-0 T0IE R/W-0 INTE R/W-0 RBIE R/W-0 T0IF R/W-0 INTF R/W-x RBIF Bit 0

GIE: bit de habilitacin global de Interrupciones 1= Habilita el permiso de interrupciones 0= Inhabilita todas las interrupciones PEIE: bit de habilitacin de interrupciones de los perifricos que no se controla con el registro INTCON 1= Habilita el permiso de interrupciones de los perifricos 0= Inhabilita las interrupciones de los perifricos T0IE: bit de habilitacin de la interrupcin por desbordamiento del TMR0 8

bit 6:

bit 5:

1= Habilita la interrupcin 0= Inhabilita la interrupcin bit 4: INTE: bit de habilitacin de la interrupcin externa por el pin RB0/INT 1= Habilita la interrupcin 0= Inhabilita la interrupcin RBIE: bit de habilitacin de interrupcin por cambio de nivel en el PORTB 1= Habilita la interrupcin 0= Inhabilita la interrupcin T0IF: flag de indicacin de desbordamiento de TMR0 1= El TMR0 se ha desbordado. Se borra por software 0= El TMR0 no se ha desbordado INTF: flag de estado de la interrupcin externa INT 1= La interrupcin externa se ha producido. Se borra por software 0= La interrupcin externa no se ha producido RBIF: flag de indicacin de interrupcin por cambio de nivel en PORTB 1= Se ha producido un cambio de nivel en los pines RB7:RB4. Se borra por software. 0= No se ha producido un cambio de nivel en los pines RB7:RB4

bit 3:

bit 2:

bit 1:

bit 0:

2. REGISTRO PIR1 (Direccin 0Ch) El registro de PIR1 contiene los flags individuales que indican las interrupciones provocadas por los perifricos.

R/W-0 PSPIF Bit 7 bit 7:

R/W-0 ADIF

R/W-0 RCIF

R/W-0 TXIF

R/W-0 SSPIF

R/W-0 CCP1IF

R/W-0 TMR21F

R/W-x TMR1IF Bit 0

PSPIF: Flag de Lectura/Escritura por el Puerto Paralelo esclavo

1= Concedido el permiso de interrupcin para la puerta paralela esclava al realizar una operacin de Lectrura/Escritura. En los modelos de 40 pines
0= No est permitida la interrupcin bit 6: ADIF: Flag de final de conversin del convertidor A/D 1= El convertidor A/D ha finalizado la conversin 0= El convertidor A/D no ha finalizado la conversin RCIF: Flag de recepcin por el USAR 1= El buffer de datos recibidos por el USAR est lleno 0= El buffer de datos recibidos por el USAR no est lleno TXIF: Flag de transmisin el USAR 1= El buffer de datos a transmitir no est lleno 0= El buffer de daos a transmitir est lleno 9

bit 5

bit 4:

bit 3:

SSPIF: Flag de interrupcin del Puerto Serie Sncrono (SSP)

1= La condicin del SSP ha ocurrido, debe ponerse a cero por software antes de volver del programa de atencin a la interrupcin. Las condiciones que soporta este bit son:
SPI

Ha tenido lugar una Transmisin / Recepcin


I2C Slave

Ha tenido lugar una Transmisin / Recepcin I2C Master Ha tenido lugar una Transmisin / Recepcin La condicin de salida iniciada se complet por el mdulo de SSP. La condicin de parada inicio se complet por el mdulo de SSP. La condicin de reinicializacin se completo por el mdulo SSP Una condicin de la salida se ha realizado mientras el mdulo de SSP estaba en estado de espera (sistema de Multimaster). 0 = no ha ocurrido ninguna condicin de interrupcin del mdulo SSP bit 2: CCP1IF: Flag de interrupcin de CCPI
Modo Captura

1= Ocurri una captura de TMR1 (debe ponerse a cero por software) 0= No ocurri ninguna captura de TMR1
Modo Comparacin

1= Se ha realizado una comparacin de TMR1 Con el registro emparejado /debe ponerse a cero por Software) 0= No se ha realizado comparacin
Modo PWM

Este modo no se utiliza


bit 1: TMR2IF: Flag de interrupcin de TMR2 emparejado con PR2 1= TMR2 emparejado con PR2 ocurri (debe ponerse a cero por software) 0= No ha ocurrido el emparejamiento de TMR2 con PR2

bit 0: TMR1IF: Flag de desbordamiento de TMRI 1 =el registro se desbordo (debe ponerse a cero por software)
0 = el registre de TMRI no se desbordo

Nota 1. PSPIF est reservado para los dispositivos de 28 pines; se mantiene siempre a cero. 3. REGISTRO PIR2 (Direccin 0Dh) El registro de PIR2 contiene los flags que indican la interrupcin del CCP2, de la colisin del bus SSP y la interrupcin de la escritura en la EEPROM
U-0 --Bit 7 bit 7: bit 6: R/W-0 (1) U-0 --R/W-0 EEIF R/W-0 BCLIF U-0 --U-0 --R/W-x CCP2IF Bit 0

No implementado: se lee como 0 Reservado: Mantiene este bit siempre a cero 10

bit 5: bit 4:

No implementado: se lee como 0 EEIF: Flag que indica si se ha producido escritura en al EEPROM 1 = Se ha completado la escritura en la EEPROM (Se pone a cero por software) 0 = No se ha finalizado la escritura o no se ha comenzado

bit 3: BCLIF: Flag que indica la colisin en el bus 1 = Se ha producido una colisin en el bus SSP, cuando se configura en el modo I2C Master. 0 = No se ha producido colisin en el bus bit 2-1:No implementados: se leen como 0 bit 0: CCP21F: Flag de ininterrupcin de CCP2 Modo Captura 1 = Ha ocurrido una captura del registro TMR1 (debe ponerse a cero por software) 0= No se ha producido captura Modo Comparacin 1 = Se ha producido una comparacin de TMR1 con su pareja (debe ponerse a cero por software). 0 = No se ha producido comparacin Modo PWM No se utiliza

4. REGISTRO PIE1 (Direccin 8Ch) Este registro contiene los bits individuales de habilitacin de interrupciones de los perifricos. Nota. El bit PEIE (INTCON <6>) debe esta a uno para habilitar las interrupciones de cualquiera de los perifricos.
R/W-0 PSPIE(1) Bit 7 bit 7: R/W-0 ADIE R/W-0 RCIE R/W-0 TXIE R/W-0 SSPIE R/W-0 CCP1IE R/W-0 TMR2IE R/W-0 TMR1IE Bit 0

PSPIE: bit de habilitacin de interrupcin por lectura / escritura en el Puerto Paralelo Esclavo. Para los modelos de 40 pines. 1 = Habilita la interrupcin por lectura/escritura en el PSP 0= inhabilita la interrupcin por lectura/escria en el PSP ADIF: bit de habilitacin de interrupcin por finalizacin de la conversin A/D l = Habilita la interrupcin del convertidor A/D 0 = Inhabilita la interrupcin del convertidor A/D RCIE: bit de habilitacin de interrupcin en recepcin por el USAR, cuando se llena el buffer, 1 = Habilita interrupcin por recepcin en el USAR 0 = Inhabilita interrupcin por recepcin en el USAR TXIE: bit de interrupcin al transmitir por el USAR, cuando se vaca el buffer. 11

bit 6:

bit 5:

bit 4:

1 = Habilita la interrupcin de transmisin por el USAR 0 = Inhabilita la interrupcin de transmisin por el USAR bit 3: SSPIE: bit de habilitacin de interrupcin por el Puerto Serie Sncrono (SSP) 1= Habilita la interrupcin del SSP 0= Inhabilita la- interrupcin del SSP

bit 2: CCP1IE: bit de habilitacin de interrupcin del mdulo CCPI cuando se produce una captura o una comparacin. 1= Habilita la interrupcin del CCPI 0=. Inhabilita la interrupcin del CCPI bit 1: TMR2IE: bit de habilitacin de interrupcin por desbordamiento de TMR2 que est emparejado con el registro PR2 (92h) 1= Habilita la interrupcin por desbordamiento de TMR2 emparejado a PR2 0= Inhabilita la interrupcin de TMR2 emparejado a PR2 TMR1IE: bit de habilitacin de interrupcin por desbordamiento del TMRI 1= Habilita la interrupcin por desbordamiento de TMR1 0= Inhabilita la interrupcin por desbordamiento de TMR1

bit 0:

Nota 1. PSPIE para los dispositivos de 28 pines, siempre mantiene este bit a cero. 5. REGISTRO PIE2 (Direccin 8Dh) El registro de PIE2 contiene los bits individuales que habilita las interrupciones del perifrico CCP2, la interrupcin por colisin del SSP y la interrupcin de escritura en la EEPROM.
U-0 --Bit 7 bit 7: bit 6 bit 5: bit 4: R/W-0 U-0 --R/W-0 R/W-0 BCLIE U-0 -U-0 -R/W-0 CCP2IE Bit 0

EEIE

No implementado: se lee como 0 Reservado, Mantiene este bits a cero No implementado: se lee como 0 EEIE: Habilita la interrupcin por escritura en la EEPROM de datos 1= Habilita la interrupcin por escritura de la EEPROM de datos 0 =Deshabilita la interrupcin por escritura en la EEPROM de datos BCLIE: Habilita la interrupcin por colisin en el bus SSP cuando dos o ms maestros tratan de transferir al mismo tiempo. 1 = Habilita la interrupcin por colisin de bus SSP 0 = Deshabilita la interrupcin por colisin en el bus SSP.

bit 3:

bit 2-1 No implementados, se leen como 0

12

bit 0:

CCP2IE: Habilita la interrupcin del modulo CCP2 1 = habilita la interrupcin de CCP2 0 = inhabilita la interrupcin de CCP2

Ejemplo 1 Medidor de periodo mejorado por Interrupciones Como ya se dijo para el ejemplo Medidor de periodo del Modo captura, ste tiene limitantes muy grandes especialmente en el lmite superior de frecuencia que puede procesar correctamente, debido a que durante el tiempo empleado en la transmisin del dato no puede detectar ninguna transicin de la seal de entrada. Esto puede corregirse si la deteccin de la transicin se realiza mediante interrupciones. La modificacin se muestra en el siguiente listado.
;**************************************************************** ;* Este programa mide el periodo de una seal oscilatoria en la * ;* patita RC2/CCP1. Por INTERRUPCIONES generadas por la captura * ;* de cada transicin de 0 a 1 en dicha patita. * ;* El valor de periodo capturado representa el nmero de ciclos * ;* Tcy por periodo. Dicho valor se enva continuamente por * ;* el puerto serie. Se supone un cristal de 14.7456 Mhz * ;**************************************************************** Include "p16f877.inc" msnib EQU 0x20 lsnib EQU 0x21 STATUS_temp EQU 0x70 W_temp EQU 0x71 org 0x0000 GOTO inic org 0x0004 GOTO interr inic ;inicia con un reset ;vector de interrupcin ;salta a la rutina de atencin a la interrupcin

CALL initrans ;inicializa puerto serie como transmisor BSF STATUS,RP0 ;Banco1 BSF TRISC,2 ;patita RC2/CCP1 como entrada BCF STATUS,RP0 ;Banco 0 MOVLW 0x01 MOVWF T1CON ;Configura Timer1 modo temporizador, preesc 1/1 CLRF TMR1H ;Inicializa en cero el timer 1 CLRF TMR1L ;apaga el mdulo CCP para inicializar CLRF CCP1CON ;limpia latch de CCP1 BSF CCP1CON,CCP1M2 ;Habilita modulo CCP1 para modo de captura BSF CCP1CON,CCP1M0 ;en transicin de subida BCF PIR1,CCP1IF ;limpia bandera de interrupcion. BSF STATUS,RP0 ;banco 1 BSF PIE1,CCP1IE ;Habilita interrupciones del CCP1 BCF STATUS,RP0 ;banco 0 BSF INTCON,PEIE ;Habilita interrupciones de perifricos BSF INTCON,GIE ;Habilita interrupciones globales

;** Programa principal: ;** Lazo infinito main GOTO main

;repite

;***** rutina de atencin a la interrupcin interr MOVWF W_temp ;salva contexto SWAPF STATUS,W

13

CLRF STATUS MOVWF STATUS_temp ;Envo a la PC MOVF CCPR1H,W CALL Envbyte MOVF CCPR1L,W CALL Envbyte MOVLW 0x0D CALL envia MOVLW 0x0A CALL envia ;copia periodo capturado ;y lo enva por el puerto serie

;enva separador

;Checa bandera CCP1IF y pone TMR1 = 0 BTFSS PIR1,CCP1IF ;checa bandera de captura de evento GOTO ret ;si no es bandera de captura retorna BCF PIR1,CCP1IF ;si es bandera de captura, la limpia CLRF TMR1L ;limpia la cuenta del timer 1 CLRF TMR1H ret SWAPF STATUS_temp,W ;restablece contexto MOVWF STATUS SWAPF W_temp,F SWAPF W_temp,W RETFIE

;*************************************************************** ; Subrutina que enva el byte en W por el puerto serie, separado ; en los cdigos ASCII de sus dos nibbles hexadecimales ;*************************************************************** Envbyte: MOVWF msnib ;pone byte en msnib MOVWF lsnib ;y una copia en lsnib SWAPF msnib,1 ;intercambia nibbles en lsnib MOVLW 0x0F ;mscara para limpiar el nibble alto ANDWF msnib,1 ;limpia parte alta de msnib ANDWF lsnib,1 ;limpia parte alta de lsnib MOVF msnib,W ;carga msnib en W CALL asc ;obtiene cdigo ASCII equivalente CALL envia ;lo enva por el puerto serie MOVF lsnib,W ;carga lsnib en W CALL asc ;obtiene cdigo ASCII equivalente CALL envia ;lo enva por el puerto serie RETURN asc ADDWF PCL,1 ;Calcula el cdigo a retornar ;Saltando W instrucciones adelante DT "0123456789ABCDEF" ;**************************************************************** ;Subrutina para inicializar el puerto serie USART como transmisor ;a 9600 Bauds, considerando un cristal de reloj de 14.7456 MHZ ;**************************************************************** initrans: BCF STATUS,RP1 BSF STATUS,RP0 ;banco 1 BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad baja) MOVLW 0x17 ;valor para 9600 Bauds (Fosc=14.7456 Mhz) MOVWF SPBRG ;configura 9600 Bauds BCF TXSTA,SYNC ;limpia bit SYNC (modo asncrono) BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisin) BCF STATUS,RP0 ;regresa al banco 0 BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie) RETURN ;*************************************************************** ;Subrutina para enviar el byte guardado en W por el puerto serie ;***************************************************************

14

envia BSF STATUS,RP0 esp BTFSS TXSTA,TRMT GOTO esp BCF STATUS,RP0 MOVWF TXREG RETURN end

;banco 1 ;checa si el buffer de transmisin ;si est ocupado espera ;regresa al banco 0 ;enva dato guardado en W

Anlisis del cdigo


En primer lugar configuramos el registro T1CON, CCP1CON, PIR1, PIE1 e INTCON. Registro T1CON T1CON=0x01 --0 Bit 7 --0 T1CKPS1 0 T1CKPS0 0 T1OSCEN 0 T1SYNC 0 TMR1CS 0 TMR1ON 1 Bit 0

Divisor de frecuencia del preescaler a 1/1, T1CKPS1=0 T1CKPS0=0 TMR1CS=0, seleccin de la fuente de reloj a modo temporizador TMR1ON=1, habilitacin del Timer1 Registro CCP1CON: --Bit 7 --CCP1X 0 CCP1Y 0 CCP1M3 0 CCP1M2 1 CCP1M1 0 CCP1M0 1 Bit 0

configurado el Mdulo CCP1 para modo captura por flanco ascendente en RCy/CCPx, como se muestra en la siguiente figura: CCP1M3=0 CCP1M2=1 CCP1M1=0 CCP1M0=1

Registro PIR1:

Limpia la bandera de interrupcin.


BCF PIR1,CCP1IF ;limpia bandera de interrupcion.

Registro PIE1:

Habilita interrupciones del CCP1.


BSF PIE1,CCP1IE ;Habilita interrupciones del CCP1

15

Registro INTCON:

Habilita interrupciones de perifricos y habilita interrupciones globales.


BSF INTCON,PEIE BSF INTCON,GIE ;Habilita interrupciones de perifricos ;Habilita interrupciones globales

Programa principal. Este programa mide el periodo de una seal oscilatoria en la patita RC2/CCP1. El valor de periodo capturado representa el nmero de ciclos Tcy por periodo y se enva continuamente por el puerto serie. Repitiendo continuamente:
main GOTO main ;repite

Subrutina de Interrupcin: interr

En primer lugar la rutina de atencin a la interrupcin interr, salva el contexto (W y STATUS):


MOVWF W_temp SWAPF STATUS,W CLRF STATUS MOVWF STATUS_temp ;salva contexto

Aqu realiza propiamente las acciones de la subrutina de la interrupcin interr. Copia periodo capturado y lo enva por el puerto serie, luego enva el separador 0x0D y 0x0A. A continuacin checa bandera de captura de evento; si no es bandera de captura retorna, si es bandera de captura, la limpia, y tambin limpia la cuenta del timer 1.
BTFSS PIR1,CCP1IF GOTO ret BCF PIR1,CCP1IF CLRF TMR1L CLRF TMR1H ;checa bandera de ;si no es bandera ;si es bandera de ;limpia la cuenta captura de evento de captura retorna captura, la limpia del timer 1

Por ltimo, la rutina de atencin a la interrupcin interr reestablece el contexto (W y STATUS):


ret SWAPF MOVWF SWAPF SWAPF STATUS_temp,W ;restablece contexto STATUS W_temp,F W_temp,W

Subrutinas. Son tres, envbyte, initrans y envia:

envbyte, subrutina que enva el byte en W por el puerto serie, separado en los cdigos ASCII de sus dos nibbles hexadecimales. initrans, subrutina para inicializar el puerto serie USART como transmisor a 9600 Bauds, considerando un cristal de reloj de 14.7456 MHZ. envia, subrutina para enviar el byte guardado en W por el puerto serie.
16

Ejemplo 2 Ejemplo prctico de control de interrupcin Se toma como base de partida el cdigo de la aplicacin LED.ASM para realizar un led ( LED1 ) intermitente, en donde este programa tiene un ciclo continuo y retardo de software mediante una subrutina Delay. Adicionalmente, presionando una de las teclas SW1 a SW4 ubicadas en los pines RB4 a RB7 respectivamente, se accede temporalmente al LED2 con la ejecucin del programa principal, encendindose inmediatamente y permanece encendido por un tiempo para 3 intermitencias del LED1, sin influenciar de manera evidente la frecuencia intermitente del LED1. El circuito a ser realizado se presenta a continuacin:

El cdigo de este ejemplo est disponible en INTRB.ASM y se muestra a continuacin:


;************************************************** ; Pic by example ; INTRB.ASM ; ;************************************************** PROCESSOR RADIX INCLUDE 16F877 DEC "P16F877.INC"

;Setup of PIC configuration flags ;XT oscillator ;Disable watch dog timer ;Enable power up timer ;Disable code protect __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

17

LED1 LED2 LED3 LED4

EQU EQU EQU EQU ORG

0 1 2 3 20H 2 1

el led 2 se prende cada 3 cilcos del led 1

Count EQU 0X20 Count Count1 EQU 0x21 nTick nTick EQU 0x22

RES RES

;Registro utilizado para contar el nmero de ;intermitencias del LED 1

;Reset Vector ;Punto de inicio del programa al reset de la CPU. ORG 00H

;Salta al cuerpo principal del programa. Puesto que el salto es ;necesario, para evitar toda la parte de cdigo de la gestin de ;la interrupcin. goto Start

;Interrupt vector ;Punto de inicio para toda la subrutina de gestin de la ;interrupcin. ORG 04H

;********************************************************************** ; Interrupt handler ;********************************************************************** ;Accede al led 2 para segnalare che c'e' stato un interrupt bsf PORTB,LED2 ;Inicializa el contador de intermitencia del LED1 movlw 6 (cambiar por 3 ) movwf nTick ;Encera nuevamente el flag RBIF para consentirse la 'interrupt ;de repetirse bcf INTCON,RBIF ; siempre se pone en cero la bandera ;Retorna al programa principal retfie ; se vuelve a poner la bandera global en 1 para tomar otra nueva interrupcion ;********************************************************************** ; Programa principal ;********************************************************************** Start: ;Conmuta al segundo banco de la memoria para acceder a los ;registros TRISA y TRISB bsf STATUS,RP0

;Definicin del puerto B ;La lnea de RB0 a RB3 vengono programmate in uscita per ;essere collegate ai quattro led ;Le linee da RB4 a RB7 vengono programmate in ingresso per ;essere collegate ai quattro pulsanti movlw movwf 11110000B TRISB

;Conmuta al primer banco de la memoria

18

bcf ;Spegne bcf bcf bcf bcf

STATUS,RP0 tutti i led collegati sulla porta B PORTB,LED1 PORTB,LED2 PORTB,LED3 PORTB,LED4

;Habilita la interrupcin del cambio de estado de las lneas ;RB4,5,6,7 movlw 10001000B ; 4 bit mascara especifica del evento movwf INTCON ;********************************************************************** ; Loop principal ;********************************************************************** MainLoop call btfss goto goto Delay PORTB,LED1 TurnOnLed1 TurnOffLed1 ;Retardo de software ;Led acceso ? ;No, lo accende ;Si, lo spegne

;Accensione led e decremento del contatore di lampeggi TurnOnLed1 bsf

PORTB,LED1

;Controlla se LED 2 di segnalazione dell'interrupt e' gia ;acceso. ;Se e' acceso decrementa el contador nTick ad ogni lampeggio ;di LED1. Quando nTick vale 0 spegne LED 2 btfss goto decf btfss goto bcf goto PORTB,LED2 MainLoop nTick,1 STATUS,Z MainLoop PORTB,LED2 MainLoop ;LED2 acceso ? ;No, continua a lampeggiare ;Si, decrementa nTick ;nTick = 0 ? ;No, continua a lampeggiare ;Si, spegne LED2 ;Continua a lampeggiare

;Spegnimento led TurnOffLed1 bcf goto PORTB,LED1 MainLoop ;Spegne LED 1 ;Continua a lampeggiare

;********************************************************************** ; Subroutine ;********************************************************************** ;Subroutine de retardo de software Delay clrf clrf DelayLoop Count Count+1

19

decfsz goto decfsz goto return END

Count,1 DelayLoop Count+1,1 DelayLoop

El acceso al LED 2 en correspondencia al presionar una tecla es ligeramente retardado, en cuanto a la lectura de estado de la lnea RB4-RB7 no ser efectuada por el hardware de control de interrupcin del programa principal a cada ciclo del lazo. El rpido retardo es devuelto por la presencia de la subrutina Delay dentro del lazo principal. Anlisis del cdigo INTRB.ASM Se parte de la direccin ORG 00H que sirve para posicionar el programa a partir de la posicin de reset, que es la localizacin 0. La primera instrucin que el PIC encuentra es un desvo incondicionado para la etiqueta Start:
ORG goto 00H Start

seguido de una nueva direccin:


ORG 04H

se entra al cdigo de una subrutina de control de interrupcin:


bsf movlw movwf bcf retfie PORTB,LED2

((cambiar por 3)) 6 nTick


INTCON,RBIF

Como una interrupcin de control se localiza necesariamente a partir de la direccin 04H, para evitar que siga ejecutando esta posicin o reset se debe terminar con una instruccin de salto incondicional. El cdigo de control de interrupcin, en este caso, es muy simple y se limita a encender el LED D2, que encera el registro existente nTick con el nmero de intermitencias hasta llegar al LED D2, deber apagarse y encerar el flag RBIF para permitir al circuito la generacin de una nueva interrupcin. La instruccin RETFIE permite al PIC retornar a ejecutar el programa principal que fue interrumpido por la interrupcin. y activar la mascarca GUI pra aceptar una nueva interrupcion 1. Generacin de la interrupcin cuando se presiona una tecla cualquiera Las instrucciones que configuran el registro INTCON son las siguientes:
movlw 10001000B

20

movwf

INTCON

donde se coloca en uno el bit GIE ( bit 7 ) que es la habilitacin global de las interrupciones y tambin se cola en uno el bit RBIF ( bit 3 ) que habilita la interrupcin sobre la variacin de estado de la lnea RB4-RB7. En la prctica, habiendo conectado como llaves SW1,SW2, SW3 e SW4 sobre la lnea de I/O RB4, RB5, RB6 y RB7 , con la presin de cualquiera de las teclas se produce una variacin de estado que genera una interrupcin. 2. El programa principal
y en cada encendido del led1 decrenta el contador

Realiza la operacin de encender y apagar el LED 1, y decrementa el contador nTich hasta llegar a cero; en correspondencia con esto ser apagado el LED 2. Ejemplo 3 Ejemplo prctico de control de varias interrupciones Para controlar varias interrupciones simultneamente se utiliza el siguiente circuito, en donde las interrupciones a ser controladas son: la interrupcin sobre la cuenta del registro TMR0 y la interrupcin al cambio de nivel de las lneas RB4 a RB7. La aplicacin establece la ejecucin de las tres siguientes tareas a una velocidad tal que se asemeja con una ejecucin paralela: El LED D1 es intermitente con la frecuencia de retardo de software mediante una subrutina Delay, El LED D2 se prende por tres ciclos del LED D1 cuando se presiona una tecla cualquiera de las lneas RB4 a RB7. El LED D3 es intermitente a una frecuencia correspondiente a la frecuencias de oscilacin del cristal dividido para 4 y una relacin 1:256, el tiempo de prendido y apagado se establece con la cuenta de TMR0 hasta producirse overflow.

El circuito a ser realizado se presenta a continuacin:

21

El cdigo de este ejemplo est disponible en DBLINT.ASM y se muestra a continuacin:


;************************************************** ; Pic by example ; DBLINT.ASM ; ;************************************************** PROCESSOR RADIX INCLUDE 16F877 DEC "P16F877.INC"

;Setup of PIC configuration flags ;XT oscillator ;Disable watch dog timer ;Enable power up timer ;Disable code protect __CONFIG LED1 LED2 LED3 LED4 EQU EQU EQU EQU 0 1 2 3 _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

ORG 20H ============ Count EQU 0X20 Count RES 2 <<<<<<<<<<<<<<<<<< Count1 EQU 0x21 -<<<<<<<<<<<<<<<<<< nTick RES 1 nTick EQU 0x22 ;Reset Vector ;Starting point at CPU reset ORG 00H

;Jump to the main body of program to avoid the interrupt ;handler ;code.

22

goto

Start

;Interrupt vector ;Starting point at CPU interrupts ORG 04H

;********************************************************************** ; Interrupt handler ;********************************************************************** ;Check the interrupt event btfsc goto btfsc goto INTCON,T0IF IntT0IF INTCON,RBIF IntRBIF

; verifica que no haya una interuppcion ; verifica cual evento se produjo

:************************************************************************************************************************ ;Reset the T0IF and RBIF flags to re-enable the interrupts End_ih bcf bcf INTCON,T0IF INTCON,RBIF

;Go back to the main program retfie

- bajar -

;********************************************************************** ; TMR0 Interrupt handler ;********************************************************************** IntT0IF ;Turn on LED3 if it's off btfsc goto bsf goto LED3_off bcf goto PORTB,LED3 LED3_off PORTB,LED3 End_ih PORTB,LED3 End_ih

; prender o apagar cuando se realiza un overflock

;********************************************************************** ; RB4-RB7 interrupt handler ;********************************************************************** IntRBIF ;Turn on LED 2 bsf PORTB,LED2

;Starts the LED1 blink counter movlw 6 ============ movwf goto nTick

movlw 3

End_ih

;********************************************************************** ; Main body ;********************************************************************** Start: ;Conmuta al segundo banco de la memoria para acceder al ;registro TRISB bsf STATUS,RP0

23

;Definicin del puerto B ;Definicin de la lnea de I/O (0=Salida, 1=Ingreso) ;Le linee da RB0 a RB3 vengono programmate in uscita per ;essere collegate ai quattro led Le linee da RB4 a RB7 vengono ;programmate in ingresso per essere collegate ai quattro ;pulsanti movlw movwf 11110000B TRISB

;Assegna il PRESCALER a TMR0 e lo configura a 1:256 movlw movwf 00000111B OPTION_REG

;Commuta sul primo banco dei registri bcf ;Spegne bcf bcf bcf bcf STATUS,RP0 tutti i led collegati sulla porta B PORTB,LED1 PORTB,LED2 PORTB,LED3 PORTB,LED4

;Abilita l'interrupt sul TMR0 e sul cambiamento di stato delle ;linee RB4,5,6,7 movlw movwf 10101000B INTCON

; bit 5 activado para el timer 0

;********************************************************************** ; Loop principale ;********************************************************************** MainLoop call btfss goto goto Delay PORTB,LED1 TurnOnLed1 TurnOffLed1 ;Ritardo software ;Led acceso ? ;No, lo accende ;Si, lo spegne

;Accensione led e decremento del contatore di lampeggi TurnOnLed1 bsf PORTB,LED1

;Controlla se LED 2 di segnalazione dell'interrupt e' gia ;acceso. ;Se e' acceso decrementa il contatore nTick ad ogni lampeggio ;di LED1. Quando nTick vale 0 spegne LED 2 btfss goto decf btfss goto bcf goto PORTB,LED2 MainLoop nTick,1 STATUS,Z MainLoop PORTB,LED2 MainLoop ;LED2 acceso ? ;No, continua a lampeggiare ;Si, decrementa nTick ;nTick = 0 ? ;No, continua a lampeggiare ;Si, spegne LED2 ;Continua a lampeggiare

;Spegnimento led

24

TurnOffLed1 bcf goto PORTB,LED1 MainLoop ;Spegne LED 1 ;Continua a lampeggiare

;********************************************************************** ; Subroutine ;********************************************************************** ;Subroutine di ritardo software Delay clrf clrf DelayLoop decfsz goto decfsz goto return END Count,1 DelayLoop Count+1,1 DelayLoop Count Count+1

Anlisis del cdigo DBLINT.ASM El control de interrupcin verifica el evento generado por una interrupcin, por lo cual, se debe realizar una verificacin para determinar qu evento fue generado, esto se obtiene con las siguientes instrucciones:
btfsc goto btfsc goto INTCON,T0IF IntT0IF INTCON,RBIF IntRBIF

en donde los flags T0IF y RBIF sern controlados para ver si el evento que provoca la interrupcin proviene del registro TMR0 o del puerto RB4-RB7 respectivamente, y luego ser puesta en ejecucin la subrutina de control a partir del nivel intT0IF e intRBIF. Adems, antes de devolver el control al programa principal se debe encerar el flag T0IF y RBIF para asegurar que el prximo evento pueda generar interrupcin.

25