PE03257A.gif (4096 bytes)

Microcontroladores
Principal ] Arriba ]

 

Principal

LAS INTERRUPCIONES

    Las interrupciones constituyen quizá el mecanismo más importante para la conexión del microcontrolador con el mundo exterior, sincronizando la ejecución de programas con acontecimientos externos.

    El funcionamiento de las interrupciones es similar al de las subrutinas de las cuales se diferencian principalmente en los procedimientos que las ponen en marcha. Así como las subrutinas se ejecutan cada vez que en el programa aparece una instrucción CALL, las interrupciones se ponen en marcha al aparecer en cualquier instante un evento externo al programa, es decir por un mecanismo hardware.

El PIC16C84/PIC16F84 dispone de 4 posibles fuentes de interrupción:

  1. Activación del pin RB0/INT
  2. Desbordamiento del temporizador TMR0
  3. Cambio de estado en uno de los 4 pines de más peso (RB7:RB4) del PORTB
  4. Finalización de la escritura en la EEPROM de datos.

Cuando se produce cualquiera de los sucesos indicados anteriormente, se origina una petición de interrupción, que si se acepta, guarda el valor del PC actual en la Pila, pone a cero el bit GIE (Global Interrupt Enable), lo que prohibe cualquier otra interrupción y se carga el PC con el valor 0004H , que es la posición del vector de interrupción, y comienza a ejecutarse el programa de atención a la interrupción que se encuentra a partir de esta dirección.

Cada causa de interrupción está controlada mediante dos bit. Uno de ellos actúa como señalizador o flag que indica si se ha producido o no la interrupción, y la otra funciona como bit de permiso o prohibición de la interrupción en sí, tal y como se muestra en la siguiente  figura.

 

 

 

    Los bits de control que se encuentran en el registro INTCON (0Bh ó 8Bh) habilitan y configuran las interrupciones. Para que se pueda producir interrupción por alguna de estas fuentes, el bit correspondiente debe estar a 1, mientras que los bits señalizadores o flags que están en los registros INTCON y EEDATA (08h) informan si se ha producido la interrupción cuando se ponen a 1. Cualquiera de las interrupciones también puede sacar al procesador del modo de reposo.

    El bit GIE (Global Interrupt Enable) es el de activación global del permiso de interrupción, y se borra automáticamente cuando se reconoce una interrupción para evitar que se produzca ninguna otra mientras se está atendiendo a la primera. Al retornar de la interrupción con una instrucción RETFIE, el bit GIE se vuelve a activar poniéndose a 1. Para el resto de los bit de indicación de interrupción (es decir, el resto de los flags) no se ha previsto mecanismo de puesta a cero, por lo que es el programa de atención a la interrupción el que debe realizar el tratamiento de la correspondiente interrupción y además, el que debe poner el o los flags de indicación de interrupción a 0. De no ser así, no se podrá salir de la rutina de atención a la interrupción.

    El microcontrolador solo dispone de un vector de interrupción en la dirección 0004h; esto quiere decir que, sea cual sea la fuente de la interrupción, el PC se carga con 0004h. Por lo tanto, el programa de atención a la interrupción debe encargarse de comprobar el estado de cada uno de los flags para saber cual es el dispositivo que produce la interrupción y actuar según el caso.

    Como ya hemos dicho el único registro que se salva en la PILA es PC, luego si se necesita preservar algún otro registro debe ser el propio programa de atención a la interrupción el que se encargue de salvar su estado al inicio de la rutina y de devolverlos al final del mismo, de igual modo que se hacía en las subrutinas.

Resumiendo, las acciones que se realizan automáticamente el microcontrolador y las que el programador debe tener en cuenta en sus programas son las siguientes:

  1. Cuando se activa una posible causa de interrupción, el flag correspondiente se activa. Si el bit de permiso correspondiente está a 1 y el bit de habilitación de todas las interrupciones (GIE) está a 1, se produce la interrupción.
  2. Para evitar que se produzca otra interrupción mientras se está atendiendo a otra anterior, el bit GIE se pone a 0.
  3. El valor del PC se guarda en la PILA
  4. El PC se carga con el valor 0004h, que es el vector de interrupciones
  5. El programador, debe comenzar la rutina de atención a la interrupción con un salto a la posición de memoria donde se encuentra el programa, seguidamente se guardan todos los registros que puedan ser modificados por esta, seguidamente si están habilitadas varias vías de interrupción, se debe explorar el valor de los flag para determinar la causa de la interrupción.
  6. Dependiendo de la causa de la interrupción, la rutina de interrupción se bifurca a la subrutina correspondiente.
  7. Se deben devolver los valores que tenían los registros antes de producirse la interrupción y se deben borrar por software los flags que indican las fuentes de las interrupciones, antes del retorno al programa principal.
  8. Cuando se llega a la última instrucción de la rutina de interrupción, RETURN, se carga el PC con el valor que se guardó inicialmente en la PILA y el bit GIE se pone automáticamente a 1.

