|
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:
- 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.
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.
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:
- 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.
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:
- Se carga en EEADR la dirección de la posición a escribir
- Se carga en el registro EEDATA el valor a grabar
- 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
- 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.
- 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.
|