Autor Tema: Problema con interrupcion en arduino mega  (Leído 6613 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Problema con interrupcion en arduino mega
« en: 17 de Julio de 2010, 14:07:37 »
 Que tal amigos!
Estuve realizando un programaita sencillo con el arduino mega utilizando interrupciones y se me presento un problema  :?
Cuando entro a la interrupcion el micro se queda en esta y no sale de ella?
 les coloco el codigo en cuestion

Citar
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 cuando halla un flanco de bajada en el pin 21el programa debe saltar a la rutina de interrupcion y alli hacer parpadear el led dos veces y salirse luego, pero no lo hace  :5]
Solo enciende el led y se queda alli?

Algna idea de lo que puede estar pasando?

Saludos

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Problema con interrupcion en arduino mega
« Respuesta #1 en: 18 de Julio de 2010, 13:27:01 »
Ok me respondo a mi mismo  :D
El arduino de acuerdo a las pruebas que realice con el presenta problemas con las rutinas de retardo especificamente el delay(), si esta se inserta en una rutina de interrupcion el programa se  cuelga tal como ocurre en el problema que coloque arriba, asi que una solucion es no utilizar el delay(ms) dentro de una rutina de interrupcion.
No obstante si utilizan delayMicroseconds(), en vez de delay(), si les funcionara!  :-/


Les coloco el codigo de otro programa que realice y que funciona, utilizando interrupciones!

Citar
byte led1 = 2;
byte led2 = 3;
byte data = 0;
void setup()
{
   Serial.begin(9600);
   attachInterrupt(2,parpadeo,FALLING);
   pinMode(led1,OUTPUT);
   pinMode(led2,OUTPUT);  
}

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


void parpadeo()
{
   if(Serial.available() > 0){
      data = Serial.read();
      Serial.println(data);
   }  
   if(data == '1'){
     digitalWrite(led1,1);
   }  
   else if (data=='0'){
     digitalWrite(led1,0);
   }
   else {}  
  

}  

y este que funciona con el delayMicroseconds()  :mrgreen:

Citar
byte led1 = 2;
byte led2 = 3;
byte data = 0;
void setup()
{
   Serial.begin(9600);
   attachInterrupt(2,parpadeo,FALLING);
   pinMode(led1,OUTPUT);
   pinMode(led2,OUTPUT); 
}

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



void parpadeo()
{
     digitalWrite(led1,HIGH);
     delayMicroseconds(16000);
     digitalWrite(led1,LOW);
     delayMicroseconds(16000);
     digitalWrite(led1,HIGH);
     delayMicroseconds(16000);
     digitalWrite(led1,LOW);
     delayMicroseconds(16000);
     digitalWrite(led1,HIGH);
     delayMicroseconds(16000);
     digitalWrite(led1,LOW);
     delayMicroseconds(16000);
     digitalWrite(led1,HIGH);
     delayMicroseconds(16000);
     digitalWrite(led1,LOW);
     delayMicroseconds(16000);
     digitalWrite(led1,HIGH);
     delayMicroseconds(16000);
     digitalWrite(led1,LOW);
     delayMicroseconds(16000);
     digitalWrite(led1,HIGH);
     delayMicroseconds(16000);
     digitalWrite(led1,LOW);
     delayMicroseconds(16000);   

Saludos
« Última modificación: 18 de Julio de 2010, 13:43:04 por RALF2 »