INTERRUPCIÓN EXTERNA INT

    La fuente de interrupciones INT es sumamente importante para atender eventos externos en tiempo real. Cuando en la línea RB0/INT se hace una petición de interrupción, entonces, de forma automática, el bit INTF del registro INTCON se pone a 1 y si el bit GIE=1, se pone en marcha el mecanismo que ya hemos comentado de la interrupción. Mediante el bit INTDEG del registro OPTION, se puede seleccionar el flanco activo de RBO/INT, ya que con este puesto 1 el flanco activo es el de subida y cuando está a 0 el flanco activo es el de bajada.

    El programa de atención a la interrupción antes de regresar al programa principal debe borrar el flag INTF, puesto que en caso contrario al ejecutar la instrucción de retorno de interrupción RETFIE se volverá a desarrollar el mismo proceso de interrupción.

INTERRUPCION POR DESBORDAMIENTO DEL TMR0

    Para activar la interrupción del TMR0, los bit T0IE y GIE del registro INTCON deben de estar a 1; bajo estas condiciones cuando el temporizador TMR0 se desborda al pasar de FFh a 00h, se activa el flag TOIF del registro INTCON.

    Si no se carga de nuevo TMR0 cuando se desborda, éste sigue contando desde 00h hasta FFh. Este registro puede escribirse o leerse en cualquier momento, pero hay que tener en cuenta que al escribir sobre él, se pierden dos ciclos de reloj para la sincronización.

    Cuando se carga el registro TMR0 con un valor XXh, éste cuenta FFh-XXh impulsos y el tiempo que tarda en hacerlo viene dado por la expresión:

Temporización = 4 . Tosc . (256 –N10). Rango del Divisor de Frecuencia

INTERRUPCION POR CAMBIO DE ESTADO EN LOS PINES RB7:RB4 INTERRUPCION POR CAMBIO DE ESTADO EN LOS PINES RB7:RB4.

    Para activar la interrupción por cambio de nivel en los pines <RB7:RB4>, los bits RBIE y GIE del registro INTCON deben de estar a 1, bajo estas condiciones cuando se produce un cambio de nivel en cualquiera de los pines RB7:RB0 se activa el flag RBIF del registro INTCON.

Este tipo de interrupciones, están especialmente pensadas para el control de un teclado matricial de 4 x 4, es decir de 16 teclas.

INTERRUPCIÓN POR FINALIZACIÓN DE ESCRITURA EN LA EEPROM DE DATOS INTERRUPCIÓN POR FINALIZACIÓN DE ESCRITURA EN LA EEPROM DE DATOS.

   El área de EEPROM dispone de 64 bytes donde opcionalmente, se pueden almacenar datos que no se pierden al desconectar la alimentación. El PIC 16C84 y el 16F84 soportan un millón de ciclos de escritura/borrado y son capaz de guardar la información sin alteración durante más de 40 años.

La memoria EEPROM no está mapeada en la zona de memoria de datos donde se encuentran los registros SFR y GPR. Para poder leerla y escribirla durante el funcionamiento normal del microcontrolador hay que utilizar los registros especiales EEDATA, EEADR, EECON1 y EECON2.

