Raciocionio sobre nibles.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 12:17

Meus amigos estou com um probleminha que acredito muitos já terem essa dúvida.

Como eu disse estou aprendendo C, e tô a todo vapor, dia e noite e é claro que em alguns casos como nesse em especifico, me deparei dom uma dúvida e não sei como resolver,...

É o seguinte:

Em assembler, se eu tenho uma variável chamada de "FABIN" (só para descontrair) e quero fazer a troca de nibles, faria assim:

COMF FABIM, F (nibles mais significativos trocados com nibles menos significativos).

Veja que nessa variável eu tenho 8 bits e estou fazendo o nible entre os 4 bits superiores e inferiores correto?

O meu problema esta saber como fazer isso em C, só que ao invés de uma variável de 8 bits, eu tenho um unsigned char short FABIN (que é uma váriavel que consome 2 bytes), O que eu quero é saber como trocar os nibles nessa short?

Obrigado.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor Red Neck Guy » 27 Nov 2016 12:29

Nibble é um agrupamento de 4 bits.
Acho que o que você quer é fazer a trocar entre a parte alta e baixa de um valor de 16 bits.
Você pode fazer assim:

valor = ((valor<<8)&0xFF00) | ((valor>>8)&0x00FF);

ou assim

typedef struct{
unsigned char vetor[2];
unsigned short int inteiro;
}meu_tipo;

variavel_original = 12345; // qq valor em 16 bits

meu_tipo novo;
novo.inteiro = valor_original;
novo.inteiro = novo.vetor[0]<<8 | novo.vetor[1];


ou muitas outras maneiras.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: Raciocionio sobre nibles.

Mensagempor Rodrigo_P_A » 27 Nov 2016 12:31

Em C vc num tem muita coisa que você está acostumado em assembler, manipular bit a bit é uma delas.

Você pode até criar uma struct e uma union para acessar cada bit, mas eu acho que isso consome mais do que usar um byte inteiro na sua lógica. Eu sugiro você não se preocupar com isso neste momento, e treinar o básico.

Existem compiladores que tem umas rotinas prontas para manipular BITS mas eu fujo delas, pois num é padrão.

Primeira opção: - passo a passo
char fabim,temp;
fabim=0x12;
temp=(fabim<<4); // pega a parte baixa e joga 4 bits a esquerda agora tempo = 0x20
fabim>>=4; // rotaciona 4 bits a direita agora fabim = 0x01
fabim=fabim&0x0F; // limpa os 4 bits altos para garantir que vou fazer ou somente com o que eu quero
fabim|=temp; // faço fabim = fabim OR temp = 0x01 OR 0x20 = 0x21

Segunda opção:
fabim=(fabim<<4)|(fabim>>4);
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Raciocionio sobre nibles.

Mensagempor Rodrigo_P_A » 27 Nov 2016 12:34

Pessoal me desculpem ele disse nibble, para mim 1 nibble = 4 bits.

Para trocar os bytes pode ser assim:
unsigned short fabim;
fabim=0x1234;
fabim=(fabim>>8)|(fabim<<8);
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 14:27

Boa tarde, amigos.


Parabéns, a todos vocês e muito obrigado pela grande variedade de informações,

Eu estava mesmo é querendo trocar o byte alto pelo byte baixo, mas vocês são tão gênios que acabaram indo além, agora eu sei como trocar os nibles também...

Estou muito feliz, muito obrigado e disponham também.

Obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 14:38

Surgiu outra dúvida, aqui no meu raciocínio.

unsigned char data_lsb;
unsigned char data_msb;
unsigned short fabin;

// AQUI EU TENHO A VARIÁVEL FABIN COM DOIS BYTES, OK
fabim=0x1234; // "LSB = 0x34" e "MSB = 12" (acertei)?

A PERGUNTA É COMO EU FAÇO PARA CARREGAR "FABIN" EM "DATA_LSB" e "DATA_MSB"?

Não estou conseguindo implementar o raciocinio, poderiam me ajudar mais uma vez.

Obrigado.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 14:39

Assim que eu conseguir montar o raciocinio, vou postar o código que estamos fazendo, acredito que vai ajudar a muitos do forum que como eu estão aprendendo.

Obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor Rodrigo_P_A » 27 Nov 2016 15:12

