Pasar float a unsigned int

#1
Hola a todos,

tengo un problema para mandar unos datos por la USART de mi PIC 18F67J50. Tengo una valor float que tengo que mandar al PC por la USART. Mi plan es pasar el float a unsigned int y después, con operaciones AND, poder coger los 8MSB del unsigned int y enviarlos por la USART y hacer lo mismo con los 8LSB ya que la USART sólo permite enviar valores unsigned char que ocupan 8 bits.

Creo que haciendo el paso intermedio a unsigned int no perderé tanta información. El problema es que no consigo hacer el paso a unsigned int. Uso el MPLAB y el compilador C18 y no consigo que funcione el cast que utilizo para hacerlo en esta línea de mi código:

numero_unsigned_int = (unsigned int)floor(numero_float); //la función floor devuelve un float.

Parece que el C18 no permite hacer casting. ¿Me podéis decir cómo hacer el cambio de alguna otra forma? ¿Es posible hacerlo?

Espero que me podáis ayudar. Muchas gracias por vuestra ayuda por adelantado.

Saludos
Alejos
 
Última edición:
#2
alejos: Matlab no usa la tecnica de punteros que usa C ?. Es la solucion mas sencilla para lo que quieres. Salu2.
 
#3
efectivamente necesitas usar punteros, ando un poco oxidado pero creo que seria algo asi:

Código:
unsigned char matriz[4];
unsigned char contador;
float a;
char* ptra=&a;

for (contador=0;contador<4;contador++){
    matriz[contador]=*ptra
    ptra++;
}
De entrada no estoy seguro si se puede asigar un puntero char a una variable float, pero me parece que si, tambien toma en cuenta que esta rutina no esta traduciendo de float a char, en realidad esta partiendo el flotante en 4 partes y almacena cada una en una localidad de tipo char

Si lo que quieres es traducir de float a char entonces se tendria que aplicar otro algoritmo
 
#4
Que, no se puede hacer una convercion explicita en C18.
El valor float tiene que se menor que 65536.0.
incluir stdio.h
union nuevo{
unsigned int valor_int;
unsigned char valor_envio[2];
};

//La forma es:
void main(void){
unsigned int a_1;
float b=136.23;
union nuevo numeros;
a_1=(unsigned int)b;
numeros.valor_int=a_1;
.............;//....la configuracion de usart del pic
......; //

putchar(numeros.valor_envio[1]);
putchar(numeros.valor_envio[0]);
while(1)
;
}
 
#5
no seria mas sencillo mas sencillo con sprintf..?

sprintf(uart_buffer, "%f", variable_float);
envia_PC();

eso te guardara en buffer el valor de la variable float, pero representado como un arreglo de caracteres. sprintf añade al final el terminador nulo, con lo cual la función de envio es muy sencilla, tal y como se muestra a continuación.

void envia_PC(void) {

char *p;
p = uart_buffer;

do {
putchar(*p);
p++;
}
while(*p != '\0');

}

no utilizo C18, pero en otros compiladores si es posible hacerlo asi.
 
#8
Hola, gracias por vuestras sugerencias de código, me han venido muy bien para entender algunas cosas. Efectivamente, los quiero mandar como ASCI. Hasta donde tengo entendido la USART sólo manda caracteres ASCII así que no me queda otra.

También tengo, de todas formas, algunas mejoras más en mi código ya que yo estaba equivocado. Parece ser que C18 sí acepta el casting de una variable con lo que por ese lado ya tento resuelto un problema pero me ha aparecido otro relacionado con el cambio de tipo. Mi código es el siguiente

Código:
  funcion()
 {
     int k=0;
    unsigned int suma=0;
    unsigned int resultado;

    for (k=0; k<10; k++)
    {
        suma = suma + vector[k];
    }
  
    resultado= suma/10;  //media de las 10 muestras
 }
Este código lo tengo puesto dentro de una función y no me funciona. El valor de suma es el qeu tengo que mandar por la USART pero eso, como ya os he dicho lo tengo resuelto.

Lo que he podido observar de este código es:
1- tal y como lo presento no funciona aunque el valor de resultado es un entero ya que al ser declarado como un unsigned int, la variable resultado solo contiene la parte entera de la división.
2- Si comento el for, y suma lo inicializo con un numero pequeño, la división funciona bien y obtengo el valor correcto.
3- Si el numero de suma es grande con el for comentado no obtengo un buen resultado aunque recibo algo.
4- con el for descomentado no funciona nada.
5- El valor maximo de las componentes de vector[k] no sobrepasa 1024.
6- el vector se declara como unsigned int vector[10];


¿Podéis decirme dónde esta el problema? Esto me está volviendo loco.

Muchas gracias por vuestra ayuda.
Saludos
Alejos
 
#9
alejos: La USART del PIC debiera permtir enviar tanto datos en formato Ascii como en binario. Ten en cuenta cuantos bits por dato usas (7 u 8) para hacer la reconstruccion en forma correcta al recibir el dato. Asi que puedes enviar cualquier variable partiendola en octetos (bytes) ya sea empleando punteros o instrucciones de corrimiento de bits, etc.

Sobre tu ultimo codigo, "tracea" la ejecucion del mismo (con printf o equivalente) para detectar donde está el problema. Salu2.
 
#10
Nop... la usart solo manda datos en binario....:LOL: a nosotros nos toca decidir que tipo de datos son....

La confusion viene en el tipo de variables que maneja C, usualmente cuando uno declara una variable tipo char, inherentemente piensa que solo guarda caracteres ascii, sin embargo puede almacenar cualquier valor entre 0 y 255 (8 bits) y por ejemplo si ese valor llegara a ser un 48 y lo mostramos en un display se veria como un cero por que es el equivalente ascii de ese caracter....
 
#12
Hola, gracias por vuestra ayuda. Al final he resuelto cómo enviar los datos por la USART. Mi problema ahora radica en el código de la función

Código:
funcion()
 {
     int k=0;
    unsigned int suma=0;
    unsigned int resultado;

    for (k=0; k<10; k++)
    {
        suma = suma + vector[k];
    }
  
    resultado= suma/10;  //media de las 10 muestras
 }
No me funciona el código. Si comento el "for{}", el código funciona perfectamente. Pero si pongo el "for{}" deja de funcionar. El array "vector" es unsigned int cuyas 10 componentes toman un valor de entre 0 y 1024. Yo creo que el código es correcto pero al ejecutarlo en el PIC, no funciona. Símplemente trato de hacer una suma acumulada de los valores del array "vector".

¿Véis algún problema como para que no funcione?

Espero que me podáis ayudar... Gracias

Alejos
 
Arriba