Página 1 de 1

32 BIT FLOAT

MensagemEnviado: 13 Jul 2015 16:57
por daniel.sloczynski
Boa tarde.

Me deparei com a seguinte situação.

Recebo 2 WORDS de um voltimetro com o valor de tensão lido por ele.

SE o formato que ele me enviasse fosse 16BIT INTEGER, usaria esta função, certo?

Código: Selecionar todos
long MontaWord(BYTE valhi, BYTE vallo)
{
 return((valhi<<8)+vallo);
}


Até aí tudo bem...

Mas nas especificações do voltímetro diz ser em formato float 32 BITS.

Como eu poderia fazer isso em linguagem C? Com um union?


Desde já agradeço pela ajuda.

Re: 32 BIT FLOAT

MensagemEnviado: 13 Jul 2015 17:12
por ze
Com struct & union dá certo. De fato até já o fiz. Mas eis que surge o amigo xuts e me apresenta este treco surreal
Código: Selecionar todos
float _float;
unsigned char ponteiro,_byte3,_byte2,_byte1,_byte0;

ponteiro = &_float;
_byte0=*((unsigned char *)(ponteiro)+0);
_byte1=*((unsigned char *)(ponteiro)+1);
_byte2=*((unsigned char *)(ponteiro)+2);
_byte3=*((unsigned char *)(ponteiro)+3);

Na verdade copiei e adaptei dum fonte onde gravo float´s 32 bits na eeprom. Não sei se traduzi certo. Nem tente entender. Se der certo, apenas aceite e agradeça ao amigo xultes

Re: 32 BIT FLOAT

MensagemEnviado: 13 Jul 2015 17:19
por xultz
Rapaz, eu expliquei essa insanidade num post, que não lembro mais qual, e não me peça para explicar de novo, porque eu não sei mais como funciona. Esse maldito alzheimer tá acabando comigo... Se eu fosse fazer isso hoje, tentaria (finalmente) entender como funciona essa tal de union e usaria ela, sem dúvida nenhuma. Eu realmente não sinto tesão por código complicado (mas conheço uma galera que quase goza com um código parecido com esse).

Re: 32 BIT FLOAT

MensagemEnviado: 14 Jul 2015 08:40
por daniel.sloczynski
hehehe, valeu aí Ze e Xultz!


Dei só uma reestruturada e ficou assim:

Código: Selecionar todos
   float MontaFloat32(BYTE _byte1,BYTE _byte2,BYTE _byte3,BYTE _byte4)
   {

   float _float;
      
   *((BYTE *)&_float+3) = _byte1;
   *((BYTE *)&_float+2) = _byte2;
   *((BYTE *)&_float+1) = _byte3;
   *((BYTE *)&_float+0) = _byte4;

   return _float;
   }


Tá convertendo certo, mas confesso que não compreendi muito bem como funciona.

Re: 32 BIT FLOAT

MensagemEnviado: 14 Jul 2015 10:50
por ze
Voce não está sozinho amigo
Essa é minha e não tão difícil de entender. Xuts não vá gosar hein
Código: Selecionar todos
struct float_struct        //estrutura de 4 bytes do float 32 bits
{
unsigned char _byte0;
unsigned char _byte1;
unsigned char _byte2;
unsigned char _byte3;
};
union 
{
struct float_struct float_byte;  //4 bytes contidos em...
float _float;      //32 bits
} float_union; //união dos 4 bytes

#define float0 float_union._float  //float todo dividido em
#define byte0 float_union.float_byte._byte0    //4 bytes
#define byte1 float_union.float_byte._byte1
#define byte2 float_union.float_byte._byte2
#define byte3 float_union.float_byte._byte3
//...
//p.ex.
float0=9.87654321;
eepromwrite(0,byte0)
eepromwrite(1,byte1)
eepromwrite(2,byte2)
eepromwrite(3,byte3)
copiei-alterei de um fonte. não sei se confundi algo.



eu também tenho memória fraca...
..
eu também tenho memória fraca...

Re: 32 BIT FLOAT

MensagemEnviado: 14 Jul 2015 11:04
por eletroinf
Pelo que entendi o valor do multímetro vem em float... e vocês estão acessando os bytes individualmente, já tratando como int... Não teria de ter um casting no meio não?

Re: 32 BIT FLOAT

MensagemEnviado: 10 Ago 2015 08:34
por fabim
Código: Selecionar todos
unsigned char Texto[10];

 union{
 struct{
unsigned char Byte_0;
unsigned char Byte_1;
unsigned char Byte_2;
unsigned char Byte_3;
 }Byte;
 float Resu_Adc;
}Valor_Adc;

 Valor_Adc.Byte.Byte0 = Valor_Byte0_Serial;
 Valor_Adc.Byte.Byte0 = Valor_Byte1_Serial;
 Valor_Adc.Byte.Byte0 = Valor_Byte2_Serial;
 Valor_Adc.Byte.Byte0 = Valor_Byte3_Serial;

 sprintf(texto, " Valor : %0.2f", Valor_Adc.Resu_Adc);


  texto = Valor : XX.XX;


Zomenos isto ai encima.

Re: 32 BIT FLOAT

MensagemEnviado: 12 Ago 2015 10:01
por Eduardo Augusto
Já usei o mesmo trecho de código em diversas aplicações sem nem me preocupar em entender oque ele faz, somente me importando com o resultado.

Re: 32 BIT FLOAT

MensagemEnviado: 12 Ago 2015 23:57
por Djalma Toledo Rodrigues