duda con el lenguaje CCS

hola!

quiero hacer una división entre dos valores, que ha de devolver un valor con decimales. El caso es que no puedo utilizar el operador "/" ya que es de división entera. Veo en la ayuda que hay idiv pero no entiendo como va.

¿como puedo colocar esta fórmula en CCS?

// Aplico fórmula temperatura = v1 + (((valor-c1) / (c2-c1) ) * (v2-v1));

Reply to
Carmelo J. Morales Muñoz
Loading thread data ...

No entiendo muy bien tu problema, el operador / hace una división normal y corriente, si obtiene o no decimales únicamente depende de donde almacenes el valor de salida. En el ejemplo q das si "temperatura" la has definido como integer pues obtendrás un valor sin decimales, si la has definido como float pues tendrás decimales, no hay más secreto.

-- Saludos.

---------------------------------------- Quitar las XX para responder por mail.

----------------------------------------

Carmelo J. Morales Muñoz escribió:

Reply to
Robert M. L.

hola y gracias por responder, pero me temo que algo no está bien:

yo tengo:

float temperatura;

temperatura = 16 / 20;

y el resultado es 0.

cuando debería ser 0.8

¿como puedo hacer esto? "Robert M. L." escribió en el mensaje news: snipped-for-privacy@individual.net...
Reply to
Carmelo J. Morales Muñoz
¿Cómo has visto que es 0? ¿Visualizándolo por LCD? Ponme el programa completo. Es que me temo que sea algún error tonto de visualización de datos, porque tanto en C estándar como en CCS el operados / devuelve reales.

-- Saludos.

---------------------------------------- Quitar las XX para responder por mail.

----------------------------------------

Carmelo J. Morales Muñoz escribió:

Reply to
Robert M. L.

Ooooooooo que problemones le echais a los PICs.

En C, 16 y 20 son numeros enteros, 16 / 20 es una division entre enteros, y el resultado es 0.

Solo con que pongas 16.0 / 20, el compilador tendra que convertir el 20 entero a double, y realizar la divicion con decimales.

Debes vigilar el tipo de variables en las operaciones que se ejecutarán primero, en este caso (valor-c1), si uno de esos es double, ya todo el resto se irá convirtiendo a double.

Pero si por ejemplo valor,c1 y c2 son int, la division será una division entera y se perderan los decimales. Podrías hacer un cast:

temperatura = v1 + (((double)(valor-c1) / (c2-c1) ) * (v2-v1));

Así, si todas las variables son enteras, se ejecutan las restas operando con enteros (que no pierdes nada) y luego la division y la multiplicacion ya será en cama flotante.

De todas formas si vieras lo que está haciendo el compilador, no usarías varibales en punto flotante, usarías coma fija que es mucho más sencillo, y sabiendo el rango de valores que pueden tomar las variables, seguramente puedes simplificar la expresion mucho más. Por ejemplo, agrupas con paréntesis para que se ejecute la division antes que la multiplicacion, cuando seguramente haciendolo al revés tendrías mucha más precisión aún haciendolo con enteros (con double es igual, pero es que me parece una salvada usar double en un PIC).

Reply to
Nolo Pongo

Hola!

