Autor Tema: Termostato con pic16f876 (Duda en el teclado)  (Leído 3113 veces)

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

Desconectado sancho25

  • PIC10
  • *
  • Mensajes: 12
Re: Termostato con pic16f876 (Duda en el teclado)
« Respuesta #15 en: 12 de Febrero de 2012, 18:21:48 »
 ((:-)) muchas gracias por la explicacion, sinceramente no tenia ni idea, como ya e dixo ando un poco verde :)
practicamnte dejare el reset, xk ya tengo la placa montada jaja y habia hecho tambn el teclado para poder añadirlo cuando podria saber como se hace, pero gracias a tu ayuda ya lo se. Mañana lo pruebo y te comento por aqui haber que tal graciaaaas

Un saludo

Desconectado sancho25

  • PIC10
  • *
  • Mensajes: 12
Re: Termostato con pic16f876 (Duda en el teclado)
« Respuesta #16 en: 13 de Febrero de 2012, 13:49:44 »
Hola marqueses

He estado haciendo el programa, y al final e realizado con la ayuda de un compañero esto:

#include <16f876A.h>
#device ADC=10

#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT

#use fast_io (A)
#use fast_io (B)
//#use fast_io (C)
#use delay(clock=4000000)

#include <lcd2.c>
#include <ds1820.h>
//#include <teclado.c>
#include <kbd2.c>

float minimo;
float maximo;
char tecla;
int cursor;
char nu;
char MAX1;
char MAX2;
char MIN1;
char MIN2;
char c;
int i;


float valor_introducido_maximo()
{   
   for(i=0;i<2;i++)
      {
         do
            {
               tecla=kbd_getc();
               delay_ms(30);
            }
        while(tecla==0);
       
        if(tecla=='0'||tecla=='1'||tecla=='2'||tecla=='3'||tecla=='4'||tecla=='5'||tecla=='6'||tecla=='7'||tecla=='8'||tecla=='9')
        nu=tecla-48;
            if (cursor==0)MAX1=nu;
            if (cursor==1)MAX2=nu;
            cursor++;
            if (cursor==2) cursor=0;
      }
      return(tecla);
}

float valor_introducido_minimo()
{   
   for(i=0;i<2;i++)
      {
         do
            {
               tecla=kbd_getc();
               delay_ms(30);
            }
        while(tecla==0);
       
        if(tecla=='0'||tecla=='1'||tecla=='2'||tecla=='3'||tecla=='4'||tecla=='5'||tecla=='6'||tecla=='7'||tecla=='8'||tecla=='9')
        nu=tecla-48;
            if (cursor==8)MIN1=nu;
            if (cursor==9)MIN2=nu;
            cursor++;
            if (cursor==10) cursor=8;
      }
     return(tecla);
}
     
void main()
{
   lcd_init();
   delay_ms(100);
   SETUP_ADC_PORTS(NO_ANALOGS);
   set_tris_a(0x3F);
   set_tris_b(0x00);
   lcd_gotoxy(1,1);
   
   printf(lcd_putc,"Introduzca T Minimo\n");
   //Tecla_pulsada();
   //tecla=kbd_getc();
   minimo=valor_introducido_minimo();
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);
   printf(lcd_putc,"T Minimo = %f",minimo);
   delay_ms(1000);
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);

   printf(lcd_putc,"Introduzca T Maximo\n");
   //Tecla_pulsada();
   //tecla=kbd_getc();
   maximo=Valor_introducido_maximo();
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);
   printf(lcd_putc,"T Maximo= %f",maximo);
   delay_ms(1000);
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);
 

while (1)
{
   DS18S20_Convert_T();               //Obtiene la temperatura del DS18S20

   Temp=make16(DS18S20_Buffer[1],DS18S20_Buffer[0]);//Lee el valor de 16 bits de la temperatura
   if(bit_test(DS18S20_Buffer[1],7))      //Si es negativo...
      {
      Temp=~Temp+1;                  //Complementa a 2
      Temperatura=Temp*-0.5;            //Ajusta la parte fracionaria
      }   
   else
      Temperatura=Temp*0.5;            //Ajusta la parte fraccionaria
     
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);
   lcd_gotoxy(1,1);
   printf(lcd_putc,"TEMP: %3.1f ", temperatura);
   lcd_putc(223);
   lcd_putc("C    ");
   lcd_gotoxy(1,2);
   
   if (temperatura<=minimo)
      {
         printf(lcd_putc,"Frio! Calentando");
         output_high(PIN_C5);
         output_low(PIN_C6);
         output_low(PIN_C7);
      }
   else if (temperatura>=maximo)
      {
         printf(lcd_putc,"Caliente!Enfriar");
         output_low(PIN_C5);
         output_high(PIN_C6);
         output_low(PIN_C7);
         
      }
   else
      {
         printf(lcd_putc,"Temperatura OK  ");
         output_low(PIN_C5);
         output_low(PIN_C6);
         output_high(PIN_C7);
      }
}
}

