Autor Tema: Temperatura TCN75A,RS232 Y MEMORIA EEPROM 24LC65  (Leído 1526 veces)

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

Desconectado ajrob

  • PIC10
  • *
  • Mensajes: 8
Temperatura TCN75A,RS232 Y MEMORIA EEPROM 24LC65
« en: 21 de Octubre de 2013, 08:01:28 »
Holaa muy buenas;
Mirad,estoy intentando captar la temperatura del tcn75a(sensor temperatura) y guardar sus datos en una eeprom para mas adelante pulsando una tecla mediante rs232 me extraiga todo los datos que anteriormente guardé.Me funciona correctamente el leer la temperatura del dispositivo (tcn75a) pero ahí llega el problema,cual es la razón o cual es mi error de que no almacene los datos en la eeprom y no me deje leerlos.Creo que el error puede estar en tener en el main leer tcn75 y seguidamente debajo escribir eeprom...puede ser eso?

aquí os pongo mi código:

#include <18f4550.h>//Definimos la librería del Pic.
#device adc=10 //Establecemos la conversión analógica digital a 9bits.
#FUSES  INTHS,MCLR // Definimos los Fuses
#use delay(INTERNAL=8MHZ) //El reloj interno empleado es de 4hz
#use I2C(Master, sda=PIN_B0, scl=PIN_B1)
#use rs232 (BAUD =9600 , XMIT=PIN_C6 , RCV=PIN_C7 ) //RC6= Tx


int direccion_alta=(0b00000000);
int direccion_baja=(0b00000000);
int8 sin_decimal;
int8 decimales_cero=(0);
long int i;
int enteros;
int htemp;
int ltemp;
int16 direccion=(0b00000000);


#int_rda //La interrupción RDA se habilita cuando recibe un dato via rs-232
void lectura_tempera_eprom()//

{
                           printf("temperatura:\r\n");
                           i2c_stop();
                           i2c_start();
                           delay_ms(50);
                           i2c_write(0b10100000);//direccion dispositivo
                           i2c_write(direccion_alta);// preparas direccion a leer
                           i2c_write(direccion_baja);
                           i2c_start();
                           i2c_write(0b10100001);// preparo para leer dispositivo
                           delay_ms(50);
                   
                       for(i=0;i<=255;i++) //lee desde la posición 0 a la 255
                           {                     
                           enteros=i2c_read(); //dato de la tem
                           printf("%i\r\n",enteros);
                           } 
                           
                           i2c_stop();
                           printf("Fin del Informe... presione RESET \n");
 for(;;){}
}                           
 void main()
 {
   enable_interrupts(GLOBAL);  //Habilita la interrupción global para que sea posible escribir
    enable_interrupts(INT_RDA); //Habilita la interrupción RDA cuando recibe un dato via rs-232
    delay_us(20); 
    puts("La humedad y la temperatura se estan almacenando ¿quieres leer los datos? \r \n"); //
   
    int htemp=0;                //valor alto
    int enteros=htemp;  //enteros es la variable que equivale a la temperatura
    int ltemp=decimales_cero; //valor bajo (0 decimales)
   
     i2c_start();           // Inicio la comunicación I2C
     i2c_write(0b10011110); // escribe Dirección I2C del TCN75A.
     //delay_ms(50);
     i2c_write(0b00000001); // Envío Configuración del TCN75A para ir al registro de configuración
     i2c_write(0b00000000); // Envío Configuración del TCN75A para ir al registro de temperatura
     // delay_ms(10);  //////////////////////////////////////////////////////////////////
     i2c_stop();
 
     i2c_start();           // Inicio la comunicación I2C
     i2c_write(0b10011110); // escribe Dirección I2C del TCN75A.
     delay_ms(500);
     i2c_write(0b00000000); // Envío Configuración del TCN75A para ir al registro de temperatura
     i2c_start();  // Condición de inicio repetida I2C
     i2c_write(0b10011111); // lee la dirección I2C del TCN75A.
     delay_ms(500);
     htemp=i2c_read(); //valor alto
     delay_ms(500);
     ltemp=i2c_read(); // valor bajo
     delay_ms(500);
    // i2c_stop();  //Condición de parada
 
    

////////////////////////////////////////////////////////////////////
a partir de aquí quiero escribir en la eeprom
////////////////////////////////////////////////////////////////////

 for(direccion=0;direccion<=0X7ffe;direccion=direccion+2)
{
   i2c_start();
   delay_ms(50);            //Se inicia la comunicación I2C.
   i2c_write(0b10100000);   //dirección del dispositivo y último bit 0 de escritura. 
   delay_ms(50);
   i2c_write(direccion>>8);   //escribe el valor alto en ésta dirección.
   delay_ms(50);
   i2c_write(direccion);   //escribe el valor alto en ésta dirección.
   delay_ms(50);
   i2c_write(enteros);  // escribimos el dato que queremos almacenar.(temperatura)
   delay_ms(50);
   i2c_write(decimales_cero); //escribimos un 0 para no tener decimales
   // delay_ms(10);//--->1seg
   i2c_stop(); // Finalizamos la comunicación I2C.
   }                          
                                                   
                          
 printf("Memoria FULL... \n");
 for(;;){}            
 }
