TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Trev en 15 de Agosto de 2009, 19:52:30

Título: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 15 de Agosto de 2009, 19:52:30
Hola  :) acabo de montar un simple control de temperatura con un LCD con backlight y un teclado conectado a mi pic 16f877a no tengo conectado el sensor lm335 porque no lo he calibrado asique lo pruebo con un pot por ahora..el problema que me surge es que si bien todo va bien en la simulación en proteus ,en el proto no me imprime la temperatura el display(solo los titulos)sino hasta despues de usar el teclado asique no se  :shock:..ahh y he comprobado(con el pic desconectado) que mi 7805 no regula bien si le doy mas de 4 V al backligh¿cual es la tension justa a la que funciona el backlight?a 4 V consigo 4.92 V del 7805 si subo de eso me saca 4.5 y eso es malo para el pic :( ,les dejo la simulación en proteus y el código en ccs,saludos y gracias.
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: ppyote en 15 de Agosto de 2009, 21:15:58
lo primero y principal es indicarle al ccs que los resultados de estos valores pasan de ser int o long a float....

voltaje=(bin_lectura*P)+2.73;
temperatura=(voltaje/0.01)-273;

prueba asi

voltaje=(float)((bin_lectura*P)+2.73);
temperatura=(float)((voltaje/0.01)-273);

si no se lo indicas no te los transforma....
Suerte
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 16 de Agosto de 2009, 00:58:40
Gracias por responder..  :) ,no sabia que se transformaba asi un entero bueno probaré y te cuento o sino mejor los paso a float pero el problema esta en el arranque (antes de usar el teclado por primera vez) despues me muestra la variable con dos decimales..
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Suky en 16 de Agosto de 2009, 10:01:23
lo primero y principal es indicarle al ccs que los resultados de estos valores pasan de ser int o long a float....

voltaje=(bin_lectura*P)+2.73;
temperatura=(voltaje/0.01)-273;

prueba asi

voltaje=(float)((bin_lectura*P)+2.73);
temperatura=(float)((voltaje/0.01)-273);

si no se lo indicas no te los transforma....
Suerte

O así:
voltaje=((float)(bin_lectura*P)+2.73);
temperatura=(((float)voltaje / 0.01)-2.73);

Comento, porque me ha tocado hacerlo como indica ppyote, indicando en forma general toda la ecuación y no ha funcionado.

Saludos!
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: jhozate en 16 de Agosto de 2009, 11:26:27
como aun me considero nuevato en ccs.. tengo una duda..no basta con declarar a voltaje y temperatura como un float al inicio del programa?...cual es la finalidad de poner:
voltaje=(float)((bin_lectura*P)+2.73);

saludos
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Suky en 16 de Agosto de 2009, 12:39:12
como aun me considero nuevato en ccs.. tengo una duda..no basta con declarar a voltaje y temperatura como un float al inicio del programa?...cual es la finalidad de poner:
voltaje=(float)((bin_lectura*P)+2.73);

saludos

Voltaje y Temperatura seguro ya están definidos como float. En cambio bin_lectura es el valor de la conversión analógica y es de 16 bits.

En este caso por ejemplo, bin_lectura y P son long, entonces si al multiplicarlos da mayor a 65536 se trunca y se pierde su valor. Al colocar ((float)(bin_lectura*P)) los trata como float, el resultado no se trunca y nos da el valor deseado   :mrgreen:

Saludos!
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: ppyote en 16 de Agosto de 2009, 21:44:59
como aun me considero nuevato en ccs.. tengo una duda..no basta con declarar a voltaje y temperatura como un float al inicio del programa?...cual es la finalidad de poner:
voltaje=(float)((bin_lectura*P)+2.73);

saludos

Voltaje y Temperatura seguro ya están definidos como float. En cambio bin_lectura es el valor de la conversión analógica y es de 16 bits.

En este caso por ejemplo, bin_lectura y P son long, entonces si al multiplicarlos da mayor a 65536 se trunca y se pierde su valor. Al colocar ((float)(bin_lectura*P)) los trata como float, el resultado no se trunca y nos da el valor deseado   :mrgreen:

Saludos!

Las cosas claras y el chocolate espeso, esas respuestas son las mejores, de corta explicacion pero de facil entendimiento...
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 17 de Agosto de 2009, 00:10:41
Gracias amigos pero sigo igual :( no hubo manera de que me presente la temperatura la primera vez solo despues de seleccionar una tempreatura con el teclado ahi si hace la lectura..,coloque una resistencia de 10k como undica el datasheet del sensor y lo calibre como dice a 2.98 V pero = sigue marcando 0,salu2
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: ramirez en 17 de Agosto de 2009, 12:46:09
Hola a todos. ¿Trev, puedes subir el esquema?

Gracias
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Suky en 17 de Agosto de 2009, 13:22:08
Agrega #use fast_io(b), porque sino es tratado como standard y cada vez que escribas o leas el puerto cambiará el tris según sea el caso. Además puedes reemplazar portb=vect[ i ]; por output_b(vect[ i ]);

Luego las siguientes lineas:
Código: C
  1. set_tris_a(0x0D);                     //Configuro RA0,RA2(Vref-) y RA3(Vref+) como entradas.
  2.    setup_adc(adc_clock_internal);        //Pongo en marcha módulo A/D.
  3.    delay_us(80);
  4.    setup_adc_ports(AN0_VREF_VREF);      
  5.    set_adc_channel(0);                   //El canal analogo a emplear será RA0/AN0.      
  6.    delay_us(80);

Quitalas del bucle y colócalas al inicio del maín:

Código: C
  1. main()
  2. {  
  3.    set_tris_b(0xf0);
  4.    set_tris_d(0x00);  
  5.    setup_adc(adc_clock_internal);        //Pongo en marcha módulo A/D.
  6.    setup_adc_ports(AN0_VREF_VREF);      
  7.    set_adc_channel(0);                   //El canal analogo a emplear será RA0/AN0.      
  8.    delay_us(30);

La configuración del TRISA no es necesaria.

Saludos!
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 17 de Agosto de 2009, 22:29:22
Gracias viejo  :) voy a probar esto(si mi novia me da un respiro  :D) y luego te cuento ademas no me vendria mal repasar un poco el modulo A/D saludos desde Rosario
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 17 de Agosto de 2009, 22:41:22
Hola ramirez aca te dejo la simulación (va la siburracion  :D en criollo)en proteus nos vemos
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: ramirez en 20 de Agosto de 2009, 10:48:15
Hola Trev, con que versión lo has hecho, ya que yo tengo 7.2 y no puedo abrirlo. Además, si puedes, te agradecería que lo guardaras en esta versión para poder abrirlo.

¿Cual es la última versión que existe?

Gracias
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 20 de Agosto de 2009, 12:31:26
Mira te conviene actualizar el proteus,en directoriowarez puedes encontrarlo,te registras y listo porque yo no tengo las versiones viejas¿el código lo pudiste abrir?para mi esta bien es un problema de calibración del sensor me juego
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 29 de Agosto de 2009, 15:41:32
Muchachos ya descubri el problema..entra en la interrupción del portb primero,no se porque se dispara la interrupción,Saludos
 :)
Título: Re: Problemas con la lectura de temperatura en mi display
Publicado por: Trev en 30 de Agosto de 2009, 11:48:51
El tema de la interrupción lo solucione haciendo esto en el main:
Código: [Seleccionar]
set_trisb(0xf0);
portb=0xf0;
port_b_pullups(TRUE);

en ese orden y andubo lo mas piola pero sigue sin marcar la temperatura de arranque  :(,saludos