16bits para 8bits

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

16bits para 8bits

Mensagempor Blew » 16 Dez 2009 10:12

Olá pessoal,
Alguem tem uma ideia rapida para transformar uma variavel de 16bits para 2 de 8bits em C?
Obrigado...
Blew
Bit
 
Mensagens: 46
Registrado em: 24 Out 2006 10:03

Re: 16bits para 8bits

Mensagempor fabim » 16 Dez 2009 10:15

Blew escreveu:Olá pessoal,
Alguem tem uma ideia rapida para transformar uma variavel de 16bits para 2 de 8bits em C?
Obrigado...


http://www.asm51.eng.br/phpbb/viewtopic ... ght=makros
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!!!?

Mensagempor Sergio38br » 16 Dez 2009 10:18

Código: Selecionar todos
int16_t v1;
int8_t v2;
int8_t v3;

v2 = v1 & 0xff;
v3 = (v1 >> 8);

Ajuda??

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor Blew » 16 Dez 2009 10:24

>> isso quer dizer que vc está rotacionando o byte 8 vezes?
e qual a função de &0xff?
Blew
Bit
 
Mensagens: 46
Registrado em: 24 Out 2006 10:03

Mensagempor fabim » 16 Dez 2009 10:43

#define lo(param) ((short *)&param)[0]
#define hi(param) ((short *)&param)[1]

unsigned int inteiro16;
unsigned char bytelow, bytehigh, *ponteiro;

bytelow = lo(inteiro16);
bytehigh = hi(inteiro16);

ou.

bytelow = ((short *)&inteiro16)[0];
bytehigh = ((short *)&inteiro16)[1];

ou;
ponteiro = &inteiro16;

bytelow = *ponteiro++;
bytehigh = *ponteiro;

ou:

bytelow = inteiro16%256;
bytehigh = inteiro16/256;

ou:

ou:

ou:


e por aí vai, basta escolher..

o primeiro comando usa apenas uma instrução por nible8..

abraços
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!!!?

Mensagempor msamsoniuk » 16 Dez 2009 13:35

a forma mais recomendavel seria usar um union:

union
{
char b[2];
short w;
} a;

a.w = 32767

printf("%x -> {%x,%x}\n",a.w,a.b[0],a.b[1]);


mas a forma que o fabim falou tambem eh boa, soh fazendo de uma forma diferente:

short w;
char *b = (char *)&w;

w = 32767

printf("%x -> {%x,%x}\n",w,b[0],b[1]);


pois o ponteiro com indice evita a necessidade de se ficar incrementando e decrementando *b :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor aguivone » 16 Dez 2009 21:43

eu faria assim no ccs:

int aux,aux2;
long variavel=315; //variavel de 16 bits

aux2=variavel;
aux=variavel>>8;

veja que a variavel aux2 pega os 8bits menos significativos
e a variavel aux os 8 mais significativos.

já para fazer duas de 8 e uma de 16
use a função

make16();
aguivone
Bit
 
Mensagens: 35
Registrado em: 08 Dez 2009 13:12

Mensagempor fabim » 17 Dez 2009 07:15

Aquivone, é que como diz o lellis, o CCS é usado apenas por racker´s.
Sendo assim, a maioria do pessoal que tem ant viruz, não consegue usar o CCS nem consegue abrir scripts ou fontes feitos no ccs..

Abraços
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!!!?

Mensagempor aguivone » 17 Dez 2009 16:24

acho que o modo como coloquei só depende o compilador.
aguivone
Bit
 
Mensagens: 35
Registrado em: 08 Dez 2009 13:12

Mensagempor Blew » 18 Dez 2009 13:55

valeu pelas dicas pessoal...
Blew
Bit
 
Mensagens: 46
Registrado em: 24 Out 2006 10:03


Voltar para PIC

Quem está online

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

x