Autor Tema: TERMOMETRO DIGITAL  (Leído 4935 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
TERMOMETRO DIGITAL
« 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!

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #1 en: 14 de Febrero de 2011, 17:46:02 »
El esquema del cirtuito sería el siguiente:

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TERMOMETRO DIGITAL
« Respuesta #2 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #3 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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TERMOMETRO DIGITAL
« Respuesta #4 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #5 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?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TERMOMETRO DIGITAL
« Respuesta #6 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #7 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

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #8 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!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TERMOMETRO DIGITAL
« Respuesta #9 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;
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #10 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?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TERMOMETRO DIGITAL
« Respuesta #11 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #12 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?

Desconectado cucos90

  • PIC10
  • *
  • Mensajes: 10
Re: TERMOMETRO DIGITAL
« Respuesta #13 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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TERMOMETRO DIGITAL
« Respuesta #14 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)
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything