Académique Documents
Professionnel Documents
Culture Documents
está realizando para atender dicho acontecimiento y luego regrese y continue la tarea que
estaba realizando antes de que se presentara la interrupción. El pic 16F628 (y el 16F628A)
tiene 10 fuentes de interrupción, si las interrupciones están habilitadas cada vez que una de
estos acontecimientos se presente el pic dejará de ejecutar el programa para ir a atender la
interrupción y al termino de la misma continuará ejecutando el programa donde lo había
dejado. Las fuentes de interrupción son:
La ventaja de utilizar interrupciones es que mientras se espera a que se presente el evento que
produce la interrupción el microcontrolador puede estar ejecutando cualquier otra tarea. De ese
modo el micro no esta ciclado en una sola tarea sino que puede seguir trabajando en otras
hasta que una interrupción haga que el programa salte y ejecute la tarea que se quiera y al
terminarla el programa continuara su ejecución en el punto en el que se encontraba en el
momento de presentarse la interrupción.
En el ejemplo pasado se vió como leer botones e interruptores, ahora se va a realizar el mismo
programa pero haciendo uso de interrupciones y para que se aprecie que el microcontrolador
puede realizar otra tarea mientras se espera la interrupción el programa hará que parpadee el
puerto A cada medio segundo. Por lo demas el programa sera igual, tendra 4 botones
conectados a los pines RB4 a RB7 y 4 leds conectados a la parte baja del puerto B. Se
habilitarán las interrupciones y de ese modo los botones se leerán solamente al ser
presionados. Veamos entonces el codigo:
Ese es el código del programa principal. Se comienza declarando el vector de reset y el vector
de interrupcion, después se configuran los puertos, el puerto A como salida, la parte baja del
puerto B como salida y la parte alta del puerto B como entrada. Hasta ahí lo único nuevo es la
declaración del vector de reset. Después se configuran las interrupciones: Primero se habilita el
bit RBIE del registro INTCON que es el correspondiente a la interrupción por cambio de estado
en los pines RB4 a RB7, después se pone a cero el bitRBIF del mismo registro para poner la
bandera de interrupción en cero y así evitar entrar a la rutina de servicio sin que exista una
interrupción, y por último se habilita el bit GIE para habilitar las interrupciones. De esta manera
la interrupción queda configurada y habilitada. Es muy importante siempre limpiar las banderas
de interrupción antes de habilitar el bitGIE.
Después de configurar las interrupciones se pasa al programa principal que lo único que hace
es poner a 1 todos los pines del puerto A, esperar medio segundo, poner a 0 todos los pines
del puerto A, volver a esperar medio segundo para iniciar de nuevo el ciclo y así el programa se
repite una y otra vez. La tarea de encender los leds correspondientes a cada botón queda en
manos de la rutina de interrupción:
La rutina es muy parecida a la del programa del ejemplo anterior con algunos cambios
pequeños. Lo importante en la rutina es que al entrar a la misma se deshabilitan las
interrupciones al poner a 0 el bit GIE, con esto evitamos que se produzca otra interrupción
mientras se está atendiendo una. Después de hacer eso el programa simplemente identifica la
tecla pulsada y enciende el led correspondiente. Ya que se encendió el led la rutina continua
hacia la etiqueta SALIDA_ISR donde primero se limpia la bandera de interrupción poniendo a 0
el bit RBIF y después se vuelve a habilitar la interrupcion poniendo a 1 el bit GIE, ambos del
registro INTCON. Para terminar la rutina y regresar al programa principal se utiliza la
instrucción retfie (RETurn From IntErruption). La rutina de servicio de interrupción siempre
debe terminar con esa instrucción.