unsigned char data_lsb;
unsigned char data_msb;
unsigned short fabin;

// AQUI EU TENHO A VARIÁVEL FABIN COM DOIS BYTES, OK
fabim=0x1234; // "LSB = 0x34" e "MSB = 12" (acertei)?

data_msb=(unsigned char)(fabim>>8);
data_lsb=(unsigned char)(fabim);

// o operador cast já vai eliminar a parte alta na verdade nem precisaria dele, colocamos ele apenas que o compilador não fique dando alertas ( warning )

a linha abaixo dá o mesmo resultado, mas o compilador vai dar warning, dizendo que perdeu dados, o que neste caso, é o que vc quer.

data_lsb=fabim;

O compilador vai reclamar pois a variável de destino não comporta o valor informado, e ela vai ser truncada.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 15:33

Não estou conseguindo acertar, Rodrigo.

Veja o código escrito:

cpp code
unsigned char addr_l;
unsigned char addr_h;
unsigned char tst[4];
unsigned short adres_mem;

adres_mem = 1234; // decimal

addr_h = (unsigned char)(adres_mem >>8);
addr_l = (unsigned char)(adres_mem);

byteToStr (addr_h, test);
lcd_out (1, 1, test);
byteToStr (addr_l, test);
lcd_out (2,1, test);


Se consegui explicar direito com base no exemplo que tu deu, eu quero pegar o valor de 16 bits que esta na variavel short "adres_mem" e extrair dela seus valores LSB e MSB e carregar na variaveis pertinentes "addr_l e addr_h"...
Nessa rotina só aparece o valor "210", nada haver...

Aiaiai...minha cuca.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor eletroinf » 27 Nov 2016 17:13

Se tu está usando o Mikro C, o short dele é 8 bit, veja na página abaixo:

https://download.mikroe.com/documents/c ... _types.htm
"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: Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 20:17

Então se eu entendi, tenho que utilizar

unsigned int, tá correto...
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 20:21

Sim, sim estou utilizando o mikroc pro 6. alguma coisa...
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor Vonnilmam » 27 Nov 2016 20:33

Essa etapa deu certinho, meus amigos

O eletroinfo, tava certinho, foi uma tremenda falta de atenção.

Essa dica é muito importante, porque através dela você consegue montar um ponteiro muito eficiênte para uma memória externa i2c, no meu caso um 24lc256, tudo isso de forma aleatória, ou seja acessar qualquer endereço, como um indice, é mesma coisa se pensarmos em MATRIZES e VETORES, só que externamente.

A rotina então para extrair os dados de uma INT (2 bytes) para variáveis é o seguinte:

cpp code
unsigned int adres_mem; // CRIA UMA VARIÁVEL DE 2 BYTES.
unsigned char addr_l; // VARIÁVEL DO BYTE MENOS SIGNIFICATIVO "LSB".
unsigned char addr_h; // VARIÁVEL DO BUTE MAIS SIGNIFICATIVO "MSB".
unsigned char txt[4]; // ARRAY PARA ACOMODAR AS STRINGS, PARA VER NUM LCD.

addr_h = adres_mem; // TRANSFERE O BAYTE MSB DA VARIÁVEL ADRES_MEM.
addr_l = adres_mem >>8; // DESLOCA 8 CASAS, MOVENDO O BYTE BAIXO E ATRIBUI A VARIÁVEL.

byteToStr (addr_l, txt);
Lcd_out(2,1,txt);
byteToStr (addr_h, txt);
Lcd_out(2,4,txt);


Muito obrigado eletroinfo e a todos do forum. E perdoem minha pequena força.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Raciocionio sobre nibles.

Mensagempor tcpipchip » 28 Nov 2016 05:37

Apenas um comentario

nsigned char txt[4]; // ARRAY PARA ACOMODAR AS STRINGS, PARA VER NUM LCD.

txt deve ser de 5 bytes e nao 4

(SINAL)+BYTE/BYTE/BYTE+NULL, usando com bytetostr...senao vai invadir memoria da variavel seguinte alocada
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Raciocionio sobre nibles.

Mensagempor Red Neck Guy » 28 Nov 2016 06:52

Uma lida no livro C completo e total tiraria todas as tuas dúvidas triviais.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Próximo

Voltar para PIC

Quem está online

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

cron

x