Go Down

Topic: Problema con array (solucionado) (Read 1 time) previous topic - next topic

rabanisa

Aug 05, 2012, 11:49 am Last Edit: Aug 08, 2012, 07:44 pm by rabanisa Reason: 1
Buenos dias:

Estoy realizando un cronometro al cual quiero ponerle que valla guardando los distintos cronometrajes, por ejemplo 10 y una variable para contar el numero de vueltas . Para ello defino un array de este tipo:

long tiempo_vuelta[10];  o long tiempo_vuelta[10]={0,0,.........};
int numero_vuelta;

Cada vez que se produce la interrupcion del sensor del cuenta_vueltas realizo la siguiente operacion:

ISR(INT5_vect) // interrupcion para cronometro. pin 3 digital
{
 
 tiempo_vuelta[numero_vuelta]=millis()-start_crono;
 start_crono=millis();
 numero_vuelta++;  
}

El problema viene a la hora de visualizar (por ejemplo en el monitor del puerto serie). me devuelve siempre a 0
hasta que se desborda el array y salen cosas raras (creo que es lo mas normal), no creo que sea problema de SRAM
ya que es una placa mega y el codigo no es muy grande de momento.

Para visualizar lo hago de esta manera:  (una vez por segundo)

 Serial.print(" vuelta: ");
 Serial.print(numero_vuelta);
 Serial.print("  tiempo: ");
 Serial.print(tiempo_vuelta[numero_vuelta]);

Y esto es lo que me saca:

numero vuelta:  0     tiempo_vuelta :  0
numero vuelta:  1     tiempo_vuelta :  0
numero vuelta:  2     tiempo_vuelta :  0
numero vuelta:  3     tiempo_vuelta :  0
....                           ........................

Si lo realizo sin el array funciona bien es decir

long tiempo_vuelta;  
int numero_vuelta;

ISR(INT5_vect) // interrupcion para cronometro. pin 3 digital
{
 
 tiempo_vuelta=millis()-start_crono;
 start_crono=millis();
 numero_vuelta++;  
}


Serial.print(" vuelta: ");
 Serial.print(numero_vuelta);
 Serial.print("  tiempo: ");
 Serial.print(tiempo_vuelta);

Espero haberme explicado bien ya que no soy programador (se hace lo que se puede).

Saludos y muchas gracias.



curro92

Hola,
¿podrías poner el código completo usando el array?

rabanisa

Buenos dias:

La verdad es que el codigo es extenso y la unica parte donde sale el array es aqui y de esa manera. Creo que esta bien definido.

Saludos.

edetano

Hola rabanisa

El problema que tienes es que estás tomando los tiempos desde la función que maneja la interrupción, es decir, mientras la interrupción está activada. Dentro de esta función, Arduino no permite hacer prácticamente nada, el procesador está prácticamente muerto.

En la documentación se puede leer (la negrita es mía):

Inside the attached function, delay() won't work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function.

La solución que yo suelo utilizar es que la función que maneja la interrupción únicamente modifique un switch y el auténtico trabajo se haga desde loop().


Igor R

#4
Aug 06, 2012, 06:38 pm Last Edit: Aug 06, 2012, 06:53 pm by Igor R Reason: 1
El Serial.print(tiempo_vuelta[numero_vuelta]).... eso está apuntando a la siguiente posición que no se ha actualizado....cada vez que metes un dato en el array, aumentas el contador,por lo que nunca mostrará el dato actualizado.... no crees??
A parte como bien dices que puedes ir más alla del tamaño declarado del vector....deberías limitar eso.

Otra cosa, yo creo que deberías utilizar volatile... http://arduino.cc/es/Reference/Volatile


Saludos


Igor R.

Go Up