Autor Tema: PROBLEMA CON ARREGLOS  (Leído 2451 veces)

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

Desconectado pumasmorelos

  • PIC10
  • *
  • Mensajes: 4
PROBLEMA CON ARREGLOS
« en: 25 de Noviembre de 2014, 04:28:01 »
Hola! Estoy tratando de hacer un programa que me lea la lectura de ADC con pic y que saque un promedio, es decir quiero leer 2 lecturas de sensores cny70 con el convertidor analogico digital y obtener un promedio.
Se supone q mi  programa debe funcionar de la siguiente manera: primeramente si leo el sensor1 guarda el dato en valor[0] y despues pasa al for de la parte de abajo entonces el for empieza a contar desde cero y como i=0 entonces se va a la posicion 0 del arreglo para obtener el valor q esta en esa pocision, es decir 1023 entonces al hacer las operaciones me tiene q dar cero. Entonces cuendo lea el sensor2 la operacion final me tendria q dar 1000 ya que el dato ahora lo estoy guaradando en valor[1] y como i=1 entonces al hacer las operaciones me tendria q dar como resultado 1000, pero este es el problema q tengo ya q no obtengo ese valor q deseo, talvez tenga mal mi programa pero no tengo idea en que parte o q operaciones estoy haciendo mal para sacar el promedio.
Espero me puedan ayudar porfavor y gracias!
Saludos!  :)

#include <18f4550.h>
#device adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay (clock = 20000000)

int16 sensor1,sensor2;
int valor[2];
int i;
int16 sensor=0;
int16 sum=0;
int16 promedio=0;

