Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

08/06/2016 #1
Moderador

Avatar de D@rkbytes

¿Cómo asignar el valor de una variable float otra variable float?
Saludos.
Estoy realizando un programa en el cual debo incrementar y decrementar una variable tipo float.
Esto es con el fin de poder ajustar la temperatura de un sensor BMP180. (El sensor no importa.)

Por ejemplo: Si tengo 28.00 °C, necesito que ese valor se pueda ajustar en 0.01 °C hacia arriba o hacia abajo.

Tengo una variable float que contiene la temperatura que envía el sensor y otra variable float con la que debo ajustar el rango.

El problema surge al sumar el valor de la variable de ajuste a la variable de la temperatura.

Lo tengo así:
float desv_temp = 0;
float temperatura = bmp180_temp;

La variable "temperatura" tendrá el valor: 28.0
Y la variable "desv_temp" tendra el valor de incrementar o decrementar en 0.01

Para agregar el valor de "desv_temp" a "temperatura", lo hice así:
temperatura += desv_temp;

También probé con "temperatura -= desv_temp;" al decrementar y no funcionó.

Sería muy fácil así:
temperatura -= 0.01; y temperatura += 0.01;
Pero no puedo hacer esto porque tengo que asignar el valor de ajuste a la variable "temperatura" y posteriormente ser mostrado.
El valor de ajuste quedará grabado en la memoria interna del microcontrolador.

Algo no va bien al mostrar el resultado y creo que no lo estoy haciendo de la forma correcta.

Adjunto la simulación y el ensayo de prueba que estoy haciendo. (PIC C Compiler de CCS)
08/06/2016 #2

Avatar de TRILO-BYTE

el maestro preguntando eso si suena grave.

y si en lugar de usar un float se usa un entero.

2800 despues uno agrega uno el punto en donde se tenga que mostrar.
quedando 28.00

o para que no sea tan grande el numero a tratar un registro guarda los enteros 28 y otro registro guarda los puntos decimales digo si llega a .99 se incrementa otro registro

asi se puede usar solo 2 bytes.

se me hace mas razonable usar 2 bytes que 4 bytes solo en puro flotante.

digo.
08/06/2016 #3

Avatar de ruben90

Y si pruebas,
float temperatura, desv_temp, temp;
while(1) {
if(!up) desv_temp = desv_temp + 0.1;
if(!down) desv_temp = desv_temp - 0.1;
temperatura = bmp180_temp;
temp = temperatura + desv_temp;
}
Las sentencias if(!up) e if(!down) son ejemplo para los switch de ajuste.
Debes estar revisando periódicamente el valor de temperatura, porque veo que lo declaras pero debería estar dentro del bucle infinito.
09/06/2016 #4
Moderador

Avatar de D@rkbytes

TRILO-BYTE dijo: Ver Mensaje
y si en lugar de usar un float se usa un entero.

2800 después uno agrega uno el punto en donde se tenga que mostrar.
quedando 28.00

o para que no sea tan grande el numero a tratar un registro guarda los enteros 28 y otro registro guarda los puntos decimales digo si llega a .99 se incrementa otro registro

así se puede usar solo 2 bytes.

se me hace mas razonable usar 2 bytes que 4 bytes solo en puro flotante.

digo.
Si, es una forma que también pensé pero lo quise hacer directo porque posteriormente descompongo la variable "temperatura" en bytes para enviarla por RS-232.
ruben90 dijo: Ver Mensaje
Y si pruebas,
float temperatura, desv_temp, temp;
while(1) {
if(!up) desv_temp = desv_temp + 0.1;
if(!down) desv_temp = desv_temp - 0.1;
temperatura = bmp180_temp;
temp = temperatura + desv_temp;
}

Así fue como funcionó. Agregando otra variable.
No sé por qué usando una sola asignación, no funciona.
Con el agregado de la otra variable "temp", ahora ya se muestra el resultado correctamente.
Así que el problema estaba en la forma de asignación de valores.
Código PHP:
   temperatura += desv_temp;
   
lcd_gotoxy(1,2);
   
printf(lcd_putc,"Temp: %f",temperatura); 
No funciona.
Código PHP:
   temp temperatura desv_temp;
   
lcd_gotoxy(1,2);
   
printf(lcd_putc,"Temp: %f",temp); 
Funciona correctamente.

