TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ajrob 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(;;){}
}
-
por favor si alguien sabe hechadme una mano
-
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:
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:
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:
-
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(;;){}
}