Dividir float em 4 bytes

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dividir float em 4 bytes

Mensagempor pitufos » 26 Set 2007 11:31

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);

}
}
pitufos
Bit
 
Mensagens: 12
Registrado em: 16 Out 2006 09:46
Localização: Americana - SP

Re: Dividir float em 4 bytes

Mensagempor Rodrigo_P_A » 26 Set 2007 11:53

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;
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor pitufos » 26 Set 2007 12:57

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....
pitufos
Bit
 
Mensagens: 12
Registrado em: 16 Out 2006 09:46
Localização: Americana - SP

Mensagempor ze » 26 Set 2007 14:12

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??
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Rodrigo_P_A » 26 Set 2007 15:37

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 );
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor ze » 26 Set 2007 16:49

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!!...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor pitufos » 26 Set 2007 16:57

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
pitufos
Bit
 
Mensagens: 12
Registrado em: 16 Out 2006 09:46
Localização: Americana - SP

Mensagempor Rodrigo_P_A » 26 Set 2007 17:20

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...
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor pitufos » 27 Set 2007 08:15

Virje,....
Nada funfou ate agora.... :evil: :evil:
Vou tentando aki outra alternativas.... :idea:


Valeu Rodrigo...
pitufos
Bit
 
Mensagens: 12
Registrado em: 16 Out 2006 09:46
Localização: Americana - SP

Mensagempor Rodrigo_P_A » 27 Set 2007 08:27

kra tenta usar o cast, tipo:

f=f+(float)1.00;

vai tentando, esse compilador é meio esquisito,
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor osmarcf » 27 Set 2007 08:53

osmarcf
Bit
 
Mensagens: 16
Registrado em: 05 Dez 2006 16:16
Localização: Palhoça - SC

Mensagempor Rodrigo_P_A » 27 Set 2007 08:57

O COmpilador CCS Aceita, sim, mas num entendi , acho que o problema dele é outro.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor pitufos » 27 Set 2007 15:59

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
pitufos
Bit
 
Mensagens: 12
Registrado em: 16 Out 2006 09:46
Localização: Americana - SP


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x