Vous êtes sur la page 1sur 6

LAS INTERRUPCIONES

en los PIC
Introduccin.
Hemos avanzado en nuestro empeo de aprender un poco mas a cerca de la programacin de los micros PIC y no podemos continuar sin atender unas de las ms importantes instrucciones ("herramientas") como son las interrupciones. Veremos que hay dos tipos de interrupcin en los micros PIC16X84 y vamos a descubrir como podemos usarlas en nuestro provecho.

Las Interrupciones.
Es una de las caractersticas de los microcontroladores, de las ms importantes que constituye la capacidad de sincronizar la ejecucin de programas con acontecimientos externos; es decir, cuando se produce una interrupcin, el micro automticamente deja lo que est haciendo, va a la direccin 04h de programa y ejecuta lo que encuentre a partir de all hasta encontrarse con la instruccin RETFIE que le har abandonar la interrupcin y volver al lugar donde se encontraba antes de producirse dicha interrupcin. Hemos de diferenciar entre dos tipos de interrupciones posibles en un PIC16X84: 1. - Mediante una accin interna. El desbordamiento de la Pila ( Stack) por una operacin indebida, por ejemplo: Al completarse la escritura de datos en una EEPROM. (EEI) Por desbordamiento del registro TMR0 al rebasar el valor 255 (FFh) a 0. (T0I) 2. - Mediante una accin externa, la ms til. Al producirse un cambio del nivel en uno de sus pines por una accin externa. Estando en el modo de reposo ( SLEEP), un cambio de nivel en el pin RB0/INT . (INT) Un cambio de nivel en uno de los pines RB4 a RB7 estando configurados como entrada. (RBI) Cuando ocurre un evento de los descritos anteriormente, se produce una peticin de interrupcin que origina el siguiente mecanismo Hardware: 1. Guarda el valor actual del PC (contador de programa) en la Pila. 2. Sea cual sea la fuente de la interrupcin, se pone a cero el bit7 GIE (Global Interrupt Enable) del registro INTCON, con lo cual inhibe cualquier otra peticin de interrupcin. 3. El registro PC se carga con el valor 0004h que, es la posicin del vector de interrupcin. 4. Aqu, empieza la ejecucin del programa de atencin a la interrupcin ISR (Rutina de Servicio de Interrupcin). El tiempo de procesamiento de la ISR debe ser lo ms breve posible, para que se ejecuten las otras interrupciones ya que, pueden habilitarse ms de una de ellas. Adems, cualquier tipo de interrupcin tambin puede sacar al micro del modo de reposo ( SLEEP). Como he apuntado, una interrupcin puede ser inhibida slo si existe otra interrupcin en curso. Esto se debe a que, una interrupcin est controlada por dos bits que indican la fuente de la interrupcin: Un bit acta como bandera (flag) de sealizacin, indicando si se ha producido o no una interrupcin (T0IF,

INTF, RBIF y EEIF) El otro bit, acta como bit de inhibicin o prohibicin de la interrupcin en s, debido a que existe otra interrupcin en ejecucin y todo esto se realiza de forma automtica por parte del micro. (T0IE, INTE, RBIE, EEIE y GIE). Es decir, el bit GIE es el responsable del permiso de interrupcin que se borra automticamente cuando se acepta una interrupcin evitando as que se produzca ninguna otra interrupcin mientras se atiende a la primera. Estos bits de control se encuentran en el registro INTCON (0Bh banco 0 y 8Bh del banco 1). Estos bits corresponden al registro INTCON que cambia de nivel 0 a 1 cuando se produce la interrupcin, excepto el ltimo bit (bandera) que se encuentra en el registro EECON1. Vase los detalles de los bits de INTCON.

REGISTRO INTCON
Bit7 Bit6 Bit5 Bit4 Bit3 GIE EEIE T0IE
1 = Todas las Interrupciones habilitadas 0 = Todas las Interrupciones inhbiles 1 = Habilitacin Activada 0 = Desactivada 1 = Habilitacin Activada 0 = Desactivada 1 = Habilitacin Activada 1 = Habilitacin Activada Bit Enabled Interrupt Global. Se pone a 0 automticamente al reconocer una interrupcin. Se pone a 1 automticamente con RETFIE EEPROM Write Complete Interrupt Enable. autoriza la interrupcin EEI por escritura completada en la EEPROM. TMR0 Interrupt Enable Bit. Habilita la interrupcin por desbordamiento del Timer 0. External INT Enable Bit. Habilita la interrupcin externa a travs del pin RB0/INT. RB Port Change Interrupt Enable.Habilita la interrupcin RBI por cambio de los bits RB7:RB4 del puerto B.

INTE 0 = Desactivada

RBIE 0 = Desactivada

Bit2

1 = TMR0 desbordado T0IF 0 = No desbordado

TMR0 Overflow Interrupt Flag bit. Flag de estado que indica que se ha producido una interrupcin por desbordamiento del TMR0.
- Borrar por software

Bit1

INTF

1 = Hubo interrupcin externa 0 = No hubo interrupcin externa

