Entrar    Registrar

CONTRIBUIÇÃO...

Software e Hardware para uC PIC

Moderadores: andre_teprom, guest2003, 51, Renie

  • Autor
    Mensagem

CONTRIBUIÇÃO...

Mensagempor Guri » 07 Ago 2018 16:17

Olá a todos,

Eu estava com um probleminha "besta" para resolver, e pesquisei aqui no forum uma solução, encontrei algumas dicas, mas um tanto complicadas.
Bom, depois de queimar os neuronios, cheguei a essa conclusão e gostaria de compartilhar com vocês, afim de ajudar quem esteja com o mesmo problema!

O problema era que eu queria "ajuntar" duas variáveis de 8 bits em uma variável de 16bits ou seja uma INT.:

cpp code
/************************************************
JUNTA DOIS NÚMEROS DE 8 BITS HEXADECIMAIS
EM UM INTEIRO DE 16BITS.
*************************************************/
unsigned char a, b;
unsigned int time, temp, temp1, temp2;

a = 0x12;
b = 0x34;
temp1 = a; // LOAD CHAR EM INT, PARTE BAIXA
temp2 = b; // LOAD CHAR EM INT, PARTE BAIXA
temp1<<=8; // TRANSPORTA PARTE BAIXA PARA ALTA
temp = temp2^temp1; // JUNTA AS DUAS INTs EM UMA SÓ
time = bcd2dec16(temp); // CONVERTE HEXA EM DECIMAL
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: CONTRIBUIÇÃO...

Mensagempor xultz » 08 Ago 2018 08:58

Eu estou usando atualmente um jeito que depois de usar umas 300 vezes meio que quase comecei a me acostumar. Eu não vi essa sintaxe em lugar nenhum, meio que inventei e fiquei ligeiramente orgulhoso com ela. Eu já estou achando ela um pouco menos que bizarra, o resultado é bem otimizado.

Código: Selecionar todos
unsigned int final;
unsigned char a = 0x12;
unsigned char b = 0x34;

((unsigned char *)&final)[0] = b;    // Copia o valor de b no byte menos significativo de final
((unsigned char *)&final)[1] = a;    // Copia o valor de a no segundo byte de final

// Final agora tem valor 0x1234
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2896
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: CONTRIBUIÇÃO...

Mensagempor B-EAGLE » 08 Ago 2018 10:35

union também é uma opção...
B-EAGLE
Word
 
Mensagens: 839
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Re: CONTRIBUIÇÃO...

Mensagempor denis » 08 Ago 2018 10:52

xultz escreveu:Eu estou usando atualmente um jeito que depois de usar umas 300 vezes meio que quase comecei a me acostumar. Eu não vi essa sintaxe em lugar nenhum, meio que inventei e fiquei ligeiramente orgulhoso com ela. Eu já estou achando ela um pouco menos que bizarra, o resultado é bem otimizado.

Código: Selecionar todos
unsigned int final;
unsigned char a = 0x12;
unsigned char b = 0x34;

((unsigned char *)&final)[0] = b;    // Copia o valor de b no byte menos significativo de final
((unsigned char *)&final)[1] = a;    // Copia o valor de a no segundo byte de final

// Final agora tem valor 0x1234


Caramba, nunca imaginei que daria pra fazer isso usando Cast.
denis
Byte
 
Mensagens: 171
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: CONTRIBUIÇÃO...

Mensagempor xultz » 08 Ago 2018 13:09

Eu também não, até que um dia decidi experimentar e funcionou...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2896
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: CONTRIBUIÇÃO...

Mensagempor milordy » 08 Ago 2018 18:27

xultz escreveu:Eu estou usando atualmente um jeito que depois de usar umas 300 vezes meio que quase comecei a me acostumar. Eu não vi essa sintaxe em lugar nenhum, meio que inventei e fiquei ligeiramente orgulhoso com ela. Eu já estou achando ela um pouco menos que bizarra, o resultado é bem otimizado.

Código: Selecionar todos
unsigned int final;
unsigned char a = 0x12;
unsigned char b = 0x34;

