Página 1 de 1

Dividir float em 4 bytes

MensagemEnviado: 26 Set 2007 11:31
por pitufos
Ola pessoal,
Tenho q. enviar uma variavel tipo float pela serial.
Tentei utilizar make8.. porem não aceita float... :(
Fiz a seguinte gambi... porem o range do maledeto fica entre -2146.99x a 2147.99x. :) :)
Alguem tem alguma dica ?
Uso CCS 3.249 - PIC 18F4620.

Fonte exemplo(demonstrando o range) :

int variavel[4];

void main() {
int i;
float data=0x01;

while ( true ) {
data = data + 1;

//floattoint
for(i=0; i<4; i++) {
variavel[i] = *(&data+i);
printf("%d ",variavel[i]);
}

printf("\r\r\r");

//inttofloat
for(i=0; i<4; i++)
*(&data+i) = (variavel[i]);

printf("%f ",data);

}
}

Re: Dividir float em 4 bytes

MensagemEnviado: 26 Set 2007 11:53
por Rodrigo_P_A
float f;
char *n,d[4];
char i;
n=(char*)&f;

// pronto, acesse por n
for (i=0x00;i<0x04;i++){
printf( "%X",*n );
n++;
}

ou se quizer separadinho:

d[0x00]=*n;
n++;
d[0x01]=*n;
n++;
d[0x02]=*n;
n++;
d[0x03]=*n;

MensagemEnviado: 26 Set 2007 12:57
por pitufos
Ficou otimizado.... :lol:
Mas ainda continua na mesma... o valor maximo é 2147.99x e o minimo fica em -2146.99x.
Sera q. estou com problema no printf ou o Virtual Terminal do Proteus?

Obrigado pela ajuda Rodrigo....

MensagemEnviado: 26 Set 2007 14:12
por ze
void sendfloat(float data)
{
uchar i;
for(i=0; i<4; i++) {
printf("%x",(char)data & 0x000000ff); //zero a+ só para demonstração
data>>=8;
}
}

será que talvez pode ser que quiçá funcione provavelmente sim ou não??

MensagemEnviado: 26 Set 2007 15:37
por Rodrigo_P_A
agora que eu entendi, eu pensei que vc queria o ponteiro da variável float, para imprimir float em serial é fácil:

printf( "%f", f );

ele vai imprimir a variável float na boa

se quizer imprimir limitando as casas:

printf( "%2.4f", f );

MensagemEnviado: 26 Set 2007 16:49
por ze
legal rodrigo!
pensei que os printf tinham algumas limitações (devido às do pic). na verdade nunca os usei. sempre fiz na unha os envios para serial para o código ficar menor. vou tentar pra ver...
abrço!!...

MensagemEnviado: 26 Set 2007 16:57
por pitufos
lellis
Vc não pode usar operadores de deslocamento em variaveis de tipo ponto flutuante.


Rodrigo

Quando uso um contador simples :

f = 0x00;

while ( true ) {
f = f + 1;
printf( "%f\r\n ", f );
}

aparece isso :

0
1
2
...
2143.0000
2144.0000
2145.0000
2146.0000
2147.0000
-2146.0000
-2145.0000
-2144.0000
-2143.0000
...
0
1
2
...


Abraco


Leandro

MensagemEnviado: 26 Set 2007 17:20
por Rodrigo_P_A
kra, acho que vc deve inicializar a variável float como:

f=0.00; // formato de ponto flutuante

e segundo, o CCS é froide, num acho ele confiável, tem gente dizendo bem do MikroC dê uma olhada nele.

o printf( " %f" ) ; tem que funcionar, em relação as casas decimais, dependende do padrão usado pelo compilador etc...

MensagemEnviado: 27 Set 2007 08:15
por pitufos
Virje,....
Nada funfou ate agora.... :evil: :evil:
Vou tentando aki outra alternativas.... :idea:


Valeu Rodrigo...

MensagemEnviado: 27 Set 2007 08:27
por Rodrigo_P_A
kra tenta usar o cast, tipo:

f=f+(float)1.00;

vai tentando, esse compilador é meio esquisito,

MensagemEnviado: 27 Set 2007 08:53
por osmarcf

MensagemEnviado: 27 Set 2007 08:57
por Rodrigo_P_A
O COmpilador CCS Aceita, sim, mas num entendi , acho que o problema dele é outro.

MensagemEnviado: 27 Set 2007 15:59
por pitufos
Rodrigo...
Olha o comentario de um cara sobre algo parecido com esse assunto :

"if you want to write a float value 'into' an integer, then data will be lost.
A float, only contains 23.5 bits of information in the mantissa. If it is scaled without decimals, it allows only 1/362 of the possible range of a 32bit integer. While the integer (for example), can represent 400000001, exactly, a float can only represent, 400000000, and then 400000003 as the next possible value..."

Peguei nesse end :
http://www.ccsinfo.com/forum/viewtopic. ... 7eabf92a79


t+

Leandro