Sei sulla pagina 1di 7

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

movlw 55h

movwf EECON2 ;Escribe 55h

movwf AAh

movwf eecon2 ;Escribe AAh

bsf eecon1,wr ;coloca a 1 el bit

4. 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.
5. 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.

Potrebbero piacerti anche