Interrupción (también conocida como interrupción de hardware o petición de interrupción) es una señal recibida por el procesador, indicando que debe "interrumpir" el curso de ejecución actual y pasar a ejecutar código específico para tratar esta situación.
Una interrupción es una suspensión temporal de la ejecución de un programa, para pasar a ejecutar una subrutina de servicio de interrupción, la cual, por lo general, no forma parte del programa (generalmente perteneciente al sistema operativo, o al BIOS). Luego de finalizada dicha subrutina, se reanuda la ejecución del programa.
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:
- Activación del pin RB0/INT
- Desbordamiento del temporizador TMR0
- Cambio de estado en uno de los 4 pines de más peso (RB7:RB4) del PORTB
- 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.
Detalles de cada bit del registro INTCON:
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:
- 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.
- Para evitar que se produzca otra interrupción mientras se está atendiendo a otra anterior, el bit GIE se pone a 0.
- El valor del PC se guarda en la PILA
- El PC se carga con el valor 0004h, que es el vector de interrupciones
- 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.
- Dependiendo de la causa de la interrupción, la rutina de interrupción se bifurca a la subrutina correspondiente.
- 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.
- 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.
Interrupción 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
Interrupción 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.
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:
- Escritura de la dirección que hay que leer en el registro EEADR.
- Poner a 1 el bit RD del registro EECON1.
- Lectura del dato diseccionado de esta forma en el registro EEDATA.
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.
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.
8 para el lab de integrados :)
ResponderBorrar