¿Cómo asignar el valor de una variable float otra variable float?

#1
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. :confused:

Adjunto la simulación y el ensayo de prueba que estoy haciendo. (PIC C Compiler de CCS)
 

Adjuntos

#2
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.
 
#3
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.
 
Última edición:
#4
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.
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;
}
:buenpost:
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. :aplauso:
Así que el problema estaba en la forma de asignación de valores.
PHP:
   temperatura += desv_temp;
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Temp: %f",temperatura);
No funciona. (n)
PHP:
   temp = temperatura + desv_temp;
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Temp: %f",temp);
Funciona correctamente. (y)

Ya que está funcionando, usaré el factor de granularidad del sensor.
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. :apreton:


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, :estudiando: gracias a la colaboración de los integrantes de éste Foro.
 
Última edición:
#5
¿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)
 
#6
¿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.
 
#8
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.
 
#12
Pero el problema vendria si se aplica un ciclo while, porque funcionaria como un contador a++.
No logro entender cual es el problema. :confused:

PHP:
#define REPETICIONES 10

int main()
{

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

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

        printf("Desvio [%d]= %.02f - Temperatura [%d]= %.02f\n", cont, desv_temp, cont, temperatura);
    }

    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
 
#13
No logro entender cual es el problema. :confused:
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;
 
#14
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:

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=0; cont<REPETICIONES; cont++)
    {
        desv_temp += .01;
        temperatura = leer_bmp180_temp();
        temperatura +=  desv_temp;

        printf("Desvio [%d]= %.02f - Temperatura [%d]= %.02f\n", cont, desv_temp, cont, temperatura);
    }

    return 0;
}
Incluso esta línea es igual de válida:

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.
 
Última edición:
#15
Me parece que algo raro hace el compilador del CCS.
Si, no lo dudo, ese compilador es algo extraño en varias cosas.
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.
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.
 
#16
Más allá que lo pudiste resolver, podrías probar estas alternativas:

1- Casteo de la función:

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):

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; 
}
 
#17
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.
 
Arriba