External Interrupt Flag Bit. Flag de estado de interrupcin externa INT que indica que sta se ha producido.
- Borrar por software

Bit0

1 = Uno o ms pines cambiaron de nivel RBIF 0 = Ningn pin ha cambiado de nivel.

RB Port Change Interrupt Flag. Flag de estado de la interrupcin RBI que indica que se ha producido interrupcin por cambio en lneas RB/:RB4.
- Borrar por software

Modificaciones en el registro OPTION:


la principal misin del registro OPTION es gobernar el funcionamiento del TMR0, pero este registro tiene un bit relacionado con las interrupciones externas: INTEDG (BIT 7) : Interrupt Edge Select bit. Selector del flanco de la interrupcin INT. o INTEDG = 0. Interrupcin por flanco descendente del pin RB0/ INT. o INTEDG = 1 .Interrupcin por flanco ascendente del pin RB0/ INT.

Instruccin RETFIE.
Se utiliza al final de la subrutina de atencin a la interrupcin. Es idntica a un return. 1. Devuelve el valor guardado en al pila al contador de programa, para ejecutar la instruccin siguiente a la llamada a la subrutina. 2. Pone a 1 automticamente el bit GIE para volver a habilitar futuras interrupciones. Toda subrutina de interrupcin debe terminar con un retfie.

Registros alterados por la interrupcin.


El nico registro que se salvaguarda en la pila al llamar a la subrutina de interrupcin es el Contador de Programa. Los dems registros, deben ser salvaguardados por medio de la propia subrutina, y restaurar sus valores antes del retorno de la misma con el retfie. los valores del registro de trabajo W y de estado STATUS, deben ser guardaos y restaurados en la subrutina de atencin a la interrupcin para no modificar el programa.

Las acciones que debe tener en cuenta el programador al crear sus programas, son las siguientes: 1. Cuando se produce una interrupcin el bit7 GIE se pone a 0. 2. El valor del PC se guarda en la Pila (Stack) con el valor 0004h, que es el vector de interrupciones. 3. La rutina de atencin a la interrupcin debe empezar con un salto a la posicin de memoria de programa, antes, debe guardar todos los registros que puedan ser modificados por la interrupcin y explorar las banderas para determinar la causa de la interrupcin. 4. Dependiendo de la causa, la rutina de interrupcin se bifurcar a la subrutina correspondiente. 5. Antes de volver al programa principal, se deben devolver los valores originales salvados de los registros anteriores a la interrupcin y adems limpiar (poner a 0) las banderas que indican la fuente de la misma. 6. Como ltima instruccin de la rutina de interrupcin usar RETFIE, que cargar el PC con el valor de Pila y el bit GIE se pondr automticamente a 1.

Para detectar interrupcin: TOIF (bandera (Flag) de interrupcin por desbordamiento de TMR0) Para habilitar interrupcin: TOIE (habilita la interrupcin por desbordamiento de TMR0)

Por tanto, el bit7 GIE, es el encargado de la activacin global que habilita las interrupciones al ponerse a 1 y al reconocer una interrupcin se pone a 0 de forma automtica, evitando se produzca otra interrupcin mientras se atienda la actual. El bit GIE se pone de nuevo a 1 al retornar de la atencin a la interrupcin al encontrar una instruccin RETFIE. Para el resto de los bits (banderas o flags) no est previsto ningn tratamiento de puesta a cero, por lo que es el propio programa de atencin a la interrupcin, el que le corresponde tratarla y las banderas (flags) que indican la interrupcin, debe ponerlas a 0 (cero).

Antes de seguir, hago hincapi en que, si bien cada bandera cambia o se pone a 1 al producirse una interrupcin, es tarea del propio programador, borrarla o ponerla a cero nuevamente , ya que si no lo hace, el micro siempre permanecer interrumpido o lo que es lo mismo, creer que la interrupcin se est produciendo continuamente. En resumen, el micro slo tiene un vector de interrupcin en la direccin 0x04h, as que, con cualquier interrupcin el PC se carga con 0004h y el programa de atencin a la interrupcin (que llamamos ISR) se encarga de comprobar el estado de las banderas para determinar que dispositivo caus la interrupcin y actuar segn lo previsto, la propia ISR se encargar de guardar los registros implicados al principio de la rutina para poder devolver sus estados originales al regresar de la rutina. Ver el siguiente ej.
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; Nombre: Demo de Interrupciones ^ ; Que hace => Encender un LED en RB1, lo haremos dormir y ^ ; despertarlo al accionar un pulsador en RB0/INT lo encender para ^ ; hacerlo dormir hasta la siguiente interrupcion que lo apagar. ^ ; --- Descripcion del circuito --^ ; El pin 7 (RB1) conectado al anodo del LED, el catodo a masa. ^ ; El pin 6 (RB0/INT) conectado a positivo a traves de R de 10K ^ ; El pin 6 (RB0/INT) conectado a contacto pulsador, el otro a masa.^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ LIST P=16F84 #include <P16F84a.INC> ACUM equ h'000C' ;se declara acum STAT equ h'000D' ;se declara stat #DEFINE BANCO0 BCF Org goto ORG GOTO ORG 0x00 STATUS,5

