Interrupcion en arduino mega

Buenas amigos!
Soy nuevo en el foro y recien compre el arduino mega.
Pero ya empece a tener problemas :frowning: me encontraba realizando un programa con este, utilizando interrupciones pero el programa no me funciona y no se donde puede estar el problema.
Les coloco el codigo:

byte led1 = 2;
byte led2 = 3;

void setup()
{
Serial.begin(9600);
attachInterrupt(2,parpadeo,FALLING);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
}

void loop()
{
digitalWrite(led1,1);
delay(1000);
digitalWrite(led1,0);
delay(1000);
}

void parpadeo()
{
digitalWrite(led2,HIGH);
delay(600);
digitalWrite(led2,LOW);
delay(600);
digitalWrite(led2,HIGH);
delay(600);
digitalWrite(led2,LOW);
delay(600);
}

Se supone que un led1 debe estar parpadeando cada 1 segundo, luego cuando se pulse un switch debe saltar a la rutina de interrupcion y hacer parpadear otro led2, 2 veces y luego debe salirse de la interrupcion y hacer parpadear el led1 como estaba inicialmente cada 1 segundo.
Pero cuando entra a la rutina de interrupcion enciende el led2 y asi se queda el programa esperando no se que?

Alguna idea de lo que pueda estar pasando? :-?

Saludos

Raul,

Prueba cambiar de FALLING a CHANGE

saludos,

Que tal cristal!
Probe lo que me comentas y nada :cry: el programa se cuelga y el led se queda fijo encendido y no sale de la interrupcion :-X

Me parece que debe ser un problema del compilador :-X porque todo lo demas opera bien, solo cuando entra a la rutina de interrupcion alli es donde se prosenta el problema.

Saludos

Ok de nuevo por aqui!
He realizado otras pruebas al programa modificandolo y el problema efectivamente esta en la rutina de retardo ;D por lo tanto cuando realicen rutinas de interrupciones por hardware no incluyan el delay(), para que asi el programa les funcione bien :slight_smile:
O sino pueden utilizar delayMicroseconds() y ese si funciona bien!

Saludos

Hola buenos dias estimados colegas, hoy estuve haciendo una aplicacion parecida a esta que comentan en este post y efectivamente en la interrupcion no responde como deberia cuando se usa el retardo delay(), pero al tomar las recomendaciones todo funciono de manera perfecta ahora mi comentario ademas de felicitar al colega por explicar la solucion tambien debo agragar que el Serial.begin(9600); no tiene ningun efecto en este codigo porque no se esta usando comunicacion serial y me parece bueno informarlo porque se que al igual que yo los principiantes en arduino revisar todos los codigos y le quieren dar explicacion a todo el codigo y es cuando nos enrredamos buscanlo logica pero debe ser que al colega que inicio el post se le paso o tomo un formato de otro codigo pero en este codigo la intrupcion de configuracion de puerto esta sin efecto ya que no es usada en este ejmplo aca subo el codigo que realice aunque esta demas decirlo que es el mismo del colega solo no ya no agrego eso de la configuracion del puerto serial y otro detalle es qued el manejo la interrupcion para un arduino mega por eso tomo la interrupcion 2 en mi caso uso un arcduino deemilanove y por tal caso uso la interrupcion 0 que es en el pin 2.

Aca pongo mi codigo ya 100% funcionando y cabe mensionar que los led lo estoy usando en el pin12 y pin 13.

byte led1 = 12;
byte led2 = 13;

void setup()
{
attachInterrupt(0,parpadeo,FALLING);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
}

void loop()
{
digitalWrite(led1,1);
delay(700);
digitalWrite(led1,0);
delay(700);
}

void parpadeo()
{
digitalWrite(led2,HIGH);
delayMicroseconds(5000);
digitalWrite(led2,LOW);
delayMicroseconds(6000);
digitalWrite(led2,HIGH);
delayMicroseconds(6000);
digitalWrite(led2,LOW);
delayMicroseconds(6000);
}

Saludos y estamos en contacto.
Atten.
Alexander Santana.
Venezuela-Barcelona.

Hola nuevamente oye lo que si podriamos hacer es que esa interrupcion se active pero por puerto serial es decir cuando el puerto reciba algo se active la interrupcion.

Saludos y estare investigando el tema.
Atten.
Alexander Santana.
Barcelona-Venezuela

Si activas una interrupciĆ³n no podrĆ”s recibir nada por el puerto serie mientras se estĆ© dentro de ella, asi que hay que usarla con mucho cuidado.

hola revisando la referencia de el soft que dispone arduino no soporta interrupcion por hardware para le recepcion serial, seria cuestion de hacerla via asm.
solo use esta sentencia: if (Serial.available() > 0)
Saludos y cualquier avance les informo.
Atten.
Alexander Santana.
Barcelona-Venezuela.