((unsigned char *)&final)[0] = b;    // Copia o valor de b no byte menos significativo de final
((unsigned char *)&final)[1] = a;    // Copia o valor de a no segundo byte de final

// Final agora tem valor 0x1234

Utilizo parecido,só que deixo como #define,facilita muito.
milordy
Bit
 
Mensagens: 31
Registrado em: 26 Fev 2015 12:48

Re: CONTRIBUIÇÃO...

Mensagempor Aquino » 08 Ago 2018 20:59

O codigo do Xultz eh o mais otimizado.
Eu ainda uso aquele?
temp = a<<8 | b;
"...People who are really serious about software should make their own hardware..." Alan Kay
Aquino
Dword
 
Mensagens: 1782
Registrado em: 12 Out 2006 22:24

Re: CONTRIBUIÇÃO...

Mensagempor xultz » 09 Ago 2018 08:49

Aquino, uma vez eu dei uma olhada no assembly gerado por uma instrução do tipo
Código: Selecionar todos
x = (a << 24) + (b << 16) + (c << 8) + d;

e por incrível que pareça, o assembly não fazia nenhuma instrução de rotação e soma, ele simplesmente copiava os bytes pros lugares certos (ou seja, o compilador otimizou porque entendeu qual era o objetivo). Isso num PIC faz uma diferença absurda, porque ele só tem instrução de rotate de 1 bit, então um (a << 24) teria que ser feito dentro de um loop e executar 24 vezes o rotate.
Porém, não dá prá esperar que o compilador otimize sempre, ou entenda sempre o propósito, e por incrível que pareça, hoje eu acho mais fácil de entender o que o programa faz com as instruções de cast que eu fiz.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2896
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: CONTRIBUIÇÃO...

Mensagempor denis » 09 Ago 2018 09:02

xultz escreveu:Eu também não, até que um dia decidi experimentar e funcionou...


Esta aqui foi a última aprendi:
Código: Selecionar todos

/* Protótipo da função */
int write (int fd, const void *buf, int size);

/* Aqui chamando a função, mas sem a necessidade de criar o buffer */
write(fd, &(int){0}, 1)

denis
Byte
 
Mensagens: 171
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: CONTRIBUIÇÃO...

Mensagempor tcpipchip » 09 Ago 2018 09:44

quer dizer entao que o compilador tem AI ? :)
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 5712
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: CONTRIBUIÇÃO...

Mensagempor Guri » 09 Ago 2018 13:47

Realmente, se for pensar em fazer em assembler, é bem simples fazer essa atribuição entre variáveis.

Eu demorei tantos anos para abraçar a causa da linguagem C, pois eu era Assembleiro de carteirinha, mas hoje não consigo olhar para um projeto e pensar em ASM, dá uma preguiça!...só de pensar em ficar manipulando bankos de memória, contanto paginas de alocação e outras coisas chatas...vixxi, como eu perdi tempo com assembler.

Não que assembler seja ruim, muito pela contrário, gosto muito de usa-lo, mas com limitações.

C, proporciona uma versatilidade muito grande aos trabalhos realizados, sem falar na facilidade de migração...moleza.

:mrgreen:
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: CONTRIBUIÇÃO...

Mensagempor Guri » 09 Ago 2018 13:53

Falando em assembler,

Esses dias mexendo na bagunça, vi um kit de z80 da empresa digiplan, alguém ai lembra?

Comecei a brincar com o trem, mas, Meu Deus, que doidera, só de ficar colocando bytes em linguagem de maquina, inseridos por um teclado numérico...nossa!

É torturante, imagina ter que criar uma simples aplicação, daria uma listagem monstro e tortuosa...Se bem que na época já existiam o assembladores, MSX, IBM...que quebravam um galhão...

É nostálgico, foram bons tempos.

A propósito se algum intusiasta quiser comprar esse kit eu vendo...tá novinho. 8)
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: CONTRIBUIÇÃO...

Mensagempor KrafT » 09 Set 2018 16:33

Guri escreveu:A propósito se algum intusiasta quiser comprar esse kit eu vendo...tá novinho. 8)


A propósito Guri, quanto vc espera receber pelo kit? R$ 1000, R$ 2000, R$ 5000? Conta para a gente...
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2085
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

cron