Autor Tema: Problema al hacer un printf con float  (Leído 4027 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Problema al hacer un printf con float
« en: 07 de Febrero de 2013, 17:25:06 »
Buenas,

Estoy haciendo una aplicación que lleva un PIC12F1840 y envía datos al PC por medio de la EUSART. Estoy usando MPLAB X con el XC8.

Envío el dato de la siguiente manera:

printf("resultado = %f", dato);


dato es un float y el problema creo que esta en el %f, si en lugar de poner un %f pongo cualquier otro como %i o % d no me da el error (claro que luego el dato no es correcto).

El error que me da al compilar es este:

Código: [Seleccionar]
:: warning: Omniscient Code Generation not available in Free mode
:0: error: can't find 0x2E words (0x2e withtotal) for psect "text418" in class "CODE" (largest unused contiguous range 0x16)
:0: error: can't find 0x29 words (0x29 withtotal) for psect "text399" in class "CODE" (largest unused contiguous range 0x16)
:0: error: can't find 0x24 words (0x24 withtotal) for psect "text407" in class "CODE" (largest unused contiguous range 0x16)
:0: error: can't find 0x1B words (0x1b withtotal) for psect "text409" in class "CODE" (largest unused contiguous range 0x16)
:0: error: can't find 0x1A words (0x1a withtotal) for psect "text406" in class "CODE" (largest unused contiguous range 0x16)

Si os fijais en el error del compilador dice "not available in Free mode". El Mplab X que uso es la versión Free de Microchip, ¿el problema es que es la versión Free? Tenía entendido que la diferencia de la versión Free es que no comprime tanto el programa al compilar como con la versión de pago.

¿A alguien le ha ocurrido esto? ¿Cual es el problema?

Gracias.
BitPIC

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema al hacer un printf con float
« Respuesta #1 en: 07 de Febrero de 2013, 18:22:47 »
Ese aviso de warning justamente está indicando que la "compresión" de código no está disponible en la versión free del compilador.

  No estoy seguro, pero parece ser que no haya suficiente memoria continua.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Problema al hacer un printf con float
« Respuesta #2 en: 07 de Febrero de 2013, 18:59:49 »
La versión que utilizo del C18 no permite imprimir floats ("%f").
¿Seguro que tu versión si lo permite?

Saludos.

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problema al hacer un printf con float
« Respuesta #3 en: 07 de Febrero de 2013, 19:16:21 »
Por lo que he estado viendo en otros foros es un problema de MPLAB X que no permite hacer un printf() con float (si me equivoco corregidme)
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problema al hacer un printf con float
« Respuesta #4 en: 07 de Febrero de 2013, 20:26:13 »
Por lo que he estado viendo en otros foros es un problema de MPLAB X que no permite hacer un printf() con float (si me equivoco corregidme)

Creo que me equivoco, acabo de ver un ejemplo donde si usan el printf() con un float ¿será mi problema el tipo de micro?  :o
BitPIC

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema al hacer un printf con float
« Respuesta #5 en: 08 de Febrero de 2013, 09:05:25 »
  Para descartar lo del micro, puedes hacer un simple programa con una variable tipo float, y en un ciclo for le asignas e imprimis (printf) los distintos valores.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problema al hacer un printf con float
« Respuesta #6 en: 08 de Febrero de 2013, 14:24:45 »
Hola AngelGris, no entiendo la prueba que me dices.

El programa tal y como lo tengo funciona. El problema lo tengo en el %f en el printf(). Si en lugar de poner %f pongo por ejemplo %i funciona, lo único que el valor que muestra no es correcto porque estoy intentando imprimir un float como si fuese un integer.

Si pongo una variable integer con un %i funciona correctamente, de echo funciona con otro tipo de variables, pero con el float es el unico que me da problemas al compilar.

Lo único que se me ocurre es hacer un programa para otro micro por ejemplo un PIC18 a ver si da el mismo problema.
« Última modificación: 08 de Febrero de 2013, 14:36:15 por bitpic »
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problema al hacer un printf con float
« Respuesta #7 en: 08 de Febrero de 2013, 14:37:35 »
Bueno lo acabo de probar con un PIC18 y tampoco me funciona

¿Alguien lo a probado y le funciona?

BitPIC

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Problema al hacer un printf con float
« Respuesta #8 en: 21 de Febrero de 2013, 19:53:23 »
En c18 no se ha implementado el poder imprimir un float ya que según he leido consume mucha memoria
Yo para poder imprimir un float con c18, tengo que meter el valor del float en un array y luego imprimirlo y así va genial. ahora no puedo poner las funciones que utilizo porque no las tengo en este pc pero desde que las tenga las subo.
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Problema al hacer un printf con float
« Respuesta #9 en: 22 de Febrero de 2013, 09:01:13 »
Hola, pues subo una función que he desarrolado, no sé si está bien hecha pero a mi me funciona.
espero les sirva.

Código: [Seleccionar]
/**********************************************
**   Funciones desarrolladas por Thulsa_Doom **
**   pasar una variable float a un           **
**   array, en la función hay un puntero     **
**   a un array que es donde se va a         **
**   guardar el dato en ASCII y una variable **
**   función que es donde se mete el valor   **
**   en float                                **
**  Este código es libre para ser distribuido**
**  y modificado siempre que se mencione     **
**  al autor                                 **
**************************************/

#define __LIBRERIA_C



//Conversión de un float en un array
void De_Float_Cadena(float valor, unsigned char *array)
{
unsigned char i=0;
    long Byte_High;
long Byte_Low;

             //Separamos el float,
Byte_High = (long)((float)valor); //el valor por encima del punto se guarda en Byte_High
Byte_Low = (long)((float)valor*100)-Byte_High*100; // el valor por debajo del punto se guarda en Byte_Low

            //Se guarda cada unidad en una posición de un array
array[i]   = (Byte_High/10); //Primero el Byte_High
array[i+1] = Byte_High-(10*array[0]);

array[i+3] = (Byte_Low/10);         //Segundo el Byte_Low
array[i+4] = Byte_Low-(10*array[i+3]);
array[i+5] = '\0'; //Finalizamos el array
i=0;
for(i=0;i<5;i++)
{
array[i]=array[i]+48; //pasamos los valores numericos a ASCII
}
array[2]=46;  //Numero para representar el caracter '.' en ASCII, colocamos el punto del float

}
« Última modificación: 22 de Febrero de 2013, 09:03:59 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Problema al hacer un printf con float
« Respuesta #10 en: 22 de Febrero de 2013, 12:40:27 »
La versión que utilizo del C18 no permite imprimir floats ("%f").
¿Seguro que tu versión si lo permite?

Saludos.

Según la documentación de XC8, si que puede imprimir floats.

XC8 compiler user's guide

Saludos.

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problema al hacer un printf con float
« Respuesta #11 en: 14 de Mayo de 2013, 14:00:23 »
Gracias Thulsa Doom, le echaré un ojo a tu funcion con array.

La versión que utilizo del C18 no permite imprimir floats ("%f").
¿Seguro que tu versión si lo permite?

Saludos.

Según la documentación de XC8, si que puede imprimir floats.

XC8 compiler user's guide

Saludos.

Piccuino, tienes razón, el manual dice que si que se puede imprimir, pero a mi me da error.

En breve tendré que utilizarlo de nuevo, ya os diré.

Saludos
BitPIC

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: Problema al hacer un printf con float
« Respuesta #12 en: 14 de Mayo de 2013, 15:42:36 »
Hola,
ese problema se debe a que el compilador no puede meter todo el código del printf necesario para poder imprimir floats, no es la primera vez que me lo he encontrado sobre todo con pics18 y pic24 con poquita memoria de programa. Tened en cuenta que la función printf tal cual esta implementada en ANSI C es muy "costosa" en cuanto a memoria.

Lo mejor es que si no dispones memoria suficiente es que cojas el valor que desees imprimir y lo multipliques 10, 100, 1000, etc (según la resolución que desees tener) y lo conviertas a entero y a partir de ahí lo imprimes en dos partes (parte entera y parte decimal), otra opción es que lo conviertas a una cadena y directamente lo muestres con printf.


Un saludo.

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problema al hacer un printf con float
« Respuesta #13 en: 02 de Junio de 2013, 06:46:12 »
Gracias Omix,

Tu explicación me ha aclarado muchas cosas

 ((:-))

Saludos
BitPIC

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Problema al hacer un printf con float
« Respuesta #14 en: 02 de Junio de 2013, 14:02:46 »
hola, ¿pero para pasarlo a cadena no hay que primero pasarlo a entero?
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...