domingo, 13 de mayo de 2012

Interrupciones en microcontroladores.

Es una de las caracterasticas de los microcontroladores, de las mas importantes que constituye la capacidad de sincronizar la ejecucion de programas con acontecimientos externos; es decir, cuando se produce una interrupcion, el micro automaticamente deja lo que esto haciendo, va a la direccion 04h de programa y ejecuta lo que encuentre a partir de alli hasta encontrarse con la instruccion RETFIE que le hara abandonar la interrupcion y volver al lugar donde se encontraba antes de producirse dicha interrupcion. Hemos de diferenciar entre dos tipos de interrupciones posibles en un PIC:


1. - Mediante una accion interna. El desbordamiento de la Pila (Stack) por una operacion indebida, por ejemplo:
  • Al completarse la escritura de datos en una EEPROM.
  • Por desbordamiento del registro TMR0 al rebasar el valor 255 (FFh) a 0.

2. - Mediante una accion externa, la mas util. Al producirse un cambio del nivel en uno de sus pines por una accion externa.
  • Estando en el modo de reposo (SLEEP), un cambio de nivel en el pin RB0/INT .
  • Un cambio de nivel en uno de los pines RB4 a RB7 estando configurados como entrada.

Una interrupción es un evento que hace que el microcontrolador deje de ejecutar la tarea que 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:

o Interrupción externa RB0/INT
o Interrupción por cambio lógico en el puerto B (pines RB7 a RB4)
o Interrupción por desborde del timer 0 (TMR0)
o Interrupción por desborde del timer 1 (TMR1)
o Interrupción por comparación exitosa exitosa en TMR2
o Interrupción del comparador
o Interrupción del transmisor del USART
o Interrupción del receptor del USART
o Interrupción del módulo CCP
o Interrupción del EEPROM

Cuando ocurre un evento de los descritos anteriormente, se produce una peticion de interrupcion, guardando el valor actual del PC (contador de programa) en la Pila, sea cual sea la fuente de la interrupcion, se pone a cero el bit7 GIE (Global Interrupt Enable), con lo cual inhibe cualquier otra peticion de interrupcion, el registro PC se carga con el valor 0004h que, es la posicion del vector de interrupcion. Aqui, empieza la ejecucion del programa de atencion a la interrupcion ISR (Rutina deServicio de Interrupcion). El tiempo de procesamiento de la ISR debe ser lo mas breve posible, para que se ejecuten las otras interrupciones ya que, pueden habilitarse mas de una de ellas. Ademas, cualquier tipo de interrupcion tambien puede sacar al micro del modo de reposo (SLEEP).

Una interrupcion puede ser inhibida solo si existe otra interrupcion en curso. Esto se debe a que, una interrupcion esta controlada por dos bits que indican la fuente de la interrupcion, un bit actua como bandera (flag) indicando si se ha producido una interrupcion y el otro bit, actua como bit de inhibicion o prohibicion de la interrupcion en su, debido a que existe otra interrupcion en ejecucion y todo esto se realiza de forma automatica por parte del micro.

Es decir, el bit GIE es el responsable del permiso de interrupcion que se borra automaticamente cuando se acepta una interrupcion evitando asi que se produzca ninguna otra interrupcion mientras se atiende a la primera. Estos bits de control se encuentran en el registro INTCON (0Bh y 8Bh). Estos bits corresponden al registro INTCON que cambia de nivel 0 a 1 cuando se produce la interrupcion, excepto el ultimo bit (bandera) que se encuentra en el registro EECON1.

Los registros asociados con las interrupciones son el registro de control de interrupcion INTCON, el registro habilitacion de interrupciones de perifericos PIE1 y el registro de interrupciones de perifericos PIR1. En el registro INTCON se encuentra el bit de habilitacion global de interrupcionesGIE, el bit de habilitacion de interrupcion por perifericos PEIE y los bits de habilitacion de algunas interrupciones como la interrupcion externa del pin RB0 (INTE), la interrupcion por cambio de estado en los pines RB4 a RB7 (RBIE) y la interrupcion por desborde del timer 0 (T0IE), asi como las banderas correspondientes a cada interrupcion (INTF, RBIF y T0IF). En el registro PIE1 se encuentran los bits de habilitacion de las demas interrupciones y en el registro PIR1 se encuentran las banderas asociadas con cada interrupcion.

Para habilitar las interrupciones se deben seguir los siguientes pasos:
  • Habilitar el bit correspondiente a cada interrupcion.
  • Limpiar la bandera correspondiente a la interrupcion habilitada para evitar falsas interrupciones.
  • En caso de ser necesario habilitar el bit PEIE del registro INTCON (necesario para todas las interrupciones con excepcion de INTE y RBIE).
  • Habilitar el bit de habilitacion global de interrupciones GIE del registro INTCON.
Aunque el pic cuenta con 10 fuentes distintas de interrupción solamente tiene un vector de interrupción por lo que si se habilitan varias interrupciones al momento de presentarse cualquiera de ellas el programa saltara a la misma rutina de interrupcion y es responsabilidad del programador crear una rutina que identifique la fuente de la interrupcion.

Aqui un ejemplo de interrupciones en C




 Ahora crearemos en el simulador de proteus nuestro ejemplo para combrobar que funcione.



Al terminar nuestro diagrama en el proteus le damos doble click al pic y le damos click en la carpeta para asi escoger el .HEX que nos creo el compilador que estemos usando en este caso el PCW compiler.

Despues le damos click en play en la parte de abajo de proteus donde se encuentra nuestra simulacion.


 Aqui vemos que si esta en funcionamiento nuestro pequeño codigo con interrupciones el led prende y apaga de manera intermitente

Bibliografias:

http://micropic.wordpress.com/2007/06/08/manejo-de-interrupciones/

http://www.hispavila.com/3ds/chipspic/interrupciones.html

2 comentarios: