usar varias interrupciones. Arduino Mega

Buenas!!

Utilizo Arduino Mega 2560.

No sé por qué (obvio… sino no escribiría estas lineas… jeje), cuando utilizo una sola interrupcion (INT4 en el pin2), el programa me funciona a la perfeccion, el problema me viene cuando defino la segunda interrupcion (INT5 en pin3). El Monitor Serial deja de funcionar =(

Envío un comando desde Arduino y el chip me contesta. Tengo que calcular el tiempo que hay entre dos interrupciones. Guardo ese tiempo en un array y al pulsar un boton, me muestra el resultado.

Como decía, individualmente me funciona bien, pero cuando meto una segunda interrupcion, para leer dos chips distintos, el programa carga bien pero el monitor serie no funciona… Aunque aqui no lo escriba, “z, zz”, y el resto de variables que pueda haber están declaradas en el código.

unsigned long tiempoInt4 [200]; // para guardar el tiempo de todas las interrupciones de la respuesta en pin2
unsigned long tiempoInt5 [200]; // para guardar el tiempo de todas las interrupciones de la respuesta en pin3

void setup(){
EICRB = 0×01; //INT4, trigger en cualquier flanco
EIMSK = 0×10; //Activar INT4. Sin añadir el siguiente, todo va bien
EIMSK |=(1<<INT5); // Esta es la que he añadido a posteriori , Activar INT5 (o eso creo...): Aunque al añadirlo; me hunde
pinMode (2, INPUT);
pinMode (3, INPUT);

Serial.begin(115200);
Serial.println ("puerto serie OK");
beep();//pita un buzzer para saber que el programa está preparado
}
void loop(){
// aquí va el programa que pulsando un boton envio un comando y seguido, empiezo a recibir la respuesta
// y con el otro boton me muestra lo que hay guardado en los arrays. 
//No lo pongo porque es mas largo que un dia sin pan.
}

ISR(INT4_vect) {
tiempoInt4[z]=micros();
z++;
}

ISR(INT5_vect) {
tiempoInt5[zz]=micros();
zz++;
}

Lo que decia… si no incluyo nada de la INT5, me funciona perfecto, pero incluyendo ésta, ya no puedo monitorizar nada por serie. El buzzer pita, con lo que entiendo que el programa carga bien.

Lo que pienso es que al activar INT5 (concretamente la 5), ésta no permite que haya comunicación por serie… no seee!! son conjeturas, que no he podido afirmar ni negar buscando en la red, ya que no he encontrado respuesta alguna…

Muchas gracias por adelantado!!

Hola. ¿Has probado activando sólo la int5? Al menos puedes dirimir si el problema viene concretamente por la int5 o porque al estar activas ambas interrupciones se ocupa demasiado tiempo y el buffer serial se sobrepasa. Saludos.

Hola Noter! Gracias por la contestación!!

Efectivamente, poniendo solo el INT5 no funcionaba! He probado con todas las interrupciones una a una y hay algunas que no funcionan (supongo que afectaran a la comunicacion serie), pero ya he encontrado otras dos que van bien a la vez que con INT4.

Así que tiraremos por ahí, a ver que conseguimos! :wink:

Gracias de nuevo!

Saludos!

Retomando este tema…

Mis intentos han sido en vano… sigo sin conseguir sacarlo… yo supongo que no configuro bien las interrupciones, además, según leo en blogs, foros y otras páginas, las interrupciones en Arduino Mega son algo diferentes en cuanto a numero de Pin, de lo que pone en arduino.cc (donde dice que INT4 está en el pin 19, pero lo activo desde pin digital 2).

En el datasheet que se descarga desde Atmel (http://www.atmel.com/Images/Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf), desde la página 110, encuentro lo siguiente:

eimsk: para activar la interrupcion que se desea (en mi caso INT4 e INT5)

EIMSK=0x30;

ISCn/EICRB: para decidir en que momento se activa la interrupcion (cualquier flanco en mi caso…tengo que activarISC50 e ISC40)

EICRB=0x05;

lo que comentaba antes de los numero de pin, por ejemplo, la INT4, está en el pin digital 2 del arduino mega (de momento es la única que he hecho funcionar:
INT4 funcionando:

EICRB=0x01;
EIMSK=0x10;

Pero necesito una mas, y no estoy siendo capaz de activarla… la verdad es que me da igual cual, yo comento la INT5 pero cualquier otra tambien me vale…

Pues eso… se me escapa algo y no se lo que es… a ver si alguien puede echarme una mano!!

Gracias!

eicrb.jpg

Interrupciones, buzzer... no sé si lo que te voy a decir te solucionará el asunto o no, pero mira a intentar lo que estás haciendo sin el buzzer, ¿utilizas alguna libreria para activarlo? imagino que sí, y precisamente, los temporizadores (y por ende las interrupciones) están afectadas por buzzers, tones y cosas del estilo, revísate bien la documentación asociada; ejecuta el código sin librerías, ni buzzers ni nada parecido, lanza un delay lo suficientemente largo en el setup para que te de tiempo a activar el monitor serial antes de que se caiga, y al menos el arranque podrás visualizarlo antes de que se te caiga todo.

A mí me volvió loco al utilizar servos e intentar lanzar señal PWM por algunos pines, al final vi que la librería de servos afecta a esos pines y por tanto no se pueden utilizar ambas cosas a la vez.

Ya estáááááá!!!

El buzzer lo quité hace tiempo… y la verdad es que al final no he tenido ningún problema…

empecé el programa desde 0 y con simples attachInterrupt() lo he conseguido!! La verdad es que no entiendo qué problema tenía anteriormente, pero el programa está lleno de arrays (que sobrepasarían seguramente) y demás que hacía que se cayera todo. Ahora funciona a la perfección… no hay nada como empezar de nuevo cuando estás atascado y no sabes dónde…

pero por fin! gracias Johnny y Noter!