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.
Heli, gracias de nuevo, me estas ayudando muchísimo, la verdad que a parte de las salidas y entradas analógicas del pic no había trabajado con ningún otro recurso de los que tiene, y ahora me doy cuenta de la potencia que tiene el pic.
beamspot está muy bien ese documento, muy completo, quiero mirarlo a fondo y probar también con la NTC mas adelante, gracias por compartir esa información.
Bueno, he añadido la parte del código para el comparador de voltaje, pero use las variables(grados_temperatura y adc_temperatura) en:
int y grados_temperatura = (250 * adc_temperatura)/51;
o float y grados_temperatura = (1.25 * adc_temperatura)/255; solo obtengo ceros, no se que está pasando ahora.
En la captura se puede ver que los primeros datos están a cero, los que tienen valor, es de pruebas anteriores.
Un saludo
¿Alguien me puede echar una manilla con el ultimo problema para poder dejarlo terminado?
Gracias.
Un saludo.
Hola!
Pueden ser varias cosas; lo primero que tienes que comprobar es que adc_temperatura no sea cero. Es decir comprueba que se le asigna el valor correspondiente. Solo tienes que añadirle un "watch" para ver si su valor es siempre 0 o cambia durante la ejecución, y eso se puede hacer en Proteus.
También es posible que tengas un problema de "casting implicito". Hablo un poco de memoria. El problema es que estás realizando la operación con datos de dos tipos, int y float. Cuando hacemos una operación, el resultado solo puede ser de un tipo. Si en una asignación a=b, a es int y b es float, el resultado es que a se queda con la parte entera de b. Si es una operacion como a=10/4, donde a es un float el resultado es que a va a valer 2 en lugar de 2,5 que sería lo lógico. Esto es por que 10/4 es una división entera (el resultado es un entero) por que los operandos son constantes enteras, y la división entera de 10/4 es 2, no 2,5. Otro gallo te cantará si haces 10.0/2.0 (constantes reales); entonces si que te va a dar 2,5.
En el código que pones, el divisor de los cocientes es una constante entera, y puede ser que el compilador interprete que la operación es de este tipo dando un resultado inesperado. La teoria dice que el casting implicito (paso de un tipo de dato a otro para hacer la operación) se hace de forma que no se pierda información, pero no te puedes fiar.
Aunque si fuese el caso deberia darte un valor truncado, no cero, por lo que inclino más por que el valor de la variable no se actualiza.
Salu2!