Página 1 de 1

32 BITS to HEX.

MensagemEnviado: 19 Mar 2009 18:47
por fabim
alguem aí me ajeita uma rotininha simprinha ?
No meu caso long.. para 10 bytes.
0x + (8 char´s)

tentei fazer, mais não sei se é a porqueira do compilador ou a porqueira do programador.

fabim

MensagemEnviado: 19 Mar 2009 19:06
por tcpipchip
Divisoes sucessivas por 16 ate atingir 0.
Pegue os restos, use potencia base 16 somando...

MensagemEnviado: 19 Mar 2009 20:00
por fabim
tcpipchip escreveu:Divisoes sucessivas por 16 ate atingir 0.
Pegue os restos, use potencia base 16 somando...


Rapaz você chutou o pau da barraca eim ?
Eu ja peguei separei os nibles, 8 nibles em 8 bytes.
Se <=9 soma 0x30, se >=10 <=15 soma-se 0x41.

Só que eu acho que a porqueira do ponteiro para pic16f no mikroC não funca muito bem!!

Ele devolve valores loucos..

MensagemEnviado: 19 Mar 2009 22:16
por guest2003
Talvez algo assim Fabim

Código: Selecionar todos

u32 Numero;
u8 BIN2HEX[16] = { '0','1','2', .... ,'D','E','F' };
u8 Saida[8];

for (i=0;i<8;i++)
{
    Saida[ i ] = BIN2HEX [ (u8) Numero & 0x0F ];
    Numero>>=4;
}



Da uma olhada qquer coisa avisa...

[]'s

MensagemEnviado: 19 Mar 2009 22:23
por guest2003
ops... talvez nao fique claro...

u32 = unsigned long
u8 = unsigned char

numero>>=4 é o mesmo que numero = numero >> 4
Roda a variavel numero 4 vezes para a direita.

(u8)blalba é um cast ... operacao que informa para o compilador que voce esta fazendo uma operacao com 32bits (neste caso) e sabe que esta convertendo para 8 bits (no caso da matriz) para o compilador nao reclamar

[]'s

PS: talvez usar um const antes de definir o array... para ficar em ROM e nao em RAM
const u8 BIN2HEX ...blablabla ao inves de u8 BIN2HEX...
Da uma olhada como definir isso no seu compilador.

MensagemEnviado: 19 Mar 2009 23:03
por fabim
guest2003 escreveu:Talvez algo assim Fabim

Código: Selecionar todos

u32 Numero;
u8 BIN2HEX[16] = { '0','1','2', .... ,'D','E','F' };
u8 Saida[8];

for (i=0;i<8;i++)
{
    Saida[ i ] = BIN2HEX [ (u8) Numero & 0x0F ];
    Numero>>=4;
}



Da uma olhada qquer coisa avisa...

[]'s


tendeu sim sinho, mais tem que preencher o bufer ao contrário, sinão fica big endian hex...rsrsr

vlw, vai dar certim.. :) :twisted:

MensagemEnviado: 19 Mar 2009 23:13
por guest2003
o big ou little endian era so pra ver se voce estava prestando atenção

hheheheheeh

[]'s

PS: Preciso trocar umas ideias com vc no MSN ! ve se aparece amanha :)

MensagemEnviado: 20 Mar 2009 00:46
por barboza
Talvez esse post ajude mais um pouco.

http://www.asm51.eng.br/phpbb/viewtopic ... highlight=

MensagemEnviado: 20 Mar 2009 09:56
por fabim
long data2;
unsigned char dados_hex[8];

//*********************** pega hex de uma long******************
void pegahex(short *varlong, short *arraybytes){
short num = 4, temp=0;

arraybytes += 7;
while(num){
temp = *varlong;
temp &= 0x0f;
if(temp<=9)
temp += '0';
else
temp += 'A';
*arraybytes = temp;
arraybytes--;
temp = *varlong;
temp = (temp >> 4) & 0x0f;
if(temp<=9)
temp += '0';
else
temp += 'A';
*arraybytes = temp;
arraybytes--;
varlong++;
num--;
}
}

pegahex(&data2, &dados_hex[0]);

poisé, o mikroC esta invertendo as bolas...
* como valor
e ponteiro como endereço.
mas mesmo assim essa rotina aí não ta funcando, ele ultrapassa o F nossa saco viu..

MensagemEnviado: 20 Mar 2009 13:04
por fabim
nossa sardadi do PASCAL...

unsigned char dados_hex2[9];

//*********************** pega hex de uma long******************
void pegahex(unsigned short *varlong, char *arraybytes){
unsigned short num = 4, temp=0;

arraybytes = arraybytes + 8;
*arraybytes = '\0';// o maledito que estava socando char´s no display
arraybytes--;
while(num){
temp = *varlong;
temp &= 0x0f;
if(temp<=9)
temp = temp + '0';
else
temp = temp + ('A'-10);
*arraybytes = temp;
arraybytes--;
temp = *varlong;
temp = (temp >> 4) & 0x0f;
if(temp<=9)
temp = temp + '0';
else
temp = temp + ('A'-10);
*arraybytes = temp;
arraybytes--;
varlong++;
num--;
}
}