void main()
{
  setup_port_a(ALL_ANALOG);
  setup_adc(ADC_CLOCK_INTERNAL);

while(true)
  {
     
    for(i=0;i<2;i++)
    {
    //sensor1
    set_adc_channel(1);
    delay_us(10);
    sensor1= read_adc();
    valor[0]=sensor1;

    //sensor2
     set_adc_channel(2);
     delay_us(10);
     sensor2= read_adc();
     valor[1]=sensor2;
     }

      for(i=0;i<2;i++)
      {
      sensor= sensor+(valor*i*1000);
      sum=sum+valor;
      delay_ms(100);
       }
       promedio=sensor/sum;

    }
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMA CON ARREGLOS
« Respuesta #1 en: 25 de Noviembre de 2014, 05:00:45 »
Por que te la complicas tanto para sacar el promedio de 2 numeros ?

Citar
entonces se va a la posicion 0 del arreglo para obtener el valor q esta en esa pocision, es decir 1023 entonces al hacer las operaciones me tiene q dar cero. Entonces cuendo lea el sensor2 la operacion final me tendria q dar 1000 ya que el dato ahora lo estoy guaradando en valor[1] y como i=1 entonces al hacer las operaciones me tendria q dar como resultado 1000,

Pero ahi no vas a la posicion 0 del arreglo, a no ser que estes usando un puntero u algo por el estilo.
No entiendo por que 1023 ( asumiendo que es el valor que lees del ADC y lo conoces ) la operacion te tiene que dar cero ?
Por que cuando lees el sensor 2 te tendria que dar 1000 ?.
Me termine basando en lo que pusiste al comienzo por que no logro entender lo que pedis para tu programa.
Es decir:

Citar
Estoy tratando de hacer un programa que me lea la lectura de ADC con pic y que saque un promedio, es decir quiero leer 2 lecturas de sensores cny70 con el convertidor analogico digital y obtener un promedio.

A no ser que quieras hacer un promedio movil o Moving average ( simple, acumulativo, exponencial, etc )

El promedio no es mas que la suma de ambos y lo dividis por 2.

Código: [Seleccionar]
while(true)
  {
      
      //sensor1
    set_adc_channel(1);
    delay_us(10);
    sensor1= read_adc();
    valor[0]=sensor1;

    //sensor2
     set_adc_channel(2);
     delay_us(10);
     sensor2= read_adc();
     valor[1]=sensor2;

     promedio = (valor[0] + valor[1])/2;  // o rotado a la derecha una ves "promedio = (valor[0] + valor[1]) >> 1;"
}

O como lo queres hacer con un for (Pero por la cantidad de numeros a sumar ocuparias mas ciclos de reloj y 1 lugar de memoria mas para la variable i):

Código: [Seleccionar]
promedio=0;
      for(i=0;i<2;i++)
      {
      promedio += valor[i];
      }
      promedio /= 2; // o promedio >>= 1;

Es decir promedio comienza con 0 (ya que al volverse a ejecutar el codigo tendria otro valor), luego hace la suma "promedio = promedio + valor[0]" y luego la suma "promedio = promedio + valor[1]" por ultimo lo divide por 2 "promedio = promedio / 2".
O si no queres hacer un for y concentrarlo todo en una linea como hice en el primer ejemplo pones las 3 instrucciones que explique aca una abajo de la otra y listo.

O tu idea es hacerlo con punteros ?

valor es lo mismo que &valor[0], es decir la direccion de donde se encuentra valor[0] y no el contenido.
Por lo que podrias reemplazar el valor en el for por *(valor + i ). Pero creo que seria complicarte aun mas
« Última modificación: 25 de Noviembre de 2014, 13:13:08 por KILLERJC »

Desconectado pumasmorelos

  • PIC10
  • *
  • Mensajes: 4
Re: PROBLEMA CON ARREGLOS
« Respuesta #2 en: 29 de Noviembre de 2014, 03:45:32 »
Que tal! Gracias por responder.
Mi idea es utiliza 5 sensores es por eso que utilizo un arreglo para guardar los datos de cada sensor, en el ejemplo anterior solo coloque un arreglo de dimencion 2, la forma en que los voy guardando es asi:

  //sensor1
    set_adc_channel(1);
    delay_us(10);
    sensor1= read_adc();
    valor[0]=sensor1;

    //sensor2
     set_adc_channel(2);
     delay_us(10);
     sensor2= read_adc();
     valor[1]=sensor2;

Entonces como quiero sacar un promedio utilizo un for para q valla recorriendo el arreglo, entonces como yo quiero utilizar 5 sensores y quiero que las lecturas me den de 0 a 5000, es por eso que multiplico x 1000, supongamos q tengo activo el sensor2 entonces el valor lo guardo en la posicion1 y como estoy utilizando el ADC con resolucion de 10 bits asumo q el la lectura del sensor es 1023. Despues de capturar la lectura entro al for y este empieza  a recorrer el arreglo y como tengo un valor en la posicion 1 de ese arreglo hago la siguiente operacion:
 for(   for(i=0;i<2;i++)
 {
   sensor= sensor+(valor*i*1000);
    sum=sum+valor;
 }
  promedio=sensor/sum;

En esta operacion me tendria que dar sensor=1023000 ya que asumo la lectura del sensor como 1023 es decir la operacion con valores quedaria asi: sensor=sensor`+1023*1*1000 y sum=sum+1023, entonces el resultado final seria promedio=1023000/1023=1000. Si estuviera con otro sensor por ejemplo el 3 de valor final tendria q tener 3000 y asi sucesivamente para los 5 sensores o si tuviera 2 sensores activos me tendria q dar una un promedio intermedio, el problema es q no tengo esos resultados. Espero me halla explicado para q asi mismo me puedan dar un consejo en la programacion. GRACIAS!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMA CON ARREGLOS
« Respuesta #3 en: 29 de Noviembre de 2014, 06:29:37 »
Citar
y quiero que las lecturas me den de 0 a 5000

Eso es una cosa distinta.
El promedio de varios numeros jamas te va a dar mayor al maximo numero de tu lista.

Para que te de un numero de 0 a 5000, deberias multiplicarlo por 5000 ( o por 625 y 8 luego ) y dividirlo por 1024. No se me ocurre otra.

Citar
Si estuviera con otro sensor por ejemplo el 3 de valor final tendria q tener 3000

Pero entonces no estas sacando promedio... estas sumando directamente. No tenes claro lo que es un promedio. Si tu problema es limitar la lectura a 1000 y no a 1023, podes hacer lo que te dije arriba, o lo haces para cada uno o para todo el conjunto (sumar todo y luego aplicarle eso). Pero no le veo el sentido ya que estarias agregando error a tus lecturas. Pero sigo insistiendo que tenes un problema de concepto en lo que es promedio.

Desconectado alexhumbertoa

  • PIC10
  • *
  • Mensajes: 49
Re: PROBLEMA CON ARREGLOS
« Respuesta #4 en: 28 de Diciembre de 2014, 20:28:33 »
Deberías explicar de forma un poco más general qué es lo que debe hacer el programa o poner un ejemplo de que resultado debe dar el programa con determinadas entradas
La protoboard es la mejor amiga del ruido.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PROBLEMA CON ARREGLOS
« Respuesta #5 en: 29 de Diciembre de 2014, 10:01:50 »
Que tal amigos.
Citar
for(i=0;i<2;i++)
      {
      sensor= sensor+(valor*i*1000);
      sum=sum+valor;
      delay_ms(100);
       }
       promedio=sensor/sum;

Citar
En esta operacion me tendria que dar sensor=1023000 ya que asumo la lectura del sensor como 1023 es decir la operacion con valores quedaria asi: sensor=sensor`+1023*1*1000 y sum=sum+1023, entonces el resultado final seria promedio=1023000/1023=1000.

Tal como lo indicas arriba la rutina esta mala   :?
La variables int16 solo puedes almacenar valores hasta 65535 por lo que no puedes almacenar 1023000.
valor*i*1000, esto esta mal "valor" es una direccion no un dato, para que sea un dato debes colocarlo asi
Código: [Seleccionar]
valor[i], "por ser un arrays", luego al multiplicarlo por 1000 se sale de rango (>65535).

Saludos
« Última modificación: 29 de Diciembre de 2014, 10:10:02 por RALF2 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PROBLEMA CON ARREGLOS
« Respuesta #6 en: 29 de Diciembre de 2014, 21:11:21 »
No contesto mas del ultimo mensaje (hace 1 mes ), pero el se explicaba como "promedio" pero realmente estaba haciendo una suma, que luego la multiplicaba por 1000 sin ningun sentido. Su razonamiento matematico para un promedio estaba mal.
Inclusive si fuera el valor[indice] el usado:

sensor= sensor+(valor*i*1000);

Eso haria que el primer sensor de maximo 1024000, el otro sensor de 2048000 y asi... lo cual sigue sin tener sentido xD.
Y si omitimos el 1000, quedaria : 1er sensor 1024 , 2do 2048, tercero 3096 , estaria multiplicando sin sentido por 1, por 2 y por 3.


Citar
Si estuviera con otro sensor por ejemplo el 3 de valor final tendria q tener 3000

Como lo recalque no esta sacando un promedio era una suma lo que queria simplemente que podia resolver de 2 formas
  • podia multiplicarlo por 1000 y dividirlo por 1024 luego de la suma ( aunque esto significa que logre almacenar un numero de 3.096.000
  • o de ultima solo limitaba la lectura a 1000 y se ahorraba muchos ciclos y memoria.


Si algun dia da una vuelta que responda como lo soluciono o si tiro todo y quedo ahi.

O tal ves queria que el sensor 1 le de 1000, el 2 le de 2000, el 3 le de 3000, pero sacar un promedio de eso es sinceramente absurdo.
« Última modificación: 29 de Diciembre de 2014, 21:16:15 por KILLERJC »


 

anything