Nuevamente mil gracias por tu tiempo, te comento, creo que he encontrado el error finalmente gracias a tu insistencia en que CCS devuelve un float con la operación de división */*

Resulta que declaro tal que así:

float n1,n2,n3;

n1 = 2/3; //_> Esto da como resultado CERO depurando con mplab.

pero si en lugar de hacer la división directamente hago:

n2 = 2; n3 = 3; n1 = n2 / n3; da 0,6, que es lo correcto..

cosa curiosa donde las haya..... el numerador y denominador han de ser variables float para que el resultado sea float. ¡no tenia ni idea!.

pd: dEPUraba con el mplab, aunque compilo con CCS.

un saludo y muy agradecido por tu ayuda.

Reply to
Carmelo J. Morales Muñoz

numerador Y denominador NO, numerador O denominador SI.

Mira en cualqueir compilador de C la "promocion automática de tipos"

Reply to
Nolo Pongo
¿A q te refieres con double? Pq en CCS no existe ese tipo de variable, para los reales lo único q hay es "float", q se representa en 32 bits, todos los demás tipos son enteros.

-- Saludos.

---------------------------------------- Quitar las XX para responder por mail.

----------------------------------------

Nolo Pongo escribió:

Reply to
Robert M. L.

bueno, aplicale lo mismo al float, el double es lo mismo pero con más precision. El CSS creo que trata de ser C, no conozco css pero te puedo dedir que con cualquier compilador de C habrías tenido el mismo problema.

Reply to
Nolo Pongo

Carmelo J. Morales Mu=F1oz ha escrito:

r con

Primero de todo, el operator/ tambi=E9n sirve para divisiones reales (te han respondido ya, solo ten=EDas que poner 16.0 / 20.0).

Por otro lado, si esto viene del post anterior del ADC y si no "recuerdo" mal, trabajas con un PIC16. Este no tiene divisi=F3n (ni real ni entera) y el CSS lo implementa por software. Como hablas de temperaturas y que un grado m=E1s o menos no te importa, puedes usar un entero de 16bits y "multiplicar por 100" los valores (trabajar con "centi-centigrados"). De esta forma puedes trabajar con divisiones y multiplicaciones de enteros que son m=E1s sencillas que las reales.

Tambi=E9n supongo que los valores c1, c2, v1 y v2 son constantes. Si es as=ED, lo tienes m=E1s facil porque solo tienes que multiplicar dos valores:

#define v1 valor #define v2 valor #define c1 valor #define c2 valor #define PROPx100 ( ((v2 - v1) * 100) / (c2 - c1) )

.=2E. temperatura =3D v1 * 100 + PROP * (valor - c1); /* esta en "centi-centigrados" */

PD: dudo que sea correcto centicentigrado, =BFc=F3mo se llamar=EDa a la cent=E9sima de grado?

Reply to
heltena

umm... pues no lo sabía, yo en c programo solo C#, y esas cosas no mesuelen pasar ;)

un saludo, lo tendré en cuentra en el futuro. Aunque me sigue resultando curioso que tenga que meter un valor por pantalones en una variable float aunque sea un valor constante y conocido que no puedo poner directamente debido a esa restricción... un saludo!

Reply to
Carmelo J. Morales Muñoz

hola!

¿comoes eso de usar coma fija?......

la verdad es que no necesitaba nada mas que dos digitos decimales.

bye!

Reply to
Carmelo J. Morales Muñoz

hola!

muchas gracias!

nose me había ocurrido lo de multiplicar todo por 100, me falta imaginación ?. jjajajaja,

un saludo, ciertamente era como indicas para tomar las lecturas de ADC .

Un saludo y muchas gracias!

Reply to
Carmelo J. Morales Muñoz

Creo que "centésima de grado", al menos yo oigo todos los días hablar de "décimas de grado" y nunca de decigrados, supongo que para las centésima será lo mismo.

Reply to
Nolo Pongo

Lo correcto es "centigrado" , asi como la centesima parte del metro es "centimetro".

En la unica expresion que se utiliza es cuando se habla (mal) de "grados centigrados", que significa 'lectura en grados con precision al centigrado'.

Respecto de trabajar con un valor proporcional para no usar punto flotante, lo recomendable es usar el valor mas grande posible que no cause overflow, de manera que se minimicen los errores por redondeo. Como valor de la constante se elige lo que resulte mas comodo, se puede multiplicar por 100 (o por 1000 si no da overflow) y la lectura es 'casi' directa o por 256 u otro multiplo de 2, de manera que tanto multiplicacion como division sea un desplazamiento del registro (mas rapido).

Eduardo.

Reply to
Eduardo

Sobre lo lo que dices de 'limitacion' en el otro mensaje ... hereje ! a la hogera ! Es broma .. pero C es C.

Y sobre trabajar en coma fija, con dos decimales, en vez de poner float t = 25.35; usas int t = 2535;

siendo int de 16 bits (como se ponga en ccs, int o long, no se), tienes un rango mayor que +- 300 grados.

