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

Temas similares

17/01/2015 #1


Duda en código PICC con IF
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...
18/01/2015 #2

Avatar de TRILO-BYTE

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
18/01/2015 #3

Avatar de papirrin

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))
18/01/2015 #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
18/01/2015 #5

Avatar de papirrin

papirrin no puedo redondear los valores que hay despues de la coma ya que es un senso de temperatura con decimales
voy a hacer de cuenta que no dijistes eso y que quisiste decir que no quieres escribir mas caracteres o alguna otra razon
18/01/2015 #6


papirrin dijo: Ver Mensaje
voy a hacer de cuenta que no dijistes eso y que quisiste decir que no quieres escribir mas caracteres o alguna otra razon
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
18/01/2015 #7

Avatar de papirrin

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
18/01/2015 #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...
18/01/2015 #9

Avatar de papirrin

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
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.

---------- Actualizado después de 27 minutos ----------

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?
18/01/2015 #10

Avatar de JoaquinFerrero

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
18/01/2015 #11

Avatar de papirrin

nada mas para corregir un error en mi comentario, cuando dije
el | es una negacion y supongo que tu quieres un OR que es || no?
el | es una operacion bit a bit no una negacion
18/01/2015 #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...
18/01/2015 #13

Avatar de papirrin

pero que es abs?
abs es el valor absoluto de un numero con respecto a 0, en pocas palabras le quita el signo. pero no afecta a los decimales.
18/01/2015 #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?
18/01/2015 #15

Avatar de papirrin

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...

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.
18/01/2015 #16

Avatar de JoaquinFerrero

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).
19/01/2015 #17


Bien encontre que mi problema lo tengo al estar en nivel alto b3 del 18f4520 al estar en nivel alto me trae datos erroneos del sht75, alguna sugerencia?
19/01/2015 #18

Avatar de papirrin

alguna sugerencia?
si... sube el codigo completo y diagrama para que sepamos de que estas hablando.
19/01/2015 #19


son 1700 lineas, no quieres que valla agregando lo que me parezca que puede ser o que no entienda?
19/01/2015 #20

Avatar de papirrin

1700??? si cabe en el pic?

bueno, si son muchas pon lo que creas que este fallando, porque asi no me imagino que pueda ser, o por lo menos yo...
¿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.