HOME

PRODUCTOS

PROYECTOS

TUTORIALES

VIDEOS

FREEWARE

PROGRAMAS

FUNCIONES C

EMPRESA

ENGLISH

                   
 El manejo del sistema de interrupciones 16F84/F628/F88

 

INTERRUPT.jpg (24118 bytes)

INTRODUCCION:

El manejo de interrupciones es una técnica de programación, basada en un mecanismo automático en el hardware del microcontrolador, que permite dar atención a algún periférico interno o externo, únicamente en el momento en que ésta se requiera. Una interrupción es en realidad una llamada a una subrutina, pero iniciada por el harware del propio periférico y no por la instrucción "CALL". La interrupción puede ocurrir en cualquier instante.

Al generarse la señal de interrupción, el microcontrolador termina primero la ejecución de la instrucción que se esté procesando en ese momento, guarda en el STACK ó PILA la dirección de memoria de código de la siguiente instrucción y posteriormente hace un llamado a la "subrutina de atención de interrupciones", cuyo inicio siempre se encuentra en la dirección 04H de la memoria de código, en el caso de los microcontroladores 16F84/F628/F88.

                                                      

Descripción general:

Al final de la subrutina de atención de interrupciones, mediante la instrucción "RETFIE"(Return From Interrupt), el flujo del programa regresa al programa principal mediante el mismo mecanismo utilizado por las subrutinas "CALL" convencionales, es decir recuperando la dirección de retorno previamente almacenada en el STACK.

El manejo de interrupciones es una alternativa al método conocido como "polling", en el cual dentro del programa principal, se está revisando el status de cada uno de los periféricos, una y otra vez en un loop permanente, para conocer si alguno de ellos necesita de atención. Para entender este proceso, podemos poner un ejemplo en la vida práctica en donde un conferencista (el microcontrolador) además de dictar su conferencia (programa principal), pregunta uno a uno y en forma constante a los asistentes (periféricos) si tienen alguna pregunta (si requieren atención del microcontrolador). Evidentemente dicho método conduce a una pérdida de tiempo del conferencista ( tiempo de procesamiento del microcontrolador) que podría ser utilizado en forma más eficiente.

En cambio, si los asistentes realizan su pregunta levantando la mano únicamente cada vez que necesiten atención, solo en ese momento se genera una "interrupción" al programa principal (la conferencia). El conferencista tiene el tiempo suficiente de responder la pregunta (dar atención al periférico) para después continuar con su conferencia.

El manejo de interrupciones permite operar el manejo del "multitasking" o multitareas, es decir, una técnica de programación en la cual es posible dar atención a multitud de periféricos, reduciendo al mínimo el tiempo de procesamiento. Un caso muy ilustrativo es el de las computadoras PC, en donde el teclado, el mouse, el disco duro, el reloj de tiempo real, la impresora, el módem y en fin, todos los periféricos son controlados y atendidos a través del sistema operativo, por medio de un esquema de interrupciones.

Interrupciones en el PIC 16F84/F628/F88

El 16F84, tiene 4 fuentes de interrupción: un cambio en el nivel de cualquiera de los bits de entrada RB4...RB7; un cambio en el pin RB0/INT del microcontrolador; cuando el temporizador TMR0 cambia del valor FF al valor 00; cuando hay un fin en el ciclo de escritura de datos en la EEPROM.

El 16F628 cuenta las mismas fuentes de interrupción que el 16F84, más otras provenientes del USART, de los 3 temporizadores y de los módulos de CAPTURE/COMPARE. El 16F628 puede manejar hasta 10 fuentes de interrupción.

El 16F88 tiene un total de 12 fuentes de interrupción.

 

Programación de las interrupciones del TMR0 (temporizador 0) en el 16F84/F628/F88

El TMR0, es un registro de 8 bits que permite generar, mediante el uso de interrupciones, períodos exactos de tiempo. Así, es posible implementar bases de tiempo para relojes de tiempo real, temporizadores industriales, y otras aplicaciones.

