Autor Tema: Problema con temperatura LM35 no la imprime el LCD  (Leído 3077 veces)

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

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Problema con temperatura LM35 no la imprime el LCD
« en: 05 de Junio de 2015, 12:46:32 »


Hola ante todo gracias de antemano por su ayuda y colaboración y por leer mi problema.

La cuestion es que no he podido lograr imprimir la temperatura leida por el LM35 en un proyecto realizado con el compilador CCS C Compiler - PCM Compiler, Version 4.104 (El compilador su ventana principal pone PCW / PCWHD) ya que no uso la libreria LCD.c ni puedo usar ninguna funcion de esta libreria y al ponerla sobre mi proyecto me crea conflictos en los delays de la libreria LCD.c

Simulo con PROTEUS 7.7 SP2 y como he dicho no em aparce la temepratura la cual quiero que me aparezca con dos decimales.



La cuestión es que tengo una libreria LCD creada por mi mismo y una libreria para el DS1307 todo sobre el mismo archivo con extension .C y me gustaría a ver si alguien me peude echar una mano con este minusculo problema que no le encuentro solución.

Dejo el codigo  y el archivo de PROTEUS para que lo peudan descargar y asi echarme una mano si son tan amables.

Un saludo y gracias de antemano

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #1 en: 05 de Junio de 2015, 13:53:47 »
¿Podría añadir la función lcd_putc para poder usar el printf al proyecto sin utilizar la libreria LCD.c?

De ser afirmativa la respuesta a la pregunta anterior, ¿Como seria el codigo de lcd_putc para mi programa en concreto?

Es que soy nuevo en este mundillo de la programación pero quería crearme una lampara LED para acuario a mi gusto con LEDs de Potencia.


Un saludo y muchas gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #2 en: 05 de Junio de 2015, 15:35:39 »
No te tomes a mal esto que voy a decir, es para que te des cuenta lo imposible que es para algunos foreros tratar de entender.

Sinceramente no se cual es tu problema ya que no pude entender tu explicacion.

Por otra parte se me hace IMPOSIBLE leer tu programa, 1500 lineas para buscar cual es el error es una locura y solo vos te manejas con el programa.
Para que sea mas entendible hacete librerias del DS1037 y del LCD pero fuera del archivo prinicipal, eso y realmente explicar el problema dejaria bastante mas claro para poder analizarlo y tratarlo.

Tampoco se por que te crea conflictos, y no se cuales son los errores que te da.
Por ultimo podrias hacer un proyecto con la parte del LCD y probar ahi.


EDIT: Tu problema es no poder mostrar un float en el LCD ?, tenes que buscarte un codigo conversor float a string o creo que el CCS ya provee algunos.

Tambien podes probar usar printf(funcion_envio_caracter,"%4.2f",float)
tratar si eso funciona.

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #3 en: 05 de Junio de 2015, 16:53:05 »
Vale, estoy intentando hacer una solucion


Yo tengo los pines del pic asignados asi y querria modificar los pines den la libreria para que vayan asi para que los pulsadores funcioenn bien:

//CONEXIONES DEL LCD AL PIC////////////////////////////////////////////////////
//        LCD   PIC
#define   RS    PIN_D6
#define   E     PIN_D7
#define   DB4   PIN_B0
#define   DB5   PIN_B1
#define   DB6   PIN_B2
#define   DB7   PIN_B3


Y esta es la libreria que voy a usar que es flexible


// Flex_LCD420.c

// These pins are for my Microchip PicDem2-Plus board,
// which I used to test this driver.
// An external 20x4 LCD is connected to these pins.
// Change these pins to match your own board's connections.

#define LCD_DB4   PIN_B0
#define LCD_DB5   PIN_B1
#define LCD_DB6   PIN_B2
#define LCD_DB7   PIN_B3

#define LCD_RS    PIN_D6
//#define LCD_RW    PIN_E1
#define LCD_E     PIN_D7

/*
// To prove that the driver can be used with random
// pins, I also tested it with these pins:
#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_B1
#define LCD_DB6   PIN_C5
#define LCD_DB7   PIN_B5

#define LCD_RS    PIN_E2
#define LCD_RW    PIN_B2
#define LCD_E     PIN_D6
*/

// If you want only a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.  Doing so will save one PIC
// pin, but at the cost of losing the ability to read from
// the LCD.  It also makes the write time a little longer
// because a static delay must be used, instead of polling
// the LCD's busy bit.  Normally a 6-pin interface is only
// used if you are running out of PIC pins, and you need
// to use as few as possible for the LCD.
#define USE_RW_PIN   1    


