TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: cucos90 en 14 de Febrero de 2011, 17:40:32

Título: TERMOMETRO DIGITAL
Publicado por: cucos90 en 14 de Febrero de 2011, 17:40:32
Tengo que hacer un proyecto para clase,e elegido hacer un termostato digital,porque pense que no era tan dificil,weno el primer problema lo tengo en la visualizacion de la temperatura que solo me aparecen numeros enteros y me gustaria visualizarlos con decimales.El programa de simulacion que uso es el proteus y el compilador que uso es el PICC,si alguien esta interesado en alguno de estos programas que me los diga que se los paso. weno el programa sería el siguiente:

#include <pic.h>
#include "LCD1.h"
#include <stdio.h>
#include "binario.h"
#include "retardo_20ms.h"
#include "pulsada.h"
// Para el PIC16F87x
__CONFIG(WDTDIS & XT & UNPROTECT & PWRTDIS & LVPDIS );
char k;
char z;
char vp1=0;
char vp2=0;
int vp=0;
unsigned int t1;
unsigned int t;
void PintaMensaje(unsigned int temp)
{
   unsigned char i=0;
   char M[16];
   unsigned long  t = (temp*500L)>>16;
   LCD_Comando(LCDCasa);
   sprintf(M,"T.A.= %7d C",(unsigned int)t);     
   while( M!=0 ) LCD_Caracter( M[i++] );    // Pinta
}

void PintaMensaje2()
{
   unsigned char u=0;
   char N[16];
   if (k!=20)
   LCD_Comando(LCDLinea2);
   sprintf(N,"T.P.= %7d C",vp);   
   while ( N!=0) LCD_Caracter( N[u++]);    // Pinta
}
void Retardo()
{
vp2=pulsada();
for (t=0; t<40; t++) //Temporizador 1seg
      {
         
         TMR0=61;         //256-195
         OPTION=0x07;      //Configuramos el TMR0, con el prescaler 1:256 -> 111
         T0IF = 0;
         while (!T0IF);
      }
}

void main()
{
   z=k=0;
   ADCON1 = B00000000; // PORTA anal´ogico, justif. a la izquierda
   LCD_Port(); // Inicia los puertos
   LCD_Reset(); // Inicia el LCD
   while (1)
   {
      k=pulsada();
      ADCON0 = B11000001;
      ADIF = 0; // Borro indicador de fin de conversion
      ADGO = 1; // Inicia la conversion AD
      while(!ADIF);
      t1=ADRESH<<8|ADRESL;
      PintaMensaje(t1);
      if (z!=k & k!=20)
      {
         vp1=pulsada();
         //Retardo();
         vp2=pulsada();
         while (vp2 == vp1 | vp2 == 20)
         {
            vp2=pulsada();
         }
         vp1=vp1*10;
         vp=vp1+vp2;
         PintaMensaje2();
      }
      if (vp>t)
      {
         TRISC=TRISC & 0xEF;
         RC3=0x01;
      }
   }
}

Les agraderia muxisimo que me ayudaran ya que llevo atascado aqui bastante tiempo.Gracias por adelantado!!!!!
Si alguien no entiende algo de mi programa se lo explicare encantado!
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 14 de Febrero de 2011, 17:46:02
El esquema del cirtuito sería el siguiente:
Título: Re: TERMOMETRO DIGITAL
Publicado por: AngelGris en 14 de Febrero de 2011, 20:22:34
  Por lo que veo la función PintaMensaje es la encargada de mostrar la temperatura.

  ¿Para qué usas la siguiente línea?

