TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: eleguez en 06 de Febrero de 2007, 16:59:30

Título: Almacenar datos
Publicado por: eleguez en 06 de Febrero de 2007, 16:59:30
Hola a tod@s, tengo algun problemilla al programar el pic 16f876A, a ver si me podeis ayudar.

Tengo una entrada analógica cada 200ms y la visualizo en un LCD, lo he programado para que lea 100 entradas y haga la media,

for(i=0;i<=99;++i)
{
medida=read_adc();
delay_us(200);
lectura+=medida;
}
x=(lectura/100);

pero para que no me varíe tanto el resultado, queria que almacene 100 entradas y al tener una nueva entrada, quite la primera de esas 100 ya existentes, le añada la ultima y haga la media y asi sucesibamente. ¿alquien me puede decir como hacerlo?




Título: Re: Almacenar datos
Publicado por: manwenwe en 06 de Febrero de 2007, 17:28:39
Hola, lo que comentas se puede hacer con una "cola" o estructura "FIFO"... pero esto es un poco lioso de implementar,al menos para mi :D. Esperemos a ver si alguien tiene una solución más simple...

Saludos!
Título: Re: Almacenar datos
Publicado por: aitopes en 06 de Febrero de 2007, 17:31:22
Se me acaba de ocurrir....¿Por que no "ves" los 100 bytes como un circulo, donde a continuacion del 100 viene el 1? Vas escribiendo en el 1,2,3....99,100 y pasas de nuevo al 1. El secreto esta en llevar en alguna variable la posicion del principio de la cola, de forma que simpre sepas cual es el ultimo dato....
De esa forma de ahorras el mover los datos cada vez que queres agregar uno....

¿Se entiende? :shock:

Saludos!
Título: Re: Almacenar datos
Publicado por: maunix en 06 de Febrero de 2007, 17:34:50
Debes hacer un arreglo de 100 elementos, luego sumar esos 100 valores.  Por último una vez obtenido esto , usas un indice j que permita ir de 0 a 99 , y al llegar a 100 se haga 0 (nunca sería 100).

Cada lectura sería medida[j] = read_adc();

Entonces sería algo asi como

Código: C
  1. int medida[100];
  2. long lectura;
  3. int j, primeravuelta;
  4.  
  5.  
  6. void calculo_media(int max)
  7. {
  8.    lectura = 0;
  9.    for (i=0;i<max;i++)   lectura += medida[i];
  10. }
  11.  
  12.  
  13. void main (void) {
  14.  
  15.    primeravuelta = 0;  // indica que nunca llegó a 100 ni siquiera 1 vez
  16.    j=0;
  17.   while (1) {
  18.       medida[j]=read_adc();
  19.       delay_us(200);
  20.       j++;
  21.       if (j==100) {
  22.           j=0;
  23.           primeravuelta = 1;
  24.       }
  25.       if (primeravuelta) calculo_media(100)
  26.       else calculo_media(j);
  27.   }
  28.  
  29. }

El resultado estará siempre en lectura la cual es una variable global pero pudieras por ejemplo cambiar el prototipo de la función de cálculo para que te devuelva el cálculo ahí mismo.

No lo he probado pero debiera funcionar, de todas formas, lo importante creo que es la 'idea' de como resolver algo asi.

Saludos