« Última modificación: 24 de Octubre de 2013, 14:20:08 por ajrob »

Desconectado ajrob

  • PIC10
  • *
  • Mensajes: 8
Re: Temperatura TCN75A,RS232 Y MEMORIA EEPROM 24LC65
« Respuesta #1 en: 25 de Octubre de 2013, 11:30:01 »
por favor si alguien sabe hechadme una mano

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Temperatura TCN75A,RS232 Y MEMORIA EEPROM 24LC65
« Respuesta #2 en: 25 de Octubre de 2013, 16:31:25 »
Primero: veo que las variables htemp y ltemp son las que almacenan los datos de la temperatura registrada por el sensor solo 2 bytes.
Segundo:
Citar
int htemp=0;                //valor alto
    int enteros=htemp;  //enteros es la variable que equivale a la temperatura
    int ltemp=decimales_cero; //valor bajo (0 decimales)
Eso no es un alias, por lo que enteros valdra cero, porque htemp vale inicialmene cero, y ltemp sera igual a cero por son los valores iniciales de decimales_cero.

finalmente
en la rutina de la memoria haces un lazo de 0 a 32766 (0x7ffe)
escribes puro ceros en la eeprom  :shock:

Otra cocita en la ruina de interrupcion #int_rda
Debes enviar un  NAck en el ultimo byte leido a la memoria, sino se colgara esta asi:

Citar
for(i=0;i<=255;i++) //lee desde la posición 0 a la 255
{  
   if (i==255)
      enteros=i2c_read(0); //envio Nack a la memoria
   else
      enteros=i2c_read(1); //leo dato de la memoria y envio un ACK (el 1 es opcional)  :mrgreen:
      
    printf("%i\r\n",enteros);
}  

revisa eso   :mrgreen:
« Última modificación: 25 de Octubre de 2013, 16:48:56 por RALF2 »

Desconectado ajrob

  • PIC10
  • *
  • Mensajes: 8
Re: Temperatura TCN75A,RS232 Y MEMORIA EEPROM 24LC65
« Respuesta #3 en: 03 de Noviembre de 2013, 17:45:44 »
gracias chicos,vuestra ayuda me ha servido bastante,y una mas a ver si puede ser...

yo ahora tengo el sensor de temp y otro de humedad,y necesito guardar los datos de temperatura de la dirección 0 a la 16000 y la humedad de la 16000 a la 32000.No sé como hacer que  escriba temp y a continuación escriba humedad. porque según lo que hice,tiene que guardar 1o las 16000 primeras y después el resto,y no de forma alternativa..no se si me expliqué jeje. Hasta aquí he podido hacer..

#include <18f4550.h>//Definimos la librería del Pic.
#device adc=10 //Establecemos la conversión analógica digital a 9bits.
#FUSES  INTHS,MCLR // Definimos los Fuses
#use delay(INTERNAL=8MHZ) //El reloj interno empleado es de 4hz
#use I2C(Master, sda=PIN_B0, scl=PIN_B1)
#use rs232 (BAUD =9600 , XMIT=PIN_C6 , RCV=PIN_C7 ) //RC6= Tx
//////////////////////////////////////////////////////////////////////////////

int direccion_alta=(0b00000000);
int direccion_baja=(0b00000000);
int8 decimales_cero=(0);
int enteros;
int htemp;
int ltemp;
int16 direccion=(0b00000000);
float vout;   
float humedad;
float voltaje;
int8 sin_decimal;