;Posicion 0 de la Memoria de Programa (apuntador) ;Viene cuando hay una interrupcion. inicio ;Va a la etiqueta INICIO 0x04 rsi 0X05 ;viene cuando hay una interrupcion ;salta a rutina de rsi que atiende la interrupcion

; ****Bits del registro OPTION ******************************* ; bit8 = 0 Resistencias de polarizacin deshabilitadas ; bit7 = 0 Interrupcin externa por flanco bajada (no usada) ; bit6 = 0 Fuente de reloj, interno (Usa TMR0 como temporizador) ; bit5 = 0 Flanco de seal externa (no lo usamos) ; bit4 = 0 Divisor asignado al TMR0 ; bit3 = 1 bit2 = 1 bit1 = 0 Divisin por 128 ; ******************************************************* ;---- Inicio -----ini BSF status,RP0 ; configurando puertos MOVLW 01 ; carga w con 0000 0001 MOVWF trisb ; RB0/INT es entrada BCF option_reg,6 ; seleccionamos flanco descendente BCF status,RP0 ;---- Activa interrupciones ---BSF intcon,GIE ; habilita todas las interrupciones BSF intcon,INTE ; que sean interrupciones externas CLRF portb ; limpia el puerto B dormir SLEEP GOTO dormir ; poner a dormir ;---- rutina servicio interrupciones

rsi

BTFSC GOTO

; verifica que se suelte el pulsador ; espera ; comenzamos guardando el contenido del W MOVWF ACUM ; Copia el acumulador al registro acum MOVF status,W ; Guarda STATUS en el acumulador BANCO0 ; para restaurarlos antes de volver MOVWF STAT ; Copia el acumulador al registro STAT BTFSC GOTO BSF BCF GOTO RETFIE portb,1 off_led portb,1 intcon,INTF HECHO ; y ahora s, si el led est a 1 ; ir a off_led para apagarlo ; sino, encender el LED ; borrar bandera de interrupcin ; salta a restaurar valores ; antes de volver

portb,0 rsi

off_led BCF BCF HECHO MOVF MOVWF SWAPF SWAPF

portb,1 ; apaga el LED intcon,INTF ; borra bandera de interrupcin ; Restauramos los valores del W y status STAT,W ; Guarda el contenido de STAT en el W STATUS ; Restaura el STATUS ACUM,F ; Da la vuelta al registro ACUM ACUM,W ; Vuelve a dar la vuelta al registro ACUM ; y lo restaura ; retorna al programa principal

RETFIE END

Como referencia, debemos guardar el contenido del registro W y del registro STATUS, para lo cual "no se debe usar la instruccin MOVF" porque corrompe la bandera Z, modificando el registro STATUS. En las hojas del fabricante recomienda el cdigo del siguiente ej. a la hora de tratar una rutina de servicio de interrupciones y puede tomarse, de forma general, procurando adaptarlo a la exigencia del usuario.
; ======== Inicio - Rutina de Servicio de Interrupcin ========= ; ========== Guardando W y el Registro de Estado ========== MOVWF R_W ; Guardamos W en R_W (R_W=0x0A) SWAPF STATUS,W ; invertimos los nibbles del registro STATUS (STATUS=0xAF) y ; lo pasamos a W, (W=0xFA). Si ponemos f en SWAPF STATUS,f ; se guardara en el mismo registro STATUS MOVWF R_STAT ; Guardamos el contenido de STATUS en (R_STAT=0xFA) . . . . ; Aqui atendemos la rutina ISR . . ; Deberia configurarse banco como se requiera ; ======== Fin - Rutina de Servicio de Interrupcin =========== ; ======== Restaurando W y el Registro de Estado =========== SWAPF R_STAT,W ; invertimos los nibbles del registro R_STAT ; y lo pasamos a W (R_STAT=0xFA), (W=0xAF) MOVWF STATUS ; Restauramos STATUS (STATUS=0xAF) ; estado original del banco SWAPF R_ACUM,F ; invertimos los nibbles de R_ACUM (R_ACUM=0xA0) que SWAPF R_ACUM,W ; invirtindolo nuevamente lo pasamos a W, ahora W=0x0A ; RETFIE

En este ejemplo; R_W y R_STAT son registros auxiliares en los que se guardan los valores del registro W y del registro Status. Lo que se ha hecho:

Se guarda el registro W en R_W Se guarda el registro STATUS en R_STAT Se ejecuta la rutina de servicio de interrupciones. Y antes de salir de la ISR Se restablece el registro STATUS (y el bit seleccionado del banco) Se restablece el registro W

Espero que se haya aprovechado la descripcin del tema de las interrupciones y los registros que de algn modo se relacionan con las mismas, para avanzar en los conocimientos de la programacin. En prximos artculos veremos como aplicar estos conocimientos.

Vous aimerez peut-être aussi