Lo que me pasa ahora, es que le meta le valor que le meta en el teclado, no salen los valores que introduzco por el teclado, si no que salen 48 o 53... yno tengo ni idea de porque; creo que puede ser que las variables MAX1 y MAX2 las tego que juntar en una para iguyalarlo a a el valor de tecla, para que haga la conversion a decimal y asi sacar el valor que introduzco.....

Igual me he hecho un lio... no se :(

un saludo

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: Termostato con pic16f876 (Duda en el teclado)
« Respuesta #17 en: 14 de Febrero de 2012, 06:43:43 »
Tiene pinta de ser los caracteres ASCI, ¿has probado con el código que te propuse? Ademas, debes incluir la funcion      kbd_init();                                       al inicio (lo mismo que haces con el LCD con lcd_init())

Prueba a ver este código y si te funciona ya vas probando tu código

Código: [Seleccionar]
void main()
{
   lcd_init();
     kbd_init();                                     
   delay_ms(100);
   SETUP_ADC_PORTS(NO_ANALOGS);
   set_tris_a(0x3F);
   set_tris_b(0x00);
   lcd_gotoxy(1,1);
   
   printf(lcd_putc,"\fIntroduzca Tº Minimo\n");
   Tecla_pulsada();
   minimo=Valor_introducido ();
   printf(lcd_putc,"\fTº Minima = %f",minima);
   delay_ms(1000);

printf(lcd_putc,"\fIntroduzca Tº Maxima\n");
   Tecla_pulsada();
   maximo=Valor_introducido ();
   printf(lcd_putc,"\fTº Maxima= %f",maximo);
   delay_ms(1000);
 

while (1)
{
   DS18S20_Convert_T();               //Obtiene la temperatura del DS18S20

   Temp=make16(DS18S20_Buffer[1],DS18S20_Buffer[0]);//Lee el valor de 16 bits de la temperatura
   if(bit_test(DS18S20_Buffer[1],7))      //Si es negativo...
      {
      Temp=~Temp+1;                  //Complementa a 2
      Temperatura=Temp*-0.5;            //Ajusta la parte fracionaria
      }   
   else
      Temperatura=Temp*0.5;            //Ajusta la parte fraccionaria
     
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);
   lcd_gotoxy(1,1);
   printf(lcd_putc,"TEMP: %3.1f ", temperatura);
   lcd_putc(223);
   lcd_putc("C    ");
   lcd_gotoxy(1,2);
   
   if (temperatura<=minimo)
      {
         printf(lcd_putc,"Frio! Calentando");
         output_high(PIN_C5);
         output_low(PIN_C6);
         output_low(PIN_C7);
      }
   else if (temperatura>=maximo)
      {
         printf(lcd_putc,"Caliente!Enfriar");
         output_low(PIN_C5);
         output_high(PIN_C6);
         output_low(PIN_C7);
         
      }
   else
      {
         printf(lcd_putc,"Temperatura OK  ");
         output_low(PIN_C5);
         output_low(PIN_C6);
         output_high(PIN_C7);
      }
}
}
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado sancho25

  • PIC10
  • *
  • Mensajes: 12
Re: Termostato con pic16f876 (Duda en el teclado)
« Respuesta #18 en: 16 de Febrero de 2012, 13:47:44 »
Hola marqueses, ya lo he solucionado, era la colocacion de los float y los char; he nombrado individualmente para cada temperatura maxima y minimo y dentro de ello. Ahora lo que quiero es que cuando me esta controlando la temperatura(cuando ya he elegido el min y el max) que dando al boton del teclado matricial (#) que mme vuelva a pedir la temperatura maxima y minima, e pensado hacerlo con de do while, pero no me sale... si sabrias hacerlo..

un saludo y gracias

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: Termostato con pic16f876 (Duda en el teclado)
« Respuesta #19 en: 17 de Febrero de 2012, 07:03:38 »
Hola Sancho, me alegro que te funcionara finalmente!  ((:-)) Lo que quieres hacer ahora es lo que te comenté en su día, si quieres cambiar la temperatura en cualquier momento, lo mas facil y eficaz es colocar una interrupción externa a través de un pulsador, ya que como me comentas que quieres hacer, el micro tiene que estar en cada ciclo del while comprobando que la tecla # está pulsada, y eso puede ocasionar problemas y perdida de tiempo.

En caso de que no puedas usar un pulsador y programar la interrupción externa, pues la opción que dices seria colocar un if (teclapulsada=#) --> ejecutas la función de introducir la temperatura, else --> sigues con el control normal. Esta forma de programar ya te digo que puede darte problemas, ya que si el programa es lento o rapido quizas no le de tiempo a darse cuenta de que la tecla esté pulsada o no. En fin, pruebalo y ya comentas  ;-)
Alberto Aragón Marqueses
albertomarqueses.wordpress.com