tu 'sabes' que tienes dos decimales, y todas las operaciones han de tenerlo en cuenta.

Si sumas dos temperaturas, que ambas usen el mismo numero de decimales (ej: 10.00 será 1000), es una suma de enteros y tienes una temperatura con el mismo numero de ceimales:

25.35 + 10.00 = 35.35; 2535 + 1000 = 3535;

Son cuatro instrucciones de código máquina trabajando con enteros, y un centenar (a ojo) haciendolo con coma flotante.

Si por casualidad tienes que multiplicar o dividir, tienes que tener en cuenta que el producto de dos numeros de dos decimales te da un numero de cuatro decimales

25.35 * 10.00 = 253.50 2535 * 1000 = 2535000 => divides por 100 y son 25350

En la division pasa al revés, por lo que puede ser necesario multiplicar por 100 el numeroador antes de dividir (así no pierdes los decimales, solo has de vigilar el overflow)

Otra alternativa, si al final los numeros han de salir por pantalla, consite en trabajar en bcd y coma fija, con lo cual la conversion a ascii es mucho más simple, y las operaciones no son mucho más complicadas (aunque dudo que las haga directamente el compilador, habría que buscar algun fuente por internés)

De todas formas si te cabe el programa en el PIC, y no resulta demasido lento, puesdes pasar de todo y usar float, pero es ques pics son tan limitados que me extraña que no se te quede pequeño a las primeras de cambio.

Reply to
Nolo Pongo

OK, gracias por la explicación tan exaustiva, meha quedado muy claro. Creo que mi mayor problema lo tengo con el lenguaje C, pero estoy en ello ;)

Respecto a la capacidad del programa.... No está finalizado aún y he ocupado un 46% de la memoria de código y un 9% de la ram. Creo que lo que me queda por codificar no llegará al 70%.

Un saludo y mil gracias por la información.

Reply to
Carmelo J. Morales Muñoz

Creo que hablar de grados centígrados no es incorrecto, y no significa "lectura en grados con precisión al centigrado", sino "grados centígrados", equivalentes a grados Celsius.

Son dos palabras de escritura casi idéntica, pero con orígenes distintos. La palabra "centígrado", como sabrás, se debe a la forma en que se obtuvo inicialmente esa escala, dividiendo en 100 partes el rango de temperaturas desde el punto de congelación hasta el de ebullición del agua.

En cualquier caso, no digo que no sea correcto, que no lo sé, pero yo jamás he visto ni oído hablar de centigrados ni decigrados, sino de centésimas de grado y décimas de grado, cuando se habla de grados centígrados o Celsius. Probablemente, aún siendo correcto, los autores lo evitan para no dar lugar a equívocos.

--


Saludos de Jose Manuel Garcia
jose.mgg@terra.es
http://213.97.130.124


"Eduardo"  escribió en el mensaje
news:1156433290.508304.269510@74g2000cwt.googlegroups.com...


Lo correcto es "centigrado" , asi como la centesima parte del metro es
"centimetro".

En la unica expresion que se utiliza es cuando se habla (mal) de
"grados centigrados", que significa 'lectura en grados con precision al
centigrado'.
Reply to
Pepitof

ados",

tos. La

Es verdad, ademas lleva acento.

am=E1s

mas de

sius.

ugar

Desde el punto de vista del idioma es correcto, son los prefijos que se agregan a la unidad (deci,centi,mili,micro,nano,pico,femto....). Con la temperatura no se acostumbra usar prefijo, no tiene mucho sentido porque el rango de variacion habitual son pocos ordenes de magnitud.

Eduardo.

Reply to
Eduardo

No te creas q son tan limitados... ¿recuerdas hace tiempo q me pasaste una página con unas fórmulas de psicrometría? Pues todas esas fórmulas pudieron ser implementadas en un 16F877 con variables float... y 16 Mhz iba sobradísimo de velocidad, tanto q tuve q ponerle rutinas de retardo para q los dígitos del LCD no variaran tan rápidamente.

-- Saludos.

---------------------------------------- Quitar las XX para responder por mail.

----------------------------------------

Nolo Pongo escribió:

Reply to
Robert M. L.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.