Escolar Documentos
Profissional Documentos
Cultura Documentos
en los PIC
Hoy es: Viernes, 22 de Enero del 2010__________________ Incluir en favoritos si
quiere volver a visitarnos.
Introducción.
Hemos avanzado en nuestro empeño de aprender un poco mas a cerca de la programación
de los micros PIC y no podemos continuar sin atender unas de las más importantes
instrucciones ("herramientas") como son las interrupciones. Veremos que hay dos tipos de
interrupción en los micros PIC16X84 y vamos a descubrir como podemos usarlas en
nuestro provecho.
Las Interrupciones.
REGISTRO INTCON
1 = Todas las
Interrupciones
habilitadas
Bit7 GIE 0 = Todas las
Bit Enabled Interrupt Global
Interrupciones
inhábiles
1 = Habilitación
Bit Interrupciones de
Bit6 EEIE Activada
Periféricos
0 = Desactivada
1 = Habilitación
Bit5 T0IE Activada Bit Interrupción del TMR0
0 = Desactivada
1 = Habilitación
Bit4 INTE Activada Bit Interrupción externa
0 = Desactivada
1 = Habilitación
Interrupción por cambio
Bit3 RBIE Activada
Puerto B
0 = Desactivada
1 = TMR0
Bandera del TMR0
Bit2 T0IF desbordado
0 = No desbordado - Borrar por software
1 = Hubo
interrupción
externa Bandera RB0/INT
Bit1 INTF 0 = No hubo - Borrar por software
interrupción
externa
1 = Uno o más
pines cambiaron de Bandera en RB4 :
Bit0 RBIF nivel RB7
0 = Ningún pin ha - Borrar por software
cambiado de nivel.
Las acciones que debe tener en cuenta el programador al crear sus programas, son las
siguientes:
1. Cuando se produce una interrupción el bit7 GIE se pone a 0.
2. El valor del PC se guarda en la Pila (Stack) con el valor 0004h, que
es el vector de interrupciones.
3. La rutina de atención a la interrupción debe empezar con un salto a la
posición de memoria de programa, antes, debe guardar todos los registros
que puedan ser modificados por la interrupción y explorar las banderas para
determinar la causa de la interrupción.
4. Dependiendo de la causa, la rutina de interrupción se bifurcará a la
subrutina correspondiente.
5. Antes de volver al programa principal, se deben devolver los valores
originales salvados de los registros anteriores a la interrupción y además
limpiar (poner a 0) las banderas que indican la fuente de la misma.
6. Como última instrucción de la rutina de interrupción usar RETFIE,
que cargar el PC con el valor de Pila y el bit GIE se pondrá
automáticamente a 1.
Para detectar interrupción: TOIF (bandera (Flag) de interrupción por
desbordamiento de TMR0)
Para habilitar interrupción: TOIE (habilita la interrupción por desbordamiento de
TMR0)
Por tanto, el bit7 GIE, es el encargado de la activación global que habilita las
interrupciones al ponerse a 1 y al reconocer una interrupción se pone a 0 de forma
automática, evitando se produzca otra interrupción mientras se atienda la actual. El bit GIE
se pone de nuevo a 1 al retornar de la atención a la interrupción al encontrar una instrucción
RETFIE. Para el resto de los bits (banderas o flags) no está previsto ningún tratamiento de
puesta a cero, por lo que es el propio programa de atención a la interrupción, el que le
corresponde tratarla y las banderas (flags) que indican la interrupción, debe ponerlas a 0
(cero).
Antes de seguir, hago hincapié en que, si bien cada bandera cambia o se pone a 1 al
producirse una interrupción, es tarea del propio programador, borrarla o ponerla a cero
nuevamente, ya que si no lo hace, el micro siempre permanecerá interrumpido o lo que es
lo mismo, creerá que la interrupción se está produciendo continuamente.
En resumen, el micro sólo tiene un vector de interrupción en la dirección 0x04h, así que,
con cualquier interrupción el PC se carga con 0004h y el programa de atención a la
interrupción (que llamamos ISR) se encarga de comprobar el estado de las banderas para
determinar que dispositivo causó la interrupción y actuar según lo previsto, la propia ISR
se encargará de guardar los registros implicados al principio de la rutina para poder
devolver sus estados originales al regresar de la rutina. Ver el siguiente ej.
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; Nombre: Demo de Interrupciones ^
; Que hace => Encender un LED en RB1, lo haremos dormir y ^
; despertarlo al accionar un pulsador en RB0/INT lo encenderá para ^
; hacerlo dormir hasta la siguiente interrupcion que lo apagará. ^
; --- Descripcion del circuito --- ^
; El pin 7 (RB1) conectado al anodo del LED, el catodo a masa. ^
; El pin 6 (RB0/INT) conectado a positivo a traves de R de 10K ^
; El pin 6 (RB0/INT) conectado a contacto pulsador, el otro a masa.^
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LIST P=16F84
#include <P16F84a.INC>
ACUM equ h'000C' ;se declara acum
STAT equ h'000D' ;se declara stat
Como referencia, debemos guardar el contenido del registro W y del registro STATUS,
para lo cual "no se debe usar la instrucción MOVF" porque corrompe la bandera Z,
modificando el registro STATUS. En las hojas del fabricante recomienda el código del
siguiente ej. a la hora de tratar una rutina de servicio de interrupciones y puede tomarse, de
forma general, procurando adaptarlo a la exigencia del usuario.
En este ejemplo; R_W y R_STAT son registros auxiliares en los que se guardan los valores
del registro W y del registro Status. Lo que se ha hecho:
Se guarda el registro W en R_W
Se guarda el registro STATUS en R_STAT
Se ejecuta la rutina de servicio de interrupciones. Y antes de salir de la ISR
Se restablece el registro STATUS (y el bit seleccionado del banco)
Se restablece el registro W
Espero que se haya aprovechado la descripción del tema de las interrupciones y los
registros que de algún modo se relacionan con las mismas, para avanzar en los
conocimientos de la programación. En próximos artículos veremos como aplicar estos
conocimientos.