Autor Tema: Librería SHT11 de J1M. Problema con declaración de cadenas. "Esquivado ;)"  (Leído 11019 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #15 en: 24 de Septiembre de 2007, 15:19:15 »
 :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:

Esas son las cosas que te dejan desconcertado hasta el inifinito.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #16 en: 24 de Septiembre de 2007, 16:31:30 »
... y más allá. Ayer revolví a ver la película (Toy Story) por cienésima vez. Cualquiera les dice que no a los señores del mando (lease enanos, locos pequeños, monstruitos, niños).

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #17 en: 30 de Septiembre de 2007, 18:48:45 »
Hola amigos, estoy denuevo por acá. Sigo con el mismo error, estoy haciendo pruebas con un programa donde utilizo una librería para un sensor sht71.
Lo raro, es que int const lenbuff debe ser igual o menor que 13, si se le da un valor mayor, el sensor me arroja valores erróneos.
Aunque supongo que la instrucción que está fallando es  char cadena[lenbuff];  la cual si se le pone directamente el valor en vez de lenbuff,  no debe ser mayor a 13 porque sucede lo mismo, el sensor me arroja valores fuera de rango.



Código: [Seleccionar]

#include <lcd_40x4_h.c>
#include <sht71.c>
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N)

[color=red]int const lenbuff=13;
int  xbuff=0x00;     
char rcvchar=0x00;
char cadena[lenbuff]; <----------- un valor mayor a 13 hace que el sensor arroje valores erroneos



void main()
{
  float restemp, truehumid;
 
 lcd_init1();
 lcd_init2();
 
    sht_init();
    while(1)
  {
    delay_ms(15);
    sht_rd (restemp, truehumid);
    lcd_gotoxy(1,1);
    printf(lcd_putc1, "Temp : %f %cC   ", restemp,223);
    lcd_gotoxy(1,2);
    printf(lcd_putc1, "HR   : %f %%   ", truehumid);   
 }
}


este es la libreria sht71.c

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Driver file for SHT75 Temperature & Humidity Sensor                       //
//                                                                           //
// ***** To initialise SHT75 sensor upon power up *****                      //
//                                                                           //
// Function : sht_init()                                                     //
// Return   : none                                                           //
//                                                                           //
//                                                                           //
// ***** To measure and caluculate SHT75 temp & real RH *****                //
//                                                                           //
// Function : sht_rd (temp, truehumid)                                       //
// Return   : temperature & true humidity in float values                    //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#define sht_data_pin   PIN_A1
#define sht_clk_pin    PIN_A2


//***** Function to alert SHT75 *****

void comstart (void)
{
 output_float(sht_data_pin);  //data high
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(2);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
}


//***** Function to write data to SHT75 *****

int1 comwrite (int8 iobyte)
{
 int8 i, mask = 0x80;
 int1 ack;

 //Shift out command
 delay_us(4);
 for(i=0; i<8; i++)
  {
   output_bit(sht_clk_pin, 0);                          //clk low
   if((iobyte & mask) > 0) output_float(sht_data_pin);  //data high if MSB high
   else output_bit(sht_data_pin, 0);                    //data low if MSB low
   delay_us(1);
   output_bit(sht_clk_pin, 1);                          //clk high
   delay_us(1);
   mask = mask >> 1;                                    //shift to next bit
  }

 //Shift in ack
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 ack = input(sht_data_pin);   //get ack bit
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(1);
 output_bit(sht_clk_pin, 0);  //clk low
 return(ack);
}


//***** Function to read data from SHT75 *****

int16 comread (void)
{
 int8 i;
 int16 iobyte = 0;
 const int16 mask0 = 0x0000;
 const int16 mask1 = 0x0001;

 //shift in MSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 0 bit
 output_bit(sht_data_pin, 0); //data low
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low
 delay_us(1);
 output_float(sht_data_pin);  //data high

 //shift in LSB data
 for(i=0; i<8; i++)
  {
   iobyte = iobyte << 1;
   output_bit(sht_clk_pin, 1);                //clk high
   delay_us(1);
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
   else iobyte |= mask0;
   output_bit(sht_clk_pin, 0);                //clk low
   delay_us(1);
  }

 //send ack 1 bit
 output_float(sht_data_pin);  //data high
 delay_us(1);
 output_bit(sht_clk_pin, 1);  //clk high
 delay_us(2);
 output_bit(sht_clk_pin, 0);  //clk low

 return(iobyte);
}


//***** Function to wait for SHT75 reading *****

void comwait (void)
{
 int16 sht_delay;

 output_float(sht_data_pin);                     //data high
 output_bit(sht_clk_pin, 0);                     //clk low
 delay_us(1);
 for(sht_delay=0; sht_delay<30000; sht_delay++)  // wait for max 300ms
  {
   if (!input(sht_data_pin)) break;              //if sht_data_pin low, SHT75 ready
   delay_us(10);
  }
}


//***** Function to reset SHT75 communication *****