#int_rda //La interrupción RDA se habilita cuando recibe un dato via rs-232
void lectura_humedad()
{
    for(direccion=0;direccion<=0X7ffe;direccion=direccion+2)
                     
                           {
             
                           i2c_stop();
                           delay_ms(50);
                           i2c_start();
                           delay_ms(50);
                           i2c_write(0b10100000);//direccion dispositivo
                           delay_ms(50);
                           i2c_write(direccion_alta);// preparas direccion a leer
                           delay_ms(50);
                           i2c_write(direccion_baja);
                           delay_ms(50);
                           i2c_start();
                           delay_ms(50);
                           i2c_write(0b10100001);// preparo para leer dispositivo
                           delay_ms(50);
                           printf("HUMEDAD:\r\n");
                           
                                       
                           sin_decimal=i2c_read(); //dato de la humedad
                         
                           printf("%i\r\n",sin_decimal);
                           //}
                                                                       
                           //i2c_stop();
   ///////////////////////////////////////////////////////////////////////////////////////////
                           i2c_stop();
                           i2c_start();
                           delay_ms(50);
                           i2c_write(0b10100000);//direccion dispositivo eeprom
                           delay_ms(50);
                           i2c_write(direccion_alta);
                           delay_ms(50);
                           i2c_write(direccion_baja);
                           delay_ms(50);
                           i2c_start();  //condicion de inicio repetida
                           delay_ms(50);
                           i2c_write(0b10100001);// preparo para leer dispositivo eeprom
                           delay_ms(50);
                         
                          printf("temperatura:\r\n");
                           
                        //  for(direccion=4000;direccion<=0X7ffe;direccion=direccion+2)
                         //  {
                            
                            
                             enteros=i2c_read(); //dato de la temperatura
                              printf("%i\r\n",enteros);
                           }
                           
                           i2c_stop();
                           

 printf("Fin del Informe... presione RESET \n");
 for(;;){}
}



                       
 void main()
 {
   enable_interrupts(INT_RDA); //Habilita la interrupción RDA cuando recibe un dato via rs-232
   enable_interrupts(GLOBAL);  //Habilita la interrupción global para que sea posible escribir
    printf(" La humedad y la temperatura se estan almacenando ¿quieres leer los datos?\r \n");
   
   
    setup_adc(ADC_CLOCK_INTERNAL); //activas el reloj inteno del conversor analogico digital 
    setup_adc_ports(AN0);          //activas el puerto analogico AN0
    set_adc_channel(0);            //activas el canal 0 analogico-digital
    delay_us(20);                  //un retardo de 20us para establecer los puertos
   
////////////////////////////////Escribe humedad eeprom//////////////////////////
 
            vout=read_adc();
            voltaje=(5*vout/1024);// ya que estamos trabajando con 10 bits
          humedad=(voltaje-0.8)/0.031;
            int sin_decimal=humedad;  //Convierto numero decimal en numero entero
            delay_ms(50);
   
        //   printf("humedad:%i %%\r\n",sin_decimal);
           
           
   for(direccion=0;direccion<=0X7ffe;direccion=direccion+2)
       {
            i2c_start();
            delay_ms(50);            //Se inicia la comunicación I2C.
            i2c_write(0b10100000);   //dirección del dispositivo y último bit 0 de escritura. 
           delay_ms(50);
           i2c_write(direccion>>8); //escribe el valor alto en ésta dirección.
            delay_ms(50);
            i2c_write(direccion);   //escribe el valor alto en ésta dirección.
            delay_ms(50);
            i2c_write(sin_decimal);  // escribimos el dato que queremos almacenar.
            delay_ms(50);
            i2c_write(decimales_cero); //escribimos un 0 para evitar un error(humedad=-1)
          delay_ms(1000);//--->1seg
            i2c_stop(); // Finalizamos la comunicación I2C.
              
    
     /////////////////////////////////////////////////////////////////////////////////////   
   
    int enteros=htemp;//valor alto = temperatura
    int ltemp=decimales_cero; //valor bajo = 0
   
       
             i2c_start();           // Inicio la comunicación I2C
              i2c_write(0b10011110); // escribe Dirección I2C del TCN75A.
              delay_ms(50);
              i2c_write(0b00000001); // Envío Configuración del TCN75A para ir al registro de configuración
              i2c_write(0b00000000); // Envío Configuración del TCN75A para ir al registro de temperatura
             delay_ms(10);  //////////////////////////////////////////////////////////////////
              i2c_stop();
     
              i2c_start();           // Inicio la comunicación I2C
              i2c_write(0b10011110); // escribe Dirección I2C del TCN75A.
              delay_ms(350);
              i2c_write(0b00000000); // Envío Configuración del TCN75A para ir al registro de temperatura
              i2c_start();  // Condición de inicio repetida I2C
              i2c_write(0b10011111); // lee la dirección I2C del TCN75A.
              delay_ms(350);
             htemp=i2c_read(); //valor alto
              delay_ms(350);
              ltemp=i2c_read(); // valor bajo
              delay_ms(350);
              i2c_stop();  //Condición de parada
 
     //printf("temperatura:%iº\r\n",enteros);
 
///////////////////////escribir tem en eeprom/////////////////////////////////
                  
               //   for(direccion=4000;direccion<=0X7ffe;direccion=direccion+2)
       //   {
               i2c_start();
               delay_ms(50);            //Se inicia la comunicación I2C.
               i2c_write(0b10100000);   //dirección del dispositivo y último bit 0 de escritura. 
               delay_ms(50);
               i2c_write(direccion>>8);   //escribe el valor alto en ésta dirección.
               i2c_write(direccion);   //escribe el valor alto en ésta dirección.
               i2c_write(enteros);  // escribimos el dato que queremos almacenar.
               i2c_write(decimales_cero); //escribimos un 0 para evitar un error(humedad=-1)
               delay_ms(500);//--->1seg
               i2c_stop(); // Finalizamos la comunicación I2C.
            
               
            }         
         
               
 printf("La memoria esta llena.. \n");
    for(;;){}
   
   
 }