Autor Tema: eeprom y envio de datos  (Leído 2094 veces)

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

Desconectado mrgse

  • PIC10
  • *
  • Mensajes: 42
eeprom y envio de datos
« en: 29 de Mayo de 2009, 04:26:59 »
Wenas, tengo un problemilla. Con el programa siguiente:
Código: [Seleccionar]
#include "16F877.h"


#device adc=8


#use delay(clock=4000000)


#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect


#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_D6,rcv=PIN_D7,enable=PIN_D5)


#define use_portb_lcd TRUE

#include "lcd.c"
#include <ds1302.c>
#include <24515.c>
#include <external_eeprom.c>


#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3

void borrat_lcd()
   {
   lcd_gotoxy(1,1);
   printf(lcd_putc,"                ",);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"                ",);
   }

float mediana(int canal)
   {
   float medida[5],mediana;
   set_adc_channel(canal);
   delay_ms(400);
   medida[0]=read_adc();
   delay_ms(200);
   medida[1]=read_adc();
   delay_ms(200);
   medida[2]=read_adc();
   delay_ms(200);
   medida[3]=read_adc();
   delay_ms(200);
   medida[4]=read_adc();
   delay_ms(200);
   mediana=(medida[0]+medida[1]+medida[2]+medida[3]+medida[4])/5;
   return mediana;
   }

void main(void)
   {
   

   float temperatura, temperatura2, tension, intensidad, irradiancia, dada;
   int dir=0, dir2=0, min=0,sec=0,hr=0;
   char string[7];


   setup_adc_ports(AN0_AN1_AN2_AN4_AN5_VSS_VREF);

   setup_adc(ADC_CLOCK_INTERNAL);


   lcd_init();
   init_ext_eeprom();
   rtc_init();


   while (true)
     {
     
borrat_lcd();
     
       rtc_get_time(hr,min,sec);
       delay_ms(250);
         
       
       temperatura=mediana(0)/4.63;

       temperatura2=mediana(1)/4.63;   

       tension=mediana(4)/2.55;

       intensidad=(256-mediana(2))/10.24;

       irradiancia=(((256-mediana(5))/10.24)*1000)/5.29;


       write_ext_eeprom(dir,hr);
       dir=dir+1;
       write_ext_eeprom(dir,min);
       dir=dir+1;
       write_ext_eeprom(dir,sec);
       dir=dir+1;
       write_float_ext_eeprom(dir,temperatura);
       dir=dir+4;
       write_float_ext_eeprom(dir,temperatura2);
       dir=dir+4;
       write_float_ext_eeprom(dir,tension);
       dir=dir+4;
       write_float_ext_eeprom(dir,intensidad);
       dir=dir+4;
       write_float_ext_eeprom(dir,irradiancia);
       dir=dir+4;
       
   borrat_lcd();

       lcd_gotoxy(1,2);
       printf(lcd_putc," ENVIANDO DATOS",);


   printf("h");

               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+1;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");
 
 
               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+1;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");


               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+1;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");


   printf("a");
               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+4;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");

   printf("t1_real");
               sprintf(string,"%03.2f",temperatura);
               printf("%s",string);
   printf(" ");
                     

   printf("m");
               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+4;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");

   printf("t2_real");
               sprintf(string,"%03.2f",temperatura2);
               printf("%s",string);
   printf(" ");
       

   printf("V");
               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+4;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");

   printf("tensio_real");
               sprintf(string,"%03.2f",tension);
               printf("%s",string);
   printf(" ");
               

   printf("I");
               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+4;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");

   printf("int_real");
               sprintf(string,"%03.2f",intensidad);
               printf("%s",string);
   printf(" ");
               

   printf("i");
               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+4;
               sprintf(string,"%03.2f",dada);
               printf("%s",string); 
   printf(" ");             
               
   printf("irr_real");
               sprintf(string,"%03.2f",irradiancia);
               printf("%s",string);
   printf(" ");
               
            printf("E");

delay_ms(2000);
            borrat_lcd();

     } 
  }

guardo unas medidas en la eeprom, y las envio de la eeprom al PC. Para comprobar que el envio es correcto, envio tambien la variable directamente. En el PC recibo esto:

h23.00 11.00 13.00 a0.00 t1_real55.07 m132.00 t2_real55.07 V0.00 tensio_real0.00 I123.00 int_real0.09 i131.00 irr_real18.46 E

La hora se envia correctamente. Todo lo demas no. Me temo que sea porque guardo mal los floats, o los leo mal. Alguien puede ayudarme??

GRACIAS


Desconectado mrgse

  • PIC10
  • *
  • Mensajes: 42
Re: eeprom y envio de datos
« Respuesta #1 en: 29 de Mayo de 2009, 05:39:17 »
He probado sustituyendo
Código: [Seleccionar]
printf("h");

               dada=read_float_ext_eeprom(dir2);
   delay_ms(200);
               dir2=dir2+1;
               sprintf(string,"%03.2f",dada);
               printf("%s",string);
   printf(" ");

por
Código: [Seleccionar]
printf("h");

               dada=read_float_ext_eeprom(dir2);
delay_ms(200);
               dir2=dir2+1;
               printf("%f",dada);
printf(" ");

y todo sigue igual...

Desconectado mrgse

  • PIC10
  • *
  • Mensajes: 42
Re: eeprom y envio de datos
« Respuesta #2 en: 29 de Mayo de 2009, 06:15:09 »
Hola de nuevo. Estoy seguro que el error ocurre debido al guardar datos en la eeprom i leerlos, solo en el caso de que sean float.
- He probado la libreria floatee.c en vez de la de external_eeprom.c
- He probado guardar la temperatura tal qual se lee, sin dividir entre 10.24, y tampoco funciona correctamente.
- No es error de posicionamiento de los datos, ya que si realizo varias mediciones, las guardo, y las leo, la hora siempre sale correcta, en la primera medida, la segunda, etc. Por tanto, es cuestion de como se guardan los floats en la eeprom, o de como se leen.

Desconectado mrgse

  • PIC10
  • *
  • Mensajes: 42
Re: eeprom y envio de datos
« Respuesta #3 en: 29 de Mayo de 2009, 16:30:13 »
Nadie puede ayudarme??

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: eeprom y envio de datos
« Respuesta #4 en: 29 de Mayo de 2009, 17:38:39 »
Hola deberias poner que compilador y que version estas usando, si es el CCS alguna vez lei que algunas versiones graban/leian mal un float, si buscas en el foro vas a encontrar forma de resolverlo ( si ese es el problema ), otra cosa que puedes hacer es tratar al float como un arreglo de 4 bytes y grabar de esa manera, nose especificamente la funcion que graba un chorro de byte pero deberia ser asi:
Código: C
  1. read_buffer_ext_eeprom( dir, ( int8 * ) &temperatura, sizeof( float ));
  2. write_buffer_ext_eeprom( dir, ( int8 * ) &temperatura, sizeof( float ));

La idea es primero encontrar el nombre de la funcion que lee/escribe un buffer, y despues casteas el float en cuestion a int8 o byte y le pasas la direccion, el sizeof determina cuantos bytes tiene el float normalmente son 4.
No programo PICs ni uso sus compiladores, solo te doy una mano.

Saludos !





Desconectado mrgse

  • PIC10
  • *
  • Mensajes: 42
Re: eeprom y envio de datos
« Respuesta #5 en: 30 de Mayo de 2009, 15:46:42 »
Uso el CCS 4.023

Desconectado mrgse

  • PIC10
  • *
  • Mensajes: 42
Re: eeprom y envio de datos
« Respuesta #6 en: 02 de Junio de 2009, 03:17:51 »
OK, he descargado una nueva version de CCS y parece que ya funciona correctamente, más o menos. Porque más o menos, porque sigue haciendo algunas cosas que no entiendo, incomprensibles. Esto es lo que recibo:

Medidas a las 23.00 12.00 23.00:
h23.00 12.00 23.00 a0.00 t1_real55.07 m55.00 t2_real55.07 V0.00 tensio_real0.00 I0.09 int_real0.09 i18.37 irr_real18.46 E

Medidas a las 23.00 12.00 38.00:
h23.00 0.00 4.00 a0.00 t1_real55.07 m55.00 t2_real55.07 V0.00 tensio_real0.00 I0.09 int_real0.09 i0.00 irr_real18.46 E

Medidas a las 23.00 12.00 52.00:
h23.00 4.00 52.00 a55.07 t1_real55.07 m55.07 t2_real55.07 V0.00 tensio_real0.00 I0.09 int_real0.09 i18.46 irr_real18.46 E

Medidas a las 23.00 13.00 7.00:
h23.00 13.00 7.00 a55.07 t1_real55.07 m55.07 t2_real55.07 V0.00 tensio_real0.00 I0.00 int_real0.09 i18.46 irr_real18.46 E

Medidas a las 23.00 13.00 21.00:
h23.00 13.00 21.00 a55.07 t1_real55.07 m55.07 t2_real55.07 V0.00 tensio_real0.00 I0.00 int_real0.09 i18.46 irr_real18.46 E

Medidas a las 23.00 13.00 35.00:
h23.00 13.00 35.00 a55.07 t1_real55.07 m55.07 t2_real55.07 V0.00 tensio_real0.00 I0.00 int_real0.09 i18.46 irr_real18.46 E

Ahora modificaré el progrmaa para que no me de decimales en el tiempo, pero como veis, lo que pasa no se entiende:
- En la primera medida me da bien todo excepto la temperatura 1 (a), k deberia ser como t1_real
- En la segunda medida me da mal la hora, la temperatura1(a) i la irradiancia.
- En la tercera medida me da mal la hora i todo lo demàs me lo da bien.
- A partir de ahi todo es correcto.

Alguna ayuda porfavor...
« Última modificación: 02 de Junio de 2009, 04:29:35 por mrgse »

Desconectado mrgse

  • PIC10
  • *
  • Mensajes: 42
Re: eeprom y envio de datos
« Respuesta #7 en: 02 de Junio de 2009, 05:15:57 »
Bueno comento para quien interese, he resuelto el problema empezando a guardar en la posición 50 en vez de en la 0. No se porque, pero si empiezo en la 0 ocurre eso. Si empiezo en la 50 todo correcto.


 

anything