void comreset (void)
{
 int8 i;

 output_float(sht_data_pin);    //data high
 output_bit(sht_clk_pin, 0);    //clk low
 delay_us(2);
 for(i=0; i<9; i++)
  {
   output_bit(sht_clk_pin, 1);  //toggle clk 9 times
   delay_us(2);
   output_bit(sht_clk_pin, 0);
   delay_us(2);
 }
 comstart();
}


//***** Function to soft reset SHT75 *****

void sht_soft_reset (void)
{
 comreset();           //SHT75 communication reset
 comwrite(0x1e);       //send SHT75 reset command
 delay_ms(15);         //pause 15 ms
}


//***** Function to measure SHT75 temperature *****

int16 measuretemp ()
{
 int1 ack;
 int16 iobyte;

 comstart();             //alert SHT75
 ack = comwrite(0x03);   //send measure temp command and read ack status
 if(ack == 1) return;
 comwait();              //wait for SHT75 measurement to complete
 iobyte = comread();     //read SHT75 temp data
 return(iobyte);
}


//***** Function to measure SHT75 RH *****

int16 measurehumid (void)
{
 int1 ack;
 int16 iobyte;

 comstart();            //alert SHT75
 ack = comwrite(0x05);  //send measure RH command and read ack status
 if(ack == 1) return;
 comwait();             //wait for SHT75 measurement to complete
 iobyte = comread();    //read SHT75 temp data
 return(iobyte);
}


//***** Function to calculate SHT75 temp & RH *****

void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
{
 float truehumid1, rh;

 //calculate temperature reading
 tc = ((float) temp * 0.01) - 40.0;

 //calculate Real RH reading
 rh = (float) humid;

 rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;

 //calculate True RH reading
 rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
}


//***** Function to measure & calculate SHT75 temp & RH *****

void sht_rd (float & temp, float & truehumid)
{
 int16 restemp, reshumid;
 float realhumid;
 restemp = 0; truehumid = 0;

 restemp = measuretemp();    //measure temp
 reshumid = measurehumid();  //measure RH
calculate_data (restemp, reshumid, temp, realhumid, truehumid);  //calculate temp & RH
}


//***** Function to initialise SHT75 on power-up *****

void sht_init (void)
{
 comreset();    //reset SHT75
 delay_ms(20);  //delay for power-up
}

Saludos amigos, y gracias por toda la ayuda.
« Última modificación: 30 de Septiembre de 2007, 20:05:22 por huichoman »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #18 en: 01 de Octubre de 2007, 03:43:34 »
¡Cogno! parece un problema de "solapamiento" de variables en RAM  :shock:

Hace poco he tenido uno parecido porque una rutina que leía una cadena desde la EEPROM colocaba un '\0' un byte mas allá de donde debía y sobrescribía la variable alojada en la RAM a continuación suya ....

He repasado el driver del sht71 y no parece tener nada extraño, pero ¿y el driver del lcd_40x4? ¿tendrás algún conflicto de RAM ahí? ¿Hay RAM suficiente?

Investiga un poco por ese lado y coméntanos ...  :|
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #19 en: 01 de Octubre de 2007, 09:25:32 »
Hola RedPic, gracias por la ayuda. El driver del lcd 40x4, está basado en el del flex_lcd  solo hice unos pequeños ajustes. Ahorita voy de salida a la uni, en cuanto regrese hago unas pruebas. El driver del lcd 40x4  está en este post http://www.todopic.com.ar/foros/index.php?topic=18699.0.

Saludos y gracias por todo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #20 en: 01 de Octubre de 2007, 09:45:52 »
He revisado el driver del LCD y tampoco encuentro nada que aparentemente pueda ser causa de ese error.  :shock:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #21 en: 01 de Octubre de 2007, 09:50:09 »
huichoman:

¿Puedes postear el .lst que genera el C? o por lo menos la parte del driver del sht71 que hace esto:

Código: C++
  1. void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
  2. {
  3.  float truehumid1, rh;
  4.  
  5.  //calculate temperature reading
  6.  tc = ((float) temp * 0.01) - 40.0;
  7.  
  8.  //calculate Real RH reading
  9.  rh = (float) humid;
  10.  
  11.  rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;
  12.  
  13.  //calculate True RH reading
  14.  rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
  15. }

Si es el .lst completo mejor que mejor. Es solo para comprobar que memoria RAM consume.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #22 en: 01 de Octubre de 2007, 11:25:26 »
Hola RedPic, pongo el rar con el projecto.

Saludos.


Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #23 en: 01 de Octubre de 2007, 14:25:54 »
Repasa el fichero .err e intenta quitar todos los errores. Y mira a ver eso de los return que no retornan lo que tienen que retornar, y lo que no entiendo es en el .sta por qué la función comread necesita 1280 bytes de la ram  :shock:

>>> Warning 208 "D:\HUICHOTRONICO\CAUTRIMESTRE VII\Invernadero\Simulaciones\Invernadero\sht71.c" Line 176(19,30): Function not void and does not return a value  measuretemp
>>> Warning 208 "D:\HUICHOTRONICO\CAUTRIMESTRE VII\Invernadero\Simulaciones\Invernadero\sht71.c" Line 192(20,32): Function not void and does not return a value  measurehumid
>>> Warning 203 "Invernadero2.c" Line 23(1,1): Condition always TRUE
>>> Warning 202 "D:\HUICHOTRONICO\CAUTRIMESTRE VII\Invernadero\Simulaciones\Invernadero\sht71.c" Line 210(8,18): Variable never used:   truehumid1
>>> Warning 202 "Invernadero2.c" Line 8(11,18): Variable never used:   lenbuff
>>> Warning 202 "Invernadero2.c" Line 9(6,11): Variable never used:   xbuff
>>> Warning 202 "Invernadero2.c" Line 10(6,13): Variable never used:   rcvchar
>>> Warning 202 "Invernadero2.c" Line 11(6,11): Variable never used:   cbuff
      Memory usage:   ROM=11%      RAM=2% - 6%
      0 Errors,  8 Warnings.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #24 en: 08 de Octubre de 2007, 02:07:58 »
Hola, he estado checando, y no puedo quitar los warnings. Realmente es desesperante. Creen que sea error del compilador? Me recomiendan utilizar mejor el compilador de hitech? Me he estancado en el proyecto por este problema  . Saludos y gracias por todo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #25 en: 08 de Octubre de 2007, 05:03:03 »
Me he descargado el proyecto y lo he compilado con el CSS C v. 3.242 y ...

0 Errors 0 Warnings  :shock:

ROM used: 3606 (11%)
          3606 (11%) including unused fragments

          3 Average locations per line
          15 Average locations per statement

RAM used: 30 (2%) at main() level
          97 (6%) worst case

Lines Stmts  %   Files
----- ----- ---  -----
   32    11   4  E:\Proyectos\CCS_C\Redraven\ejemplos\Invernadero\Invernadero2.c
  370     0   0  E:\Proyectos\CCS_C\Devices\18F2520.h
  446   124  48  E:\Proyectos\CCS_C\Redraven\ejemplos\Invernadero\lcd_40x4_h.c
  246   111  29  E:\Proyectos\CCS_C\Redraven\ejemplos\Invernadero\sht71.c
----- -----
 2188   492 Total

Page ROM  %  RAM  Functions:
---- --- --- ---  ----------
0     42   1   1  @delay_ms1
0     20   0   0  @const38
0     64   1   1  lcd_send_nibble1
0     64   1   1  lcd_send_nibble2
0     52   1   1  lcd_read_nibble
0     34   0   3  lcd_read_byte
0     66   1   3  lcd_send_byte1
0     66   1   3  lcd_send_byte2
0     92   1   3  lcd_init1
0     92   1   3  lcd_init2
0     78   1   4  lcd_gotoxy
0     76   1   1  lcd_putc1
0     44   1   0  comstart
0     88   1   5  comwrite
0    132   2   3  comread
0     52   1   2  comwait
0     44   1   1  comreset
0     48   1   4  measuretemp
0     48   1   4  measurehumid
0     56   1   2  @ITOF
0    244   3  11  @MULFF
0    620   9  16  @ADDFF
0     12   0   0  sht_init
0    864  12   9  main
0     34   0   0  @const10377
0     64   1   5  @FTOSD
0    124   2  13  @DIV3232
0    382   5  13  @PRINTF_L32D_392FPFPF

 Segment   Used  Free
---------  ----  ----
00000-00002     4  0
00004-07FFE  3602  29162

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #26 en: 08 de Octubre de 2007, 06:01:21 »
Los warnings aparecen cuando le pones más opciones para compilar al compilador, si no no aparecen.

De todas formas errores no aparecen y en cuanto a los warnings mira a ver si te pueden dar algún problema. Los warnings Variable never used:  son lógicos si esas variables se definen y luego no las usas en el programa.

Te importaría repetir donde estás atascado ahora? ... las neuronas las tengo de fiesta.

Un saludo


Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #27 en: 08 de Octubre de 2007, 06:05:58 »
Cierto amigo Pocher, pero los warnings que dicen que no va a retornar valores de medida me parecen mas graves ...

Function not void and does not return a value  measuretemp ...

Porque seguramente las medidas tomadas se quedaran en algún limbo electrónico.  :shock:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #28 en: 08 de Octubre de 2007, 12:10:58 »
Sí, si Diego x..actamente, a esos 2 me refería cuando dije: en cuanto a los warnings mira a ver si te pueden dar algún problema. De todas formas el problemita tiene mala leche, será dificil detectar el fallo ... yo no le acierto.

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #29 en: 08 de Marzo de 2008, 14:50:04 »
Hola amigos, reviviendo el hilo  :mrgreen:.

En conclusión el conflicto está al declarar los arreglos de caracteres. Con ciertos valores, el sensor se pone raro.

Ejemplo:

char cadena[32];    No jala
char cadena[64];    OK
char cadena[128];  OK

Así que lo dejé  en char cadena[64]  :mrgreen:.  Como ya funciona, no lo toco,  :D.

Ganbatte kudasai.

Saludos