Autor Tema: El ADC me modifica la tensión en el pin a leer  (Leído 6943 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #15 en: 06 de Febrero de 2008, 10:08:51 »
Es raro. Podrías probar a mostrar el valor de val_ADC, luego el valor de (float)val_ADC, posteriormente el valor de (float)val_ADC*0.3519 y por último el de (int16)((float)val_ADC*0.3519) hasta encontrar en que parte de la operación la estamos cagando.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #16 en: 06 de Febrero de 2008, 10:23:50 »
Lo tengo así:

int16 val_adc;
int16 real;

Cómo quieres que muestre lo que me has ido diciendo, a través de la variable real o directamente?

Si hago real=(float)val_adc; el valor es el mismo que val_adc.
Si hago real=(float)val_adc*0,3519; el valor que obtengo es cero.


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #17 en: 06 de Febrero de 2008, 10:28:12 »
prueba esto, a ver qué tal:

printf(LCD_PUTC, "%6.2f",(float)val_adc*0,3519);

y luego esto otro

printf(LCD_PUTC, "%6lu",(int16)((float)val_adc*0,3519));

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #18 en: 06 de Febrero de 2008, 10:33:18 »
La primera me desborda la memoria de programa, lo probaré con valores fijos sin el resto del programa. Y la segunda me muestra 3519.

EDITO:

He probado la primera en un programa "vacío" con varios valores para val_adc y en todos me da .00
« Última modificación: 06 de Febrero de 2008, 10:39:09 por DarkVect »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #19 en: 06 de Febrero de 2008, 10:42:01 »
¡Qué raro!

Veo que en vez de punto decimal (0.3259) escribí coma decimal (0,3259). ¿No será eso lo que provoca que sólo se quede con el 0 y por eso el resultado siempre sea 0?

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #20 en: 06 de Febrero de 2008, 10:55:24 »
Es muy posible!! Lo copié directamente!!

Por la tarde lo pruebo. Gracias!!

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #21 en: 07 de Febrero de 2008, 15:52:09 »
He cambiado la , por el . y va perfecto!! Gracias!!


Desconectado ComePic

  • PIC10
  • *
  • Mensajes: 4
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #23 en: 04 de Diciembre de 2010, 14:02:04 »
Ah, jeje, creo que he visto el problema.

No has puesto #use fast_io(A)

Al no tenerlo, en el momento que haces  output_a(0b0001000); me apuesto lo que quieras a que eso desconfigura la entrada analógica y la pone en digital.

Bueno antes que nada un saludo a todos....

Segun lo que entiendo del manual, el CCS por defecto usa #use standard_io(A) , el genera lineas de codigo en el compilado cuando se modificara el estado de un pin  para asegurar la direccion de uso del pin (I/O). Lo pueden comprobar con el archivo *.lst que se genera cuando compilan. Ahi esta el *.asm que se convertira en *.hex ....

Por lo de la operacion aritmetica mira como lo hago yo....
Código: [Seleccionar]
         
         unsigned long cont;
         int temp;
         duty(6);                       // es una funcion para asignar el ciclo del trabajo, ya que set_pwm1_duty() no tiene en cuenta los 2 bit menos significaivos
         while(!t(jp)){                // t lo tengo definido como bit_test .... es muy largo y no me gusta colocarlo en la preguntas. jp en un pin, ahi hay un boton
            vt=read_adc();         // aqui obtengo el valor entre 0 y 1023
            if(vt!=vt_ant)            // pregunto si es diferente al anterior y si lo es , que entre en el if
            {
               vt_ant=vt;            // hago la conversion anterior igual a la nueva
               cont=(0.13*vt)+6;   // Aqui hago una regla de tres para convertir 0-1023 a 6-138... la operacion real era cont=(vt*138)/1023 + 6
                                             // pero como se desbordaba la multiplicacion sobre los dos bytes que tiene cont, opte por  138/1023=0.13           
               temp=make8(cont,0); // Como cont es de 2 bytes solo necesito el byte menos significativo y con make8 saco el byte 0 de cont y lo llevo a temp
               duty(temp);
            }
Y por otro lado yo tambien tengo el problema del potenciometro, lo conecto de igual manera que Dark y por mas que muevo el pot solo me varian unos cuantos milivoltios a la entrada del pic. Cuando no  lo tengo a la entrada del pic, funciona de maravilla el divisor de tension del pot. Lo mas curioso es que cuando conecto la entrada del pic directamente a 0v(GND) ó 5v(Vcc) el pin si cambia el voltaje y registra lo 1023 ó 0 , correspondientes a la conversion.
Con esos datos tambien pense que el pot (50k) no esta dentro del permitido segun en el manual (10k a lo mucho) y le coloque un seguidor pero igual no me funciono. Luego lei aca en el foro y vi las posibilidad de modificar el codigo para asegurar la correcta configuracion, coloque el #use fast_io(a) y no funciono, yo no uso el set_tris_a() pero igual me dio por usarlo y tampoco.... bueno en fin programe tanto ese pic que me canse y opte por cambiar de pin y se soluciono el problema. Puede ser que estuviese quemado, pero coloque otro pic nuevo y pasaba lo mismo.... hablo del 12f683 el pin An3(#3) ...

Ojala alguien tenga idea de lo que pasa y puedar iluminarnos mas acerca del tema.
Un Abraso...