Código: C
  1. unsigned long  t = (temp*500L)>>16;

  Por lo que parece sería para "convertir" la tensión leída por el ADC en el valor de temperatura. Quizá si a t la definís como float ya vas a tener almacenada la temperatura en una variable que te permite números reales. Luego tendrías que ver como usar "sprintf" para poder representar un valor real.
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 15 de Febrero de 2011, 05:08:24
Exacto,esa es la linea que me convierte los datos del conversor analógico digital a los grados centígrados.Si pongo la variable float en el sprint el caracter %N.Df , siendo D en número de decimales que quiero que me ponga, me ekivoco?
Gracias por tomarte las molestias en leerte y contextarlo.
Saludos
Título: Re: TERMOMETRO DIGITAL
Publicado por: AngelGris en 15 de Febrero de 2011, 09:56:50
Exacto,esa es la linea que me convierte los datos del conversor analógico digital a los grados centígrados.Si pongo la variable float en el sprint el caracter %N.Df , siendo D en número de decimales que quiero que me ponga, me ekivoco?
Gracias por tomarte las molestias en leerte y contextarlo.
Saludos

  Creo que sí, no estoy seguro por que nunca use ni printf y sprintf. Por lo que entendí del manual, N sería la cantidad total de caracteres y D la cantidad de decimales.
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 15 de Febrero de 2011, 13:17:46
Pues lo pongo y no me sale,me pinta solo una f minuscula.entonces que funciones utilizas tu para pintar en la pantalla LCD k no sea sprint fo printf?
Título: Re: TERMOMETRO DIGITAL
Publicado por: AngelGris en 15 de Febrero de 2011, 13:31:32
  Yo hice mis propias funciones para manejo de LCD y para pasar un número real a string hago uso de la función ftoa (FloatToAscci) -esta es una función de C y está en el manual de HiTech- y luego si mando el string con mi función.
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 15 de Febrero de 2011, 13:51:59
Pufff,no kiero meterme en temas asi k no controlo muy bn,mejor lo intentare hacer con la variable float y kn el sprintf haber si me sale,esque las funciones del LCD y del teclado exadecimal nos las da el profesor,si kieres las pongo aber que te parecen y si t son utiles
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 15 de Febrero de 2011, 14:53:27
Por cierto tengo el proyecto medio avanzado,si quereis que lo cuelgue por si os sirve algo no dudeis en decirlo!
Título: Re: TERMOMETRO DIGITAL
Publicado por: AngelGris en 15 de Febrero de 2011, 14:54:06
  Acabo de hacer la prueba en un programa escribiendo lo siguiente....

Código: C
  1. sprintf (texto,"%10.3f",Frecuencia);

  ... y sí funcionó. texto y Frecuencia son variables y están definidas de la siguiente manera

Código: C
  1. char texto[15];
  2. float Frecuencia;
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 15 de Febrero de 2011, 15:01:52
Me sigue pintando solo f minúscula nose xq,igual es porque la operación en la que convierto a grados centígrados tengo que usar una variable que sea long ya que esa operacion me da muchos números y no la puedo meter en un float.Podia ser por eso?
Título: Re: TERMOMETRO DIGITAL
Publicado por: AngelGris en 15 de Febrero de 2011, 15:38:50
Me sigue pintando solo f minúscula nose xq,igual es porque la operación en la que convierto a grados centígrados tengo que usar una variable que sea long ya que esa operacion me da muchos números y no la puedo meter en un float.Podia ser por eso?

  No creo. De todos modos fijate en el manual del compilador de cuantos bytes es una variable tipo long y una tipo floa. Si no estoy errado ambas son de 4 bytes.
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 16 de Febrero de 2011, 12:52:24
Yo tambien e esado mirando y las dos son iguales.Ya nose k mas ahacer,alguna otra solucion?
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 18 de Febrero de 2011, 13:31:19
De momento eso de pintar números decimales lo e dejado aparcado,ahora me gustaria poder comparar t con otra variable que sea la variable que meta yo por un teclado exadecimal pero resulta que me salen cosas raras,xq?no puedo utilizar la variable t para compararla?saludos!y gracias x adelantado x las respuestas
Título: Re: TERMOMETRO DIGITAL
Publicado por: AngelGris en 18 de Febrero de 2011, 17:31:05
  En teoría se puede compara cualquier tipo de variables. Exceptuando las tipo cadena que hay que compararlas con strcmp(). Pero cualguier otro tipo se lo puede comparar escribiendo, por ejemplo

Código: C
  1. if (t > 100)
Título: Re: TERMOMETRO DIGITAL
Publicado por: cucos90 en 20 de Febrero de 2011, 12:28:45
Vale, muchas gracias,este tema lo dejare apartador un par de dias o tres ya que ando un poko liado.Os comentare las novedades
Título: Termostato para incubadora
Publicado por: carmant en 27 de Marzo de 2011, 09:19:46
Hola, alguien que sepa me podria decir si este termostato puede funcionar?, lo he simulado con proteus y no me indica nada el display, si se ilumina, solo eso.
Me gustaria armarlo para una incubadora, parece bonito.
Gracias.
http://s-o.webnode.cz/rvtg/