32 BIT FLOAT

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

32 BIT FLOAT

Mensagempor daniel.sloczynski » 13 Jul 2015 16:57

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.
daniel.sloczynski
Bit
 
Mensagens: 47
Registrado em: 28 Abr 2011 09:13

Re: 32 BIT FLOAT

Mensagempor ze » 13 Jul 2015 17:12

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

Re: 32 BIT FLOAT

Mensagempor xultz » 13 Jul 2015 17:19

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).
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: 32 BIT FLOAT

Mensagempor daniel.sloczynski » 14 Jul 2015 08:40

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.
daniel.sloczynski
Bit
 
Mensagens: 47
Registrado em: 28 Abr 2011 09:13

Re: 32 BIT FLOAT

Mensagempor ze » 14 Jul 2015 10:50

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

Re: 32 BIT FLOAT

Mensagempor eletroinf » 14 Jul 2015 11:04

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?
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: 32 BIT FLOAT

Mensagempor fabim » 10 Ago 2015 08:34

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.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Re: 32 BIT FLOAT

Mensagempor Eduardo Augusto » 12 Ago 2015 10:01

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.
Não é possível dormir com todas mulheres do mundo, mas deve-se fazer o esforço.
Avatar do usuário
Eduardo Augusto
Byte
 
Mensagens: 105
Registrado em: 03 Mar 2014 08:57
Localização: São Paulo, SP

Re: 32 BIT FLOAT

Mensagempor Djalma Toledo Rodrigues » 12 Ago 2015 23:57

Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22


Voltar para PIC

Quem está online

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

x