// These are the line addresses for most 4x20 LCDs.
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x40
#define LCD_LINE_3_ADDRESS 0x14
#define LCD_LINE_4_ADDRESS 0x54

// These are the line addresses for LCD's which use
// the Hitachi HD66712U controller chip.
/*
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x20
#define LCD_LINE_3_ADDRESS 0x40
#define LCD_LINE_4_ADDRESS 0x60
*/


//========================================

#define lcd_type 2   // 0=5x7, 1=5x10, 2=2 lines(or more)

int8 lcd_line;

int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2),  // Set mode: 4-bit, 2+ lines, 5x8 dots
 0xc,                     // Display on
 1,                       // Clear display
 6                        // Increment cursor
 };
                            

//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note:  !! converts an integer expression
// to a boolean (1 or 0).
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2));
 output_bit(LCD_DB6, !!(nibble & 4));  
 output_bit(LCD_DB7, !!(nibble & 8));  

 delay_cycles(1);
 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine.  For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.    

#ifdef USE_RW_PIN
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;
  
output_high(LCD_E);
delay_us(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
 
output_low(LCD_E);
delay_us(1);
  
return(retval);  
}  
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_RW_PIN
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_RW_PIN
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);
    
 delay_cycles(1);

#ifdef USE_RW_PIN
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//----------------------------

void lcd_init(void)
{
int8 i;

lcd_line = 1;

output_low(LCD_RS);

#ifdef USE_RW_PIN
output_low(LCD_RW);
#endif

output_low(LCD_E);

// Some LCDs require 15 ms minimum delay after
// power-up.  Others require 30 ms.  I'm going
// to set it to 35 ms, so it should work with
// all of them.
delay_ms(35);        

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING);
  
    // If the R/W signal is not used, then
    // the busy bit can't be polled.  One of
    // the init commands takes longer than
    // the hard-coded delay of 50 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
    #ifndef USE_RW_PIN
    delay_ms(5);
    #endif
   }

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;


switch(y)
  {
   case 1:
     address = LCD_LINE_1_ADDRESS;
     break;

   case 2:
     address = LCD_LINE_2_ADDRESS;
     break;

   case 3:
     address = LCD_LINE_3_ADDRESS;
     break;

   case 4:
     address = LCD_LINE_4_ADDRESS;
     break;

   default:
     address = LCD_LINE_1_ADDRESS;
     break;
    
  }

address += x-1;
lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':
      lcd_send_byte(0,1);
      lcd_line = 1;
      delay_ms(2);
      break;
  
    case '\n':
       lcd_gotoxy(1, ++lcd_line);
       break;
  
    case '\b':
       lcd_send_byte(0,0x10);
       break;
  
    default:
       lcd_send_byte(1,c);
       break;
   }
}

//------------------------------
#ifdef USE_RW_PIN
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(LCD_RS);

return(value);
}
#endif





No entiendo muy bien esto:

// If you want only a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.  Doing so will save one PIC
// pin, but at the cost of losing the ability to read from
// the LCD.  It also makes the write time a little longer
// because a static delay must be used, instead of polling
// the LCD's busy bit.  Normally a 6-pin interface is only
// used if you are running out of PIC pins, and you need
// to use as few as possible for the LCD.

No se si debo comentar la linea siguiente a esto o el define del pin RW del LCD, o sea esto: //#define LCD_RW    PIN_E1            que lo que he hecho es comentarlo.

Gracias por vuestra ayuda
« Última modificación: 05 de Junio de 2015, 17:05:06 por Arkaedus »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #4 en: 05 de Junio de 2015, 16:58:24 »
No podes poner el codigo ese en el foro por:

Citar
////        (C) Copyright 1996,1997 Custom Computer Services            ////
//// This source code may only be used by licensed users of the CCS C   ////
//// compiler. This source code may only be distributed to other       ////
//// licensed users of the CCS C compiler
.  No other use, reproduction  ////
//// or distribution is permitted without written permission.           ////
//// Derivative programs created using this software in object code     ////
//// form are not restricted in any way.         


Te tengo que pedir que lo quites.
Deberias poder hacerlo funcionar con la libreria de LCD del CCS, si necesitas para 4 lineas ahi si no se si lo soporta lo cual vas a tener que buscarte otro driver o midificarlo para 4 lineas.

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #5 en: 05 de Junio de 2015, 17:06:38 »
No podes poner el codigo ese en el foro por:

Citar
////        (C) Copyright 1996,1997 Custom Computer Services            ////
//// This source code may only be used by licensed users of the CCS C   ////
//// compiler. This source code may only be distributed to other       ////
//// licensed users of the CCS C compiler
.  No other use, reproduction  ////
//// or distribution is permitted without written permission.           ////
//// Derivative programs created using this software in object code     ////
//// form are not restricted in any way.         