Ya que está funcionando, usaré el factor de granularidad del sensor.
ruben90 dijo: Ver Mensaje
Debes estar revisando periódicamente el valor de temperatura, porque veo que lo declaras pero debería estar dentro del bucle infinito.
Así es, la lectura del sensor está dentro del bucle principal para el monitoreo constante de la temperatura.

Muchas gracias, esto ya me estaba desesperando.


TRILO-BYTE dijo: Ver Mensaje
el maestro preguntando, eso si suena grave.
PD:
En la Comunidad, Foros de Electrónica, no nada más imparto mis conocimientos, también soy un alumno que ha aprendido bastante, gracias a la colaboración de los integrantes de éste Foro.
09/06/2016 #5

Avatar de Scooter

¿Y no va...?
Temperatura = Temperatura + Desvio_temp;

Si no va eso es que no se nada de sintaxis
Si conoces los rangos que quieres es mejor usar int o uint y poner la coma "a mano" los float ... pueden acumular errores por su uso de notación científica internamente (o como se diga)
09/06/2016 #6
Moderador

Avatar de D@rkbytes

Scooter dijo: Ver Mensaje
¿Y no va...?
Temperatura = Temperatura + Desvio_temp;
Pues no, así es como lo estaba haciendo, pero de la siguiente forma:
temperatura += desv_temp;
Que en C, es la forma simplificada de: temperatura = temperatura + desv_temp;

Pero al hacer eso, el resultado es muy diferente al esperado.
Con el agregado de otra variable, así como lo hizo Ruben, funciona correctamente.
09/06/2016 #7

Avatar de ruben90

TRILO-BYTE dijo: Ver Mensaje
y si en lugar de usar un float se usa un entero, asi se puede usar solo 2 bytes.
Puede usar esta opción, y mediante software (el receptor de la señal rs232) dividirla entre 100.
Asi solo usaria 6 bytes a diferencia de los 12 bytes con variables float.

Para 28.00 seria 2800 y 0.1 seria 10.
09/06/2016 #8

Avatar de TRILO-BYTE

pero en CCS la instruccion float usa 4 bytes.

yo una vez tube en problema en CCS que enviaba enteros int y floats por RS232

pero yo al declarar un entero mas en printf empezaba a enviar basura
nunca supe por que pero al parecer tenia derecho a usar 16 enteros y 8 flotantes uno mas enviaba basura.
11/06/2016 #9

Avatar de cosmefulanito04

Este código funciona perfectamente en C:

Código PHP:
int main()
{

    
float temperatura 28.0;
    
float desv_temp=.1;

    
temperatura+=desv_temp;

    
printf("Temperatura: %f\n"temperatura);

    return 
0;

Resultado:

Temperatura: 28.100000
11/06/2016 #10

Avatar de ruben90

cosmefulanito04 dijo: Ver Mensaje
Este código funciona perfectamente en C:

Código PHP:
int main()
{

    
float temperatura 28.0;
    
float desv_temp=.1;

    
temperatura+=desv_temp;

    
printf("Temperatura: %f\n"temperatura);

    return 
0;

Resultado:
Pero el problema vendria si se aplica un ciclo while, porque funcionaria como un contador a++.
11/06/2016 #11

Avatar de Nuyel

Y si las declaras como volatile? Luego los compiladores hacen cosas raras al "optimizar"
11/06/2016 #12

Avatar de cosmefulanito04

ruben90 dijo: Ver Mensaje
Pero el problema vendria si se aplica un ciclo while, porque funcionaria como un contador a++.
No logro entender cual es el problema.

Código PHP:
#define REPETICIONES 10

int main()
{

    
float bmp180_temp=28.0;
    
float temperatura;
    
float desv_temp=.01;
    
int cont;

    for(
cont=0cont<REPETICIONEScont++)
    {
        
desv_temp += .01;
        
temperatura bmp180_temp;
        
temperatura +=  desv_temp;

        
printf("Desvio [%d]= %.02f - Temperatura [%d]= %.02f\n"contdesv_tempconttemperatura);
    }

    return 
0;

Resultado:

Desvio [0]= 0.02 - Temperatura [0]= 28.02
Desvio [1]= 0.03 - Temperatura [1]= 28.03
Desvio [2]= 0.04 - Temperatura [2]= 28.04
Desvio [3]= 0.05 - Temperatura [3]= 28.05
Desvio [4]= 0.06 - Temperatura [4]= 28.06
Desvio [5]= 0.07 - Temperatura [5]= 28.07
Desvio [6]= 0.08 - Temperatura [6]= 28.08
Desvio [7]= 0.09 - Temperatura [7]= 28.09
Desvio [8]= 0.10 - Temperatura [8]= 28.10
Desvio [9]= 0.11 - Temperatura [9]= 28.11
11/06/2016 #13
Moderador

Avatar de D@rkbytes

cosmefulanito04 dijo: Ver Mensaje
No logro entender cual es el problema.
Así es como funciona, con el agregado de otra variable. Ese programa ya tiene 3 variables.
Yo lo estaba haciendo con dos variables. "desv_temp" y "temperatura"

Lo que no funcionó fue ésto:
temperatura = leer_bmp180_temp(); // Digamos que retornó 28.0 °C
temperatura += desv_temp; // <+- 0.01>

Con la otra variable es como funciona:
bmp180_temp = leer_bmp180_temp();
temperatura = bmp_180_temp;
temperatura += desv_temp;
11/06/2016 #14

Avatar de cosmefulanito04

Me parece que algo raro hace el compilador del CCS.

Mismo código, pero llamando a una función, el resultado es el mismo que puse arriba:

Código PHP:
#define REPETICIONES 10

float leer_bmp180_temp()
{
    return 
28.0;
}

int main()
{

    
//float bmp180_temp=28.0;
    
float temperatura;
    
float desv_temp=.01;
    
int cont;

    for(
cont=0cont<REPETICIONEScont++)
    {
        
desv_temp += .01;
        
temperatura leer_bmp180_temp();
        
temperatura +=  desv_temp;

        
printf("Desvio [%d]= %.02f - Temperatura [%d]= %.02f\n"contdesv_tempconttemperatura);
    }

    return 
0;

Incluso esta línea es igual de válida:

Código PHP:
temperatura leer_bmp180_temp() + desv_temp
Editado:

Tal vez tenés algún flag mal puesto o necesitas agregar uno para trabajar con floats. En el Avr-gcc no recuerdo que haya que agregar nada raro.

Editado 2:

Creo que sé donde puede estar el tema, asegurate que la función realmente devuelva un float y no un int, tiene toda la pinta que al usar una variable, automáticamente "castea" la variable.
11/06/2016 #15
Moderador

Avatar de D@rkbytes

cosmefulanito04 dijo: Ver Mensaje
Me parece que algo raro hace el compilador del CCS.
Si, no lo dudo, ese compilador es algo extraño en varias cosas.
cosmefulanito04 dijo: Ver Mensaje
Tal vez tenés algún flag mal puesto o necesitas agregar uno para trabajar con floats. En el Avr-gcc no recuerdo que haya que agregar nada raro.
No lo creo, no hay que agregar nada para trabajar con floats, únicamente declarar las variables.
cosmefulanito04 dijo: Ver Mensaje
Creo que sé donde puede estar el tema, asegúrate que la función realmente devuelva un float y no un int, tiene toda la pinta que al usar una variable, automáticamente "castea" la variable.
La función si retorna un float, yo hice la librería para el BMP180 porque únicamente la hay para arduino.
11/06/2016 #16

Avatar de cosmefulanito04

Más allá que lo pudiste resolver, podrías probar estas alternativas:

1- Casteo de la función:

Código PHP:
temperatura = (float)(leer_bmp180_temp()) + desv_temp
2- Pasar la variable por referencia, para evitar una devolucón en la función (suponiendo que el compilar devuelve cualquier cosa):

Código PHP:
void leer_bmp180_temp(float *variable_float)
{
    *
variable_float=28.0;
}

int main()
{

    
float bmp180_temp;
    ...
    
leer_bmp180_temp(&bmp180_temp);
    
temperatura bmp180_temp desv_temp

11/06/2016 #17
Moderador

Avatar de D@rkbytes

Si, de esas maneras el resultado será correcto aún sin referencia, porque se usan tres variables float.
La referencia solo la uso para ingresar otro tipo de variable.
La asignación directa es la que no funciona.
temperatura += desv_temp;

Así que, con el uso de otra variable, el asunto se soluciona.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.