Tema 5 -Manejo de Interrupciones

Embed Size (px)

Citation preview

Manejo de interrupcionesEntorno de arduino

Interrupciones

Una interrupcin es un mecanismo por el cual un evento interno o externo puede interrumpir la ejecucin de un programa en cualquier momento.

Una interrupcin produce un salto automtico a la subrutina de atencin de interrupciones.

Las fuentes de interrupcin dependen del tipo de microcontrolador que se est programando.

El microcontrolador ATMega328P tiene 25 fuentes de interrupcin y existe un vector reservado para cada fuente. Las fuentes de interrupcin son:

El control de interrupciones se lleva a cabo a travs del registro STATUS y de otros registros asociados:

Por ejemplo, para activar las interrupciones externar por cambio en el pin INT0 los registros asociados son:

El manejo de las interrupciones en arduino se realiza a travs de la siguientes instrucciones:

Interrupciones interrupts() - habilita las interrupciones noInterrupts() - desactiva las interrupciones attachInterrupt() - programar interrupcin detachInterrupt() - desactivar interrupcin

interrupts()Descripcin Activa las interrupciones (despus de haberlas desactivado con noInterrupts()). Las interrupciones permiten que se ejecuten ciertas tareas en segundo plano que estn activadas por defecto. Algunas funciones no funcionarn correctamente mientras las interrupciones estn desactivadas y la comunicacin entrante puede ser ignorada. Las interrupciones pueden perturbar ligeramente la temporizacin en el cdigo y deben ser desactivadas slo para partes particularmente crticas del cdigo. Parmetros: Ninguno Devuelve: No devuelve nada

noInterrupts()Descripcin Desactiva las interrupciones (pueden reactivarse usando interrupts()). Las interrupciones permiten que las operaciones importantes se realicen de forma transparente y estn activadas por defecto. Algunas funciones no funcionarn y los datos que se reciban sern ignorados mientras que las interrupciones estn desactivadas. Las interrupciones pueden perturbar ligeramente el tiempo de temporizado, sin embargo puede que sea necesario desactivarlas para alguna parte crtica del cdigo. Parmetros: Ninguno Devuelve: Nada

attachInterrupt(interrupcion, funcion, modo)Descripcin Especifica la funcin a la que invocar cuando se produce una interrupcin externa. Reemplaza cualquier funcin previa que estuviera enlazada a la interrupcin. La mayora de las placas Arduino tienen dos interrupciones externas: Las nmero 0 (en el pin digital 2) y la 1 (en el pin digital 3). La Arduino Mega tiene otras cuatro: Las nmero 2 (pin 21), 3 (pin 20), 4 (pin 19) y 5 (pin 18). Parmetros interrupcion: el nmero de la interrupcin (int) funcion: la funcin a la que invocar cuando la interrupcin tiene lugar; esta funcin no debe tener parmetros ni devolver nada. Esta funcin es a veces referenciada como rutina de interrupcin de servicio Modo: define cuando la interrupcin debe ser disparada. Hay cuatro constantes predefinidas como valores vlidos: LOW para disparar la interrupcin en cualquier momento que el pin se encuentre a valor bajo(LOW). CHANGE para disparar la interrupcin en culquier momento que el pin cambie de valor. RISING para disparar la interrupcin cuando el pin pase de valos alto (HIGH) a bajo (LOW). FALLING para cuando el pin cambie de valor alto (HIGH) a bajo (LOW)

Nota Dentro de la funcin enlazada, la funcin delay() no funciona y el valor devuelto por la funcin millis() no se incrementar. Los datos serie recibidos en el transcurso de esta interrupcin pueden perderse. Deberas declarar como voltil cualquier variable que modifiques dentro de la funcin. Usando las interrupciones Las interrupciones son tiles para hacer que las cosas sucedan automticamente en programas para microcontroladores, y puedan ayudar a resolver problemas de temporizacin. Una buena tarea en la que utilizar interrupciones podra ser leer un encoder rotacional, monitorizando la entrada del usuario. Si quisieras asegurarte de que un programa siempre captura los pulsos de un encoder rotacional, sin perder nunca un pulso, sera muy complicado escribir un programa que haga otra cosa, puesto que el programa debera estar constantemente consultando las lneas del sensor del encoder, de forma que capture los pulsos cuando tienen lugar. Otros sensores tienen un interfaz dinmico similar, como intentar leer un sensor de sonido que intenta capturar un click, o un sensor de ranuras por infrarrojos (fotointerruptor) tratando de capturar el paso de una moneda. En todas estas situaciones, usar una interrupcin, libera al microcontrolador de realizar otras tareas sin echar en falta el "timbre".

detachInterrupt(interrupt) Descripcin: Apaga la interrupcin dada. Parmetros: interrupt: el nmero de interrupcin a invalidar (0 o 1).

Ejemplo int pin = 13; volatile int estado = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, parpadeo, CHANGE); } void loop() { digitalWrite(pin, estado); } void parpadeo() { estado = !estado; }

Conexin de los puertos en ARDUINO