Página 1 de 2

Transferir o valor de uma variável para outra usando (<&l

MensagemEnviado: 06 Jan 2013 17:44
por Josivan
Bom dia a todos do Forum
Estou com uma dúvida e preciso da ajuda de vocês.
Gostaria de saber como posso rotacionar a esquerda (<<) o valor de variável 'A', de forma que ao rotacionar, seja transferido bit a bit para outra variável 'B'.

MensagemEnviado: 06 Jan 2013 19:41
por fabim
Josivan, em asm ou c ?
em c não é possivel utilizar o carry na rotação.
se for girar para esquerda.
testa o bit 15 da var a, e coloca o mesmo nivel no bit 0 da var b.
a «= 1;
b «= 1;
Até a quantidade de bits que vc quer.

Re: Transferir o valor de uma variável para outra usando (&l

MensagemEnviado: 06 Jan 2013 19:43
por EvandrPic
Qual o PIC e qual a linguagem?

Josivan escreveu:Bom dia a todos do Forum
Estou com uma dúvida e preciso da ajuda de vocês.
Gostaria de saber como posso rotacionar a esquerda (<<) o valor de variável 'A', de forma que ao rotacionar, seja transferido bit a bit para outra variável 'B'.

MensagemEnviado: 06 Jan 2013 20:23
por Josivan
Fabim obrigado pela resposta, mais a linguagem é C, o PIC a ser utilizado será PIC18F4550.

Re: Transferir o valor de uma variável para outra usando (&a

MensagemEnviado: 06 Jan 2013 20:27
por andre_luis
Josivan,


Devido á linguagem C possuir todos os recursos necessários para a implementação de operações algébricas e de controle de fluxo, não há em princípio restrição para que essa rotina seja criada.

Supondo 2 variáveis ORIGEM e DESTINO de 8 bits, tenta algo do tipo :

Código: Selecionar todos
i=QUANTIDADE_DE_DESLOCAMENTO;
while ( i ){
if ( ORIGEM && 0b1000000 ) { CARRY = 1 ; else CARRY = 0 ; }
DESTINO << 1 ;
DESTINO =| CARRY  ;
ORIGEM << 1 ;
i--;
}


Não testei isso aí na compilação, e também pode haver maneira melhor de implementar, mas fica a sugestão para testar.


+++

MensagemEnviado: 07 Jan 2013 15:28
por menegola
Se nao me falha memoria(que anda mal das pernas ultimamente) Li no livro C18 é possivel fazer algumas rotinas em ASM,voltar para C novamente

De ser algo do genero D_asm ou A_asm


Por favor me corrija se estiver errado

MensagemEnviado: 07 Jan 2013 18:01
por vtrx
Não é melhor voce dizer oque pretende fazer com os bits?
Sobre sua pergunta.
Código: Selecionar todos
 _asm
   ...
   rotina de alta precisão
   ...
 _endasm

MensagemEnviado: 08 Jan 2013 09:08
por menegola
isso mesmo vtrx

Meu neuronios estão enfaquecendo.

Obrigado vtrx

MensagemEnviado: 08 Jan 2013 09:31
por ze
Não é melhor voce dizer oque pretende fazer com os bits?

ele quer colocar os bits no c (linguagem de programação)

voce pode criar uma variável tipo bit (hitech-c) e passar por ela. se teu compilador não permitir variável bit, pode tentar com char mesmo.
static bit bt;//global
unsigned char A,B,i=8;
A=0xaa;//p.ex.
while (i--)
{
bt=A>>7;
B|=A;
A<<=1;
B<<=1;
}
não testei esta insanidade, claro
Desta vez (só desta) devo admitir que o rotate pelo carry do asm é mais eficiente.

cada mania com seu lôco. agora me diz qual seria a utilidade prática disto. o máximo que aproximo é passar pelo pino 'bt'. mas mesmo assim ...insano...sei lá. Se for o caso é melhor usar o hw da serial, i2c, spi, etc. Tá com cara de trabalho de escola... ou a m**** de vaca que voce fumou tá estragada .
abç

MensagemEnviado: 08 Jan 2013 19:30
por andre_luis
lellis escreveu:...devo admitir que o rotate pelo carry do asm é mais eficiente...

Realmente seria sim, pois como disse o fabim, a linguagem C não possui recurso nativo para manipulação do Carry.
Porém, se o programa fizesse referencia á rotinas em Assembly ( _asm , _endasm ), perderia a portabilidade.

lellis escreveu:...qual seria a utilidade prática disto...

Poderia ser usado para modelar uma fila FIFO, que é uma boa representação de uma linha de produção.


+++

MensagemEnviado: 08 Jan 2013 19:37
por vtrx
se o programa fizesse referencia á rotinas em Assembly ( _asm , _endasm ), perderia a portabilidade.

Voce considera programar em C utilizando CCS ter a portabilidade para C18 ou XC?

MensagemEnviado: 09 Jan 2013 06:29
por andre_luis
Se forem usadas pelo programador as APIs de acesso aos recursos de HW do CCS, não haverá portabilidade para outro compilador.

Se forem feitas chamadas á rotinas criadas em Assembly, aí então não haverá portabilidade sequer para outro microcontrolador.


+++

MensagemEnviado: 09 Jan 2013 16:44
por vtrx
Se forem feitas chamadas á rotinas criadas em Assembly, aí então não haverá portabilidade sequer para outro microcontrolador.

Isso vai depender do nível do programador.

MensagemEnviado: 09 Jan 2013 20:07
por andre_luis
vtrx,



Não entendi sua resposta, já que a sintaxe do Assembly de cada uC é diferente.
Acredito que o Josivan já tem o que precisa para resolver o problema citado.


+++

MensagemEnviado: 10 Jan 2013 08:19
por KrafT
Para descontrair (fiz no CCS em homenagem a um amigo meu):
Código: Selecionar todos
#include <18F452.h>
#device adc=8


union {
      int16 caraGrande;
      struct {int caraBaixo:8; int caraAlto:8;}osCaraPequeno ;
 }osCara;

#define var16bits      osCara.caraGrande
#define var8bitsAlto      osCara.osCaraPequeno.caraAlto
#define var8bitsBaixo     osCara.osCaraPequeno.caraBaixo

void main (void){
unsigned char indice;

var8bitsBaixo=1;

   for(;;){
   
   for(indice=0;indice<16;indice++){
      var16bits<<=1;

   }
   }
   }


Não sei se é elegante, mas funca. 8)