Pages: [1]   Go Down
Author Topic: Problema con array (solucionado)  (Read 1195 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


« Last Edit: August 08, 2012, 12:44:41 pm by rabanisa » Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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().

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: August 06, 2012, 11:53:17 am by Igor R » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas tardes:

A la hora de visualizar lo hago a traves de un bucle for (lo di por echo cuando puse el problema), en cuanto a lo del volatile pues voy a probarlo.

Saludos y gracias por las respuestas.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Buenas tardes:

El caso es que estoy muy verde con muchos conceptos a veces la solucion mas simple es la mas probable, ademas me la diste hace dias (gracias Igor R) ...
lo bueno es que algo he aprendido y  por fin..... que fallo mas tonto, os pongo el trozo de programa con el error:

for(contador=0; contador<numero_vuelta;contador++){

  Serial.print(" vuelta: ");
  Serial.print(contador);
  Serial.print("  tiempo: ");
  Serial.print(tiempo_vuelta[numero_vuelta]);<--Tengo que poner Serial.print(tiempo_vuelta[contador]); (para que incremente)


}

Al capturar datos siempre me dejaba uno sin capturar para evitar el desborde, por defecto quedaba a cero y siempre me mostraba ese dato .

Saludos y gracias por la ayuda.
« Last Edit: August 08, 2012, 01:00:32 pm by rabanisa » Logged

Pages: [1]   Go Up
Jump to: