TODOPIC
Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: RALF2 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
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
-
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!
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:
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