Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola a todos, llevo mucho tiempo sin escribir, aunque suelo seguir el foro, pero ya estoy muy oxidado y necesito algo de ayuda.
Veréis, quiero medir temperatura y poder guardarla en el pic o en una memoria externa si fuera necesario, pero no se que cantidad de memoria es la que necesito, o si la del pic me sirve.
Quiero usar un 16f88 con el oscilador interno, que he visto que tiene 256 bytes de memoria eeprom y un lm35.
Solo quiero hacer una medición de temperatura cada media hora durante un par de días, y que ese valor se guarde, no me hace falta ni fecha ni nada mas, solo eso, y que al desconectar la pila no pierda los datos, para después sacarlos.
¿como calculo cuanto ocuparan mis datos?¿como se sacan del pic después?
espero vuestra ayuda, gracias.
residente, no estas oxidado, estas herrumbroso.
Es fácil, si usas el convertidor interno de 10 bit del PIC cada medida "cruda" ocupará 10 bit. Guardando cada medida en una palabra de 16 bit ocupamos dos bytes por medida. Son 48 medidas por día, 96 medidas en dos días = 192 bytes.
Básicamente en 256 bytes de EEPROM te caben 128 medidas (de dos bytes) que son 64 horas.
Para leerlo puedes hacer dos cosas:
Escribir un programa para el PIC que envíe los datos de la EEPROM por el puerto serie cuando los pida el PC.
Leer la EEPROM del pic con un programador de PIC.
Yo hice uno reduciendo la lectura de 10 a 8 bits, asi evitas desperdiciar memoria o evitar complicaciones en el almacenamiento y consigues tener 256 posiciones de memoria lo que hacen mas de 5 dias (a lecturas de 30 minutos)
Aunque eso depende del rango de temperaturas y resolución que necesites, por ejemplo, para una casa, entre -5º y 45º si usas 8 bits puedes almacenar la temperatura con dos decimas de grado de resolución.... para el lm35 va sobradísimo.
furri.
Muchas gracias a los dos por las respuestas.
Para leerlo tengo el programador T20.
La hoja de características del 16f88 dice:
The PIC16F87/88 device’s 256 bytes of data EEPROM memory have the address range of 00h-FFh.
¿tendría que coger esos datos en hexadecimal?¿y luego como los convierto a un valor de temperatura?, si hago la conversión en el programa, ¿simplemente seria convertir el valor a decimal? en esto si que me pierdo.
¿Para ajustar el tiempo entre medida y media que tengo que hacerlo con la instrucción setup_adc () ? ¿o le meto un delay?
Bueno ya lo tengo casi listo, lo he simulado en proteus, y he conseguido hacer las 256 medidas y guardarlas en la eeprom, los valores que obtengo es lo que no tengo muy claro como ajustarlo para el margen de temperatura que yo quiero (-10º hasta 40º).
para 0º y 1º obtengo un 0x00, para 2º y 3º 0x01, y así sucesivamente, de dos en dos..
Espero vuestra ayuda para poder dejarlo ya finiquitado el asunto 😀
#include<16f88.h>
#device ADC = 8 //Configuracion de ADC de 8 bits
#use fast_io(A)
#use fast_io(B)
#byte port_a=5
#byte port_b=6
#FUSES NOWDT,NOPROTECT,INTRC_IO,MCLR
//No Watch Dog Timer,Code not protected from reading,Master Clear pin enabled,Internal RC Osc
#use delay(clock=4000000) //4MHz
int adc_temperatura=0x00;
int grados_temperatura=0;
int posicion=0x00;
void toma_adc(void){
// Lectura del canal 0 -> AN0 Lm35
set_adc_channel(0);
delay_ms(1);
adc_temperatura=read_adc();
delay_ms(1); //para que se estabilice
grados_temperatura =adc_temperatura;
}
void main()
{
setup_adc(ADC_CLOCK_INTERNAL); //EL TIEMPO DE MUESTREO DE LA SEÑAL ANALOGICA, EN ESTE CASO ES EL INTERNO QUE ES MAS O MENOS 19,7uS
setup_adc_ports(sAN0); //entrada 0 como analogica
port_b=0;
set_tris_b(0x00); //salidas
delay_ms(3000); //espera 3 segundos
output_b(0x01); //activa el led.
delay_ms(3000); //espera 3 segundos.
output_b(0x00); //desactiva el led.
delay_ms(1000); //espera 1 segundo.
while(posicion< 0xFF){
toma_adc();
write_eeprom(posicion,grados_temperatura); //escrible en la eeprom
posicion++;
output_b(0x01); //activa el led.
delay_ms(1000); //espera 1 segundo.
output_b(0x00); //desactiva el led.
delay_ms(1000); //Tiempo entre medida y medida.
}
}