Go Down

Topic: ¿Puede una interrupción interrumpir a otra? (Read 154 times) previous topic - next topic

En primer lugar un saludo a todos porque a pesar de llevar tiempo registrado si mal no recuerdo éste es mi primer post.

Yo creo que el título del tema ya lo dice todo, me gustaría que alguien me explicara como interactuan dos interrupciones que pueden darse a la vez. Os pongo un ejemplo para entenderlo: imaginémonos que tenemos en nuestra casa dos sistemas de seguridad, uno que detecta humo y otro que detecta intrusos, ambos programados con dos interrupciones dado que no es algo para revisar constantemente en un loop principal ya que se darán de ciento en viento.  Nuestro loop se pasaría el día controlándonos la calefacción, apagándonos luces olvidadas, encendiéndonos el horno media hora antes de llegar a casa y cosas de esas tan modernas. Bueno, el caso es que la tarea de las interrupciones es la contraria. Al dispararse la interrupción de humo un sistema nos abriría puertas y ventanas, y al dispararse la de intrusos nos las cerraría a cal y canto. Pongamos que al abrirlas o cerrarlas los motorcillos nos tardan unos diez segundos en realizar la acción.

Bien, ahora ya imaginemos una situación más que absurda pero que es donde yo tengo el dilema. Un día, se nos dispara la interrupción de incendio porque el sensor de humo ha registrado el aroma de un cigarro que nos hemos fumado donde no debíamos, entonces nuestra casa que es la mar de lista comienza automáticamente a abrirnos puertas y ventanas ya que es lo que nosotros hemos programado. La mala suerte hace que en menos de diez segundos a un gato le dé por saltar la tapia del jardín y activar el sensor de movimiento que debería de activar la interrupción de intrusos cuya finalidad es la contraria a la tarea que ya hemos empezado... cerrarnos puertas y ventanas. ¿Qué haría arduino en un caso como éste? ¿Pone la segunda interrupción en espera y una vez abiertas todas las ventanas pasaría a cerrarlas? ¿O comenzaría a cerrarlas antes de que se abrieran completamente entendiendo que la segunda interrupción ha interrumpido a la primera?

Necesito saberlo porque ahora estoy utilizando una Mega en un sistema de puente grúa, donde utilizo las seis interrupciones de las que dispone la tarjeta para lectura de encoders, finales de carrera..., y si no conozco bien como funcionan las interrupciones cuando una "pisa" a otra me puedo llevar un sustillo  XD XD XD

¡Muchas gracias de antemano!

max_saeta

Saludos
Respondiendo al título la respuesta es NO.
Existen arquitecturas de microcontroladores que poseen interrupciones bajas y altas pero en el arduino,  o por lo menos en la Uno y en la Mega, no es asi

Lo que puedes hacer es usar banderas indicadoras y en el loop atender las banderas. (flags)

Gracias por la respuesta! Pero entonces suponiendo que he programado dos interrupciones de la manera más básica posible con attachInterrupt sin flags ni nada y suponiendo que coincidan... ¿qué sucede con la interrupción que se produce mientras se ejecuta la otra? ¿se almacena para ejecutarse seguidamente o se pierde cómo si no hubiera ocurrido? Esa sería mi duda

max_saeta

Saludos
Las probabilidades de que las dos ocurran al mismo tiempo son caso infinitas.  El Arduino atenderá la primera en presentarse y mientras esta se ejecuta si ocurre otra es ignorada.  Por ese motivo la atención de una interrupcion debe ser breve.

exacto, venía a contestarme a mí mismo la pregunta por si a alguien le surge la misma duda en un futuro, pero viene a ser lo que comentaba max_saeta. Esta tarde he estado haciendo una prueba con unos leds en un arduino uno, y sin meternos en historias sobre interrupciones prioritarias y demás, viene a ser eso, si una interrupción se ejecuta ya no puede entrar otra hasta que esta no termine, y las que de casualidad se produjeran son ignoradas.
Por cierto, si dices que el hecho de que coincidan en el tiempo dos interrupciones es ínfimo es porque nunca has intentado programar en una mega y con 6 pines de interrupción la lectura de dos encoders tan precisos que pueden pasar por hasta 10.000 sectores en un segundo  :~ :~ :~ , jajajaja. Pero muchas gracias por las respuestas!!

TEMA CERRADO

Go Up