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

Temas similares

17/09/2009 #1


Pasar float a unsigned int
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
17/09/2009 #2

Avatar de tecnogirl

Respuesta: Pasar float a unsigned int
alejos: Matlab no usa la tecnica de punteros que usa C ?. Es la solucion mas sencilla para lo que quieres. Salu2.
17/09/2009 #3
Moderador

Avatar de Chico3001

Respuesta: Pasar float a unsigned int
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
17/09/2009 #4


Respuesta: Pasar float a unsigned int
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)
;
}
17/09/2009 #5


Respuesta: Pasar float a unsigned int
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.
17/09/2009 #6


Respuesta: Pasar float a unsigned int
Eso seria mandar en caracteres ASCII. Segun la pregunta no es asi.
17/09/2009 #7


Respuesta: Pasar float a unsigned int
Es cierto, pero no especifica como los quiere mandar... en ASCII seria sencillo y del otro lado puede reconvertir a float sin problemas.
18/09/2009 #8


Respuesta: Pasar float a unsigned int
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
18/09/2009 #9

Avatar de tecnogirl

Respuesta: Pasar float a unsigned int
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.
18/09/2009 #10
Moderador

Avatar de Chico3001

Respuesta: Pasar float a unsigned int
Nop... la usart solo manda datos en binario.... 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....
18/09/2009 #11

Avatar de rednaxela

Respuesta: Pasar float a unsigned int
Chico3001 dijo: Ver Mensaje
...se veria como un cero por que es el equivalente ascii de ese caracter....
claro y sería lo mismo hacer:

char c = 64 ;
int i = s;

la variable 'c' guarda '@' y la variable 'i' el número 64.

En resúmen es el programador quien decide como enviar el dato(tipo de variable), para así mismo leerlos en el receptor.
24/09/2009 #12


Respuesta: Pasar float a unsigned int
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
Respuesta
¿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.