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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor Josivan » 06 Jan 2013 17:44

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'.
Francisco Josivan
Avatar do usuário
Josivan
Bit
 
Mensagens: 21
Registrado em: 11 Out 2006 23:45

Mensagempor fabim » 06 Jan 2013 19:41

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.
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!!!?

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

Mensagempor EvandrPic » 06 Jan 2013 19:43

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'.
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor Josivan » 06 Jan 2013 20:23

Fabim obrigado pela resposta, mais a linguagem é C, o PIC a ser utilizado será PIC18F4550.
Editado pela última vez por Josivan em 06 Jan 2013 20:54, em um total de 2 vezes.
Francisco Josivan
Avatar do usuário
Josivan
Bit
 
Mensagens: 21
Registrado em: 11 Out 2006 23:45

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

Mensagempor andre_luis » 06 Jan 2013 20:27

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor menegola » 07 Jan 2013 15:28

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
menegola
Word
 
Mensagens: 683
Registrado em: 08 Dez 2008 12:11

Mensagempor vtrx » 07 Jan 2013 18:01

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
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor menegola » 08 Jan 2013 09:08

isso mesmo vtrx

Meu neuronios estão enfaquecendo.

Obrigado vtrx
menegola
Word
 
Mensagens: 683
Registrado em: 08 Dez 2008 12:11

Mensagempor ze » 08 Jan 2013 09:31

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor andre_luis » 08 Jan 2013 19:30

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor vtrx » 08 Jan 2013 19:37

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?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor andre_luis » 09 Jan 2013 06:29

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor vtrx » 09 Jan 2013 16:44

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor andre_luis » 09 Jan 2013 20:07

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor KrafT » 10 Jan 2013 08:19

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)
"..."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: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Próximo

Voltar para PIC

Quem está online

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

cron

x