El Registro EEADR, se encuentra en la posición de memoria 09h del banco 0, en el se carga directamente la dirección a la que acceder de la EEPROM de datos. Las 64 posiciones de un byte ocupan las direcciones de un mapa que comienza en la posición 00h y termina en la 3Fh, por eso los 2 bits de más peso del registro EEADR siempre valen 0.

    Los bit RD y WR indican respectivamente lectura o escritura. No hay que ponerlos a 0 solo a 1. Se borran automáticamente cuando la operación de lectura ha sido completada.

    El registro EECON2 no está implementado físicamente, por lo que es imposible leerlo (si se intenta leer, todos sus bits se ponen a 0). Se emplea como dispositivo de seguridad durante el proceso de escritura de la EEPROM, para evitar las interferencias en el largo intervalo de tiempo que precisa su desarrollo. La seguridad se consigue escribiendo los valores concretos 55h y AAh. Un ciclo de escritura en una posición EEPROM de datos tiene una duración de 10 ms, que es un tiempo muy grande para la velocidad del procesador.

  • Proceso de lectura de una posición de memoria de la EEPROM: Comprende los siguientes pasos:
  1. Escritura de la dirección que hay que leer en el registro EEADR.
  2. Poner a 1 el bit RD del registro EECON1.
  3. Lectura del dato diseccionado de esta forma en el registro EEDATA.
  4. El dato está disponible en EEDATA después de colocar RD a 1, por lo que es posible leerlo. El dato leído estará disponible el registro EEDATA en el siguiente ciclo y permanecerá en él hasta que se realice una nueva lectura o escritura en la EEPROM.

Seguidamente se muestra un programa capaz de leer la posición de memoria MEM1, de la EEPROM de datos.

LECTURA       bcf STATUS,RP0         ; Selecciona banco 0

                        movlw MEM1            ; Dirección a leer de la EEPROM

                        movwf EEADER

                        bsf STATUS,RP0    ; Selecciona banco 1

                        bsf EECON1,RD    ;Activar Lectura

ESPERA       btfsc EECON1,RD       ;Espera final de lectura

                        goto ESPERA

                        bcf STATUS,RP0    ;Selecciona banco 0

                        movf EEDATA,W    ;W se carga con el valor leído en EEPROM

  • Proceso de escritura de una posición de memoria de la EEPROM: Comprende los siguientes pasos:
  1. Se carga en EEADR la dirección de la posición a escribir
  2. Se carga en el registro EEDATA el valor a grabar
  3. Se ejecuta la siguiente secuencia para iniciar la escritura de cada byte
  4. movlw 55h

    movwf EECON2 ;Escribe 55h

    movwf AAh

    movwf eecon2 ;Escribe AAh

    bsf eecon1,wr ;coloca a 1 el bit

  5. Esta última instrucción inicia el proceso de escritura propiamente dicho. Cuando se termina el bit EEIF está a 1 y, si ha sido activada la interrupción EEPROM haciendo uso del bit EEIE de INCONT, esta interrupción se genera. Al acabar el proceso se pone a 0 el bit WR automáticamente.
  6. Mediante programa hay que poner a 0 el bit EEIF.

Un sistema para comprobar si se ha producido la escritura correctamente en la memoria EEPROM consiste en restar el dato escrito con el que existe en el registro EEDATA. Si no se ha producido error el flag Z pasa a valer 1.

Seguidamente se muestra un programa que escribe en la posición de memoria MEN1, de la EEPROM el dato DATO1.

ESCRITURA:

bcf STATUS,RP0     ;Selecciona el banco 0

movlw MEN1

movwf EEADR       ;Escribe la dirección en EEADR

movlw DATO1

movwf EEDATA     ;Se escribe el dato en EEDATA

bsf STATUS,RP0    ;Selecciona el banco 1

bsf EECON1,WREN ;Permiso de escritura

;Comienzo Secuencia de escritura

movlw 0x55

movwf EECON2     ;Se escribe el dato 55h en eecon2

movlw 0xaa ;

movwf EECON2         ;Se escribe AA h en eecon2

bsf EECON1,WR        ;Comienza la escritura

ESPERA:

btfsc EECON1,WR     ;Espera a que termine la escritura

goto ESPERA

bcf STATUS,R0         ;Selecciona el banco 0

    Microchip recomienda que se deshabiliten las interrupciones durante la secuencia de, añadiendo las siguientes instrucciones al principio y final de la secuencia.

    BCF INTCON,GIE ;Deshabilita interrupción

    BSF INTCON,GIE ;Habilita interrupción

    Proceso de verificación de la escritura. Dependiendo de la aplicación, es aconsejable que se compruebe que los datos se están escribiendo correctamente; aunque esto no suele ser necesario en la mayoría de las ocasiones, para las posiciones de memoria EEPROM es aconsejable.