Para que el microcontrolador ejecute la subrutina de interrupción, es necesario que desde el programa principal se habiliten primeramente el bit global de interrupciones conocido como GIE (Global Interrupt Enable) y la interrupción particular que queremos activar. Si queremos activar la interrupción del TMR0, entonces habilitamos el bit conocido como T0IE (Timer 0 Interrupt Enable).

    BSF        INTCON,GIE          ;HABILITAMOS LAS INTERRUPCIONES GLOBALES
    BSF        INTCON,T0IE        ;HABILITAMOS LA INTERRUPCIÓN DEL TMR0

También es necesario, en el programa principal, inicializar el clock interno del TMR0 y su escalador:

        movlw      B'00000111'          ;HABILITA TEMPORIZADOR Y CLOCK INTERNO                    
        movwf    OPTION_REG      ;PREESCALADOR DIVIDE ENTRE 256

Cuando el TMR0 pasa de un valor de FF a 00, se genera la interrupción. La bandera denominada T0IF (Timer 0 Interrupt Flag), se habilita. En la siguiente figura se muestran los registros y bits descritos anteriormente:

TMR0.jpg (93327 bytes)

Una vez dentro de la subrutina de interrupción, el programador debe inmediatamente guardar los registros W y STATUS, para evitar que se pierda su contenido al regresar de la subrutina. La instrucción SWAPF, que realiza un intercambio entre los bits más significativos y menos significativos de una localidad de memoria, se utiliza porque su ejecución no modifica el registro de STATUS. Se usa la localidad SALVAW para almacenar el registro W y SALVASTATUS para guardar el registro STATUS:


    MOVWF       SALVAW                ;GUARDAMOS W EN MEMORIA. NO SE AFECTA EL REGISTRO STATUS
    SWAPF        STATUS,w              ;GUARDAMOS EL REGISTRO DE STATUS EN W
    MOVWF      SALVASTATUS      ;GUARDAMOS EL REGISTRO DE STATUS EN MEMORIA

Posteriormente escribimos aquí la subrutina de atención a la interrupción, el cual realiza una determinada tarea.

Al final de la subrutina, antes de regresar al programa principal, debemos recuperar los valores de los registros W y STATUS y apagar de nuevo el bit TOIF (Timer 0 Interrupt Flag), el cual se activó al generarse la interrupción.

    SWAPF       SALVASTATUS,w         ;guardamos el registro STATUS en W
    MOVWF     STATUS                         ;recuperamos el valor de STATUS   
    SWAPF       SALVAW,F                    ;realizamos SWAP de registro SALVAW, no se afecta STATUS

    SWAPF       SALVAW,W                   ;recuperamos el valor de W, no se afecta el STATUS

    BCF             INTCON,T0IF                 ;APAGA LA BANDERA DE INTERRUPCION DEL TMR0
    RETFIE                                               ; REGRESA DE LA INTERRUPCIÓN

Ejemplo 1: finalmente, escribamos un programa muy simple para ejecutarlo en sistemas 16F847F628/F88. El programa está basado en la interrupción del temporizador 0, y enciende y apaga el bit RB7 cada segundo. En este ejemplo, no se están guardando los registros W y STATUS porque en el programa principal no se realiza ninguna otra tarea.

Ejemplo 2: en este ejemplo combinamos 2 tareas: en la tarea 1, el procesador enciende y apaga el led RB7 con un período de 1 segundo. Esta tarea está realizada por medio de la interrupción mostrada en el ejemplo 1. En la tarea 2, que estará a cargo del programa principal, el microcontrolador realizará una cuenta binaria en los bits RB0...RB3. El período de la cuenta en este caso es de 100 ms.

En los proyectos RELOJ DE TIEMPO REAL, DISPLAY DE MATRIZ DE PUNTOS DE 5 X 7, y TEMPORIZADOR PROGRAMABLE, se describen 3 proyectos que funcionan con las interrupciones del temporizador 0 para generar la base de tiempo.

Finalmente, en el tutorial sobre interrupciones desde ANSI C, se dan detalles del uso del temporizador 1 como fuente de interrupción, para el microcontrolador 16F88.