Te tengo que pedir que lo quites.
Deberias poder hacerlo funcionar con la libreria de LCD del CCS, si necesitas para 4 lineas ahi si no se si lo soporta lo cual vas a tener que buscarte otro driver o midificarlo para 4 lineas.


Ya lo quite. Puse uno flexible pero ando en dudas sobre que debo comentar segun pregunté. Me di cuenta despues de poenrlo. Lo siento

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #6 en: 05 de Junio de 2015, 17:27:41 »
Vale ya me funciona. con este flex driver. La cuestion ahora es que si el LM35 marca 35 el LCD marca 36.00, le pondriais un -1 a la variable temp para que concuerden o lo dejariais tal cual?

Muchas gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #7 en: 05 de Junio de 2015, 17:28:01 »
// If you want only a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.  Doing so will save one PIC
// pin, but at the cost of losing the ability to read from
// the LCD.  It also makes the write time a little longer
// because a static delay must be used, instead of polling
// the LCD's busy bit.  Normally a 6-pin interface is only
// used if you are running out of PIC pins, and you need
// to use as few as possible for the LCD.
#define USE_RW_PIN   1    


Esta muy claro, Si solo deseas una interfase de 6 pines al LCD, entonces conecta el pin del LCD R/W a GND ( vss ) y comenta la linea esa que dice define USE_RW_PIN , eso hace que el PIC no pueda leer el LCD ya que estarias ocupando un pin menos, asi que no sabe cuando esta listo, en cambio usa delays para asegurarse que los datos se escribieron y esta listo para recibir otro dato mas. Eso es masomenos lo que dice.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #8 en: 05 de Junio de 2015, 17:51:34 »
Vale ya me funciona. con este flex driver. La cuestion ahora es que si el LM35 marca 35 el LCD marca 36.00, le pondriais un -1 a la variable temp para que concuerden o lo dejariais tal cual?

Muchas gracias
pon aqui como estas tratando la conversion del ADC
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Re: Problema con temperatura LM35 no la imprime el LCD
« Respuesta #9 en: 01 de Julio de 2015, 10:11:05 »
Este es el proyecto que ando haciendo:



El codigo que use para el sernsor de temperatura es este:

Código: [Seleccionar]
#include <18F8722.h>

#device *=16
#device adc=10

#use delay(clock=4000000)

#include "LCD_40X4.c"

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //No low voltage programing, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use standard_io(a)

/////////////////////////PROTOTIPOS

void control_ventiladores();


///////////////////////////////////////////////////////////////////////////////
void main()
{

 //*******************************
   setup_adc_ports(AN0);//entrada del LM35
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_COUNTERS(RTCC_internal.rtcc_div_1);//marca de divicion
   set_adc_channel(0);
 //*******************************

   output_low(pin_a1);
   output_low(pin_a2);
   output_low(pin_a3);

//Programa Principal
   while(TRUE)
   { 
      control_ventiladores();
   } 
}



///////////////////////////////////////////////////////////////////////////////
void control_ventiladores()
{
temperatura=(float)read_adc()/2;
         temper = temperatura-1.00;
         
         
      lcd_gotoxy(1,4);
      printf(lcd_putc2,"Temperatura: %.2f "temper);
      lcd_putc2((char)223); //Para poner el caracter º tambien se puede poner
      //de la siguiente manera -> printf(lcd_putc2,"\337") el caracter º
      printf(lcd_putc2,"C ");
      delay_ms(20);
   
   
   
      //***********si la temperatura es mayor que 35
      if(temperatura<=500&&temperatura>=36)
      {
      output_high(pin_a1);
      output_high(pin_a2);
      output_low(pin_a3);
     
      lcd_gotoxy(24,4);
      printf(lcd_putc2,"Ventiladores: ON ");
      delay_ms(20);
      }
     
      //****************si la temperatura es correcta o menor que 35
      else
      {
      output_low(pin_a1);
      output_low(pin_a2);
      output_high(pin_a3);
     
      lcd_gotoxy(24,4);
      printf(lcd_putc2,"Ventiladores: OFF");
      delay_ms(20);
      }
      break;

}



 Y eso es todo, con eso me imprime en el LCD la temepratura y controlo lo ventiladores a encenderlos o apagarlos con 35 grados como refrencia.



Ahora mi rpoxima meta es programar 3  PWM para los 3 canales de LEDs que ahy los azules del canal noche y los blancos calidos y blancos neutros para el dia. Pero nose  como hacerlo pues no se como hacer los calculos de los datos que tiene el DS1302 y la hora de inciio y apagado que introduzco yo en el LCD
Un saludo