Duda en código PICC con IF

#1
Hola buen dia o buenas noches, queria consultar por un codigo en picc que no alcanzo a entender ya que soy demaciado novato, el codigo es este

Código:
IF ((temperaturadecimal + 2 < restemp) | (temperaturadecimal - 2 > restemp))
        {              
         generate_tone(DO_NOTE[4],62.5);
         //delay_ms(250);
         //generate_tone(DO_NOTE[4],62.5);
         //printf(lcd_putc,"\f");
         lcd_gotoxy(1,3);
         printf(lcd_putc,"CONTROLE TEMPERATURA");           
         lcd_gotoxy(1,4);
         printf(lcd_putc,"CONTROLE TEMPERATURA");
         delay_ms(1000);
         lcd_gotoxy(1,3);
         printf(lcd_putc,"                ");            
         lcd_gotoxy(1,4);
         printf(lcd_putc,"                ");
        }
        
        else  
        output_low(pin_D0);
donde temperaturadecimal es del tipo float y restemp esta dentro de una funcion como int16 pero despues se declara como float, mi pregunta es si dentro del IF estaria todo correcto cosa que no creo...
 
#2
pues nunca se me habia ocurrido probar un if con un float

pero yo lo haria asi:

float variable1;
int16 variable2;

variable2=variable1;

if(variable2 == algo)
{
hacer algo
}


lo que haria es hacer 2 variables una flotante y una entera
antes de hacer la pregunta cargo la flotante a la entera y despues pregunto
 
#3
mi pregunta es si dentro del IF estaria todo correcto cosa que no creo...
Yo tampoco lo he probado pero no deberia haber ningun problema segun yo

un float es de 32bits, donde si mal no recuerdo 16bits son el entero y los otros 16bist son el punto flotante. asi que por intuicion va a comparar los pimeros 16bits del float con el entero de 16bits y todo OK...

haz la prueba y comenta

otra cosa que podrias hacer es redondear con el ceil o el floor de la libreria math.

IF ((ceil(temperaturadecimal) + 2 < restemp) | (ceil(temperaturadecimal) - 2 > restemp))
 
Última edición:
#4
Gracias TRILO-BYTE, yo lo aria asi

Código:
float  variable1;
int16 variable2; 
Float variableX;

variable2=variable1;
 
IF ((FloatX == variable1) | (FloatX == variable2))
{
hacer algo
}
yo no entiendo mucho pero me parece mas facil de entender, papirrin no puedo redondear los valores que hay despues de la coma ya que es un senso de temperatura con decimales
 
Última edición:
#6
:LOL::LOL::LOL:
:eek: voy a hacer de cuenta que no dijistes eso y que quisiste decir que no quieres escribir mas caracteres o alguna otra razon :LOL:
No te entendi, necesito los valos tal y como son con coma o punto flotante (Float es un tipo de dato (presente en turbo c, c++, java y otros lenguajes de programacion).
El float representa a lo que nosotros conocemos como el sistema de numeros reales y se us para definir tipos de numeros con digitos decimales. ) esa definicion no es mia.

O me querras decir por mi barbaridad de redondear los valores que hay "DESPUES DE LA COMA" jaja :LOL:
 
Última edición:
#7
amigo estas diciendo que vas a comparar un float con un entero no?

sin ser progamador de java c++ c turbo pascal, basic..

por matematicas super basica de grado del mas elemental se sabe que si al flotante le quitas los decimalesy lo haces entero y lo comparas con otro entero va a compara la parte entera.

es decir tomando el float como entero:
1.1=1 -> true
1.2=1 -> true
1.3=1 ->true
etc

si hace un ceiling...
ceil(1.1)=1 ->true
ceil(1.2)=1 ->true
ceil(1.3)=1 ->true
etc

osea que es lo mismo y que era como te sugeria trylobyte...

ahora editaste tu mensaje y tu lo que pretendes es convertir ambos en float, lo que intentas es poner 16bits en la parte alta de los 32bits de un float. y despues comparalo, si CCS es capaz de ponerlo en la parte alta, entonces es muy probable que al comparalos compare los 16bits con la parte alta del float.

por no quedarme con la duda mas de rato voy a hacer la prueba, suguramente ya lo he echo pero no me acuerdo XD
 
Última edición:
#8
haaa ya entiendo tu punto de vista, no quiero usar mas variables sentencias procedimientos funciones ni nada que ocupe mas espacio, temperaturadecimal + 2 < restemp o temperaturadecimal + 2 > restemp solo pregunta si hay una diferencia de 2 grados o unas decimas mas o menos para saber si los "calentadores" estan funcionando mal y mandar un mensaje para que el usuario tenga una idea de lo que está pasando, resumiendo no quiero agregar mas codigo solo saber porque en este if temperatura decimal me trae un valor erroneo y no se si es acá el error, entendi mal lo que me querias decir, el comentario lo edite?, no se donde, me podrias decir donde fue, tampoco pretendo comvertir los dos en float, tampoco soy programador solo un hobysta...
 
#9
haaa ya entiendo tu punto de vista, no quiero usar mas variables sentencias procedimientos funciones ni nada que ocupe mas espacio, temperaturadecimal + 2 < restemp o temperaturadecimal + 2 > restemp solo pregunta si hay una diferencia de 2 grados o unas decimas mas o menos para saber si los "calentadores" estan funcionando mal y mandar un mensaje para que el usuario tenga una idea de lo que está pasando, resumiendo no quiero agregar mas codigo solo saber porque en este if temperatura decimal me trae un valor erroneo y no se si es acá el error, entendi mal lo que me querias decir,
esa razon si me parece logica... y es muy normal que no nos expresemos o entendamos, puesto que escrito es dificil expresarse bien XD.

en el mensaje 4 cuando lo vi por primera vez no tenia el codigo que compara los floats...
y abajo dice:
Última edición por Mindfield; Hace 1 Hora a las 08:31
tampoco pretendo convertir los dos en float
:unsure: creo que me equivoque, es que en el codigo estas manejando floatX comparada con las float variable1 y variable2 pero floatX no esta especificado que tipo es y pense que era flotante.

en fin, yo insisto que no le des tantas vueltas y que consideres que el primer codigo que pusiste en el mensaje 1 si esta bien, y si no lo hace, entonces te preocupas tambien voy a hacer la prueba yo.



:LOL: creo que ya se que te esta pasando, en:

IF ((temperaturadecimal + 2 < restemp) | (temperaturadecimal - 2 > restemp))

el | es una negacion y supongo que tu quieres un OR que es || no?
 
Última edición:
#10
El operador '|' es el OR binario (en lenguaje C).

Como estamos hablando de operandos en punto flotante, creo que la expresión no es correcta. Mejor así, usando el operador OR lógico.

if ((temperaturadecimal + 2 < restemp) || (temperaturadecimal - 2 > restemp))

Ahora bien, ¿qué es lo que pretende la condición? Que se active cuando temperaturadecimal se desvíe más de 2 con respecto a restemp.

Bueno, eso se puede expresar de otra manera:

if ( abs(temperaturadecimal - restemp) > 2 )

Explicación matemática:
De la primera parte de la condición:

temperaturadecimal + 2 < restemp

temperaturadecimal - restemp < -2

- temperaturadecimal + restemp > 2

restemp - temperaturadecimal > 2

De la segunda parte de la condición:

temperaturadecimal - 2 > restemp

temperaturadecimal - restemp > 2

Con lo que tenemos que estamos buscando la diferencia entre los dos valores, y que esa diferencia es mayor que 2. Eso se expresa como

abs(temperaturadecimal - restemp) > 2
 
#12
Exelente tú respuesta, pero que es abs? como dije no soy programador y no quise poner en cuestion tu codigo papirrin y estaba por buscar info asi no metia la pata jaja ahora me voy a fijar que es abs...
 
Última edición:
#14
creo que seria algo asi para que la condicion se cumpla

if (ABS(temperaturadecimal + 2 > restemp) || ABS(temperaturadecimal - 2 < restemp))

si ven cambie mayoa a? (>) y menor a? (<) y agregue ABS estará bien?
 
#15
si ven cambie mayoa a? (>) y menor a? (<) y agregue ABS estará bien?
esta mal...

seria
if (ABS(temperaturadecimal + 2) > restemp || ABS(temperaturadecimal - 2) < restemp)
(esta mal el parentesis)

a menos que diga lo contrario joaquinferrero, yo no le veo mucho sentido al abs...:unsure:

es decir si temperaturadecimal=0

en ABS(temperaturadecimal - 2) daria un resultado de 2 sin el abs daria un resultado de 0 o -2, pero no estoy muy seguro, es que en pics los negativos y los puntos flotantes son bien extraños.
 
Última edición:
#16
El código original (el if) se activa si la diferencia entre temperaturadecimal y restemp es superior a 2, lo que es lógico, porque se trata de una serie de líneas en las que se informa al usuario, por medio de un tono y de mensajes de texto, de que debe controlar la temperatura, pues se ha superado el umbral.

Entonces, la línea

if ((temperaturadecimal + 2 < restemp) || (temperaturadecimal - 2 > restemp))

se puede expresar así:

if ( fabs(temperaturadecimal - restemp) > 2 )

La función fabs() está definida en la biblioteca stdlib.h, por lo que debes poner un

#include <stdlib.h>

al principio del programa.

La diferencia entre usar abs() y fabs() es que el primero haya el valor absoluto de su argumento, que debe ser un entero, mientras que fabs() hace lo mismo, pero su argumento debe ser un double o float, así que es justo la que debemos usar, ya que la expresión (temperaturadecimal - restemp) es flotante (es diferencia de flotantes).
 
Arriba