macro.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

macro.

Mensagempor ffcprog » 05 Dez 2008 09:29

Bom dia amigos.
Estou com uma duvida, em uma adaptação de código, se possivel gostaria que alguém me ajudasse ou pelo menos sanasse a duvida se tem ou não a possibilidade.

Imaginem um array de 64 bytes.

buffwork[64].

Este buffer é utilizado em uma função que envia os dados..

Agora.
Imaginem uma estrutura que ocupa 56 bytes, onde existem varias informações. ok.!!

Estou fazendo o seguinte, para enviar os dados.
Aponto o endereço da estrutura para um ponteiro.
aponto o endereço do buffer para outro ponteiro.
I = 56;
while ( I) {
*Destino++ = *Fonte++;
I--;
}

minha dúvida agóra!

Existe alguma forma do compilador criar o buffer no endereço absoluto que eu informei, e eu criar uma estrutura que é um espelho para aquele endereço?

quando por exemplo eu disser que.

estrutura.adc1 = adc_read(1);
O compilador ja vai estar ciente que o resultado do adc vai para bytes
1 e 2 do endereço absoluto de uma variavel que eu criei.

Espero ter me expressado bem.

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor joao » 05 Dez 2008 09:48

Ola ffcprog,

Infelizmente não entendi tudo, mas vou tentar dar um exemplo:

Código: Selecionar todos
char teste[100] = "OI mae! To na TV BOBO!!!";
char *pteste = teste;


printf("A variavel TESTE tem: %s\n", teste);
printf("A variavel PTESTE tem: %s\n", pteste);

o resultado será:
A variavel TESTE tem: OI mae! To na TV BOBO!!!
A variavel TESTE tem: OI mae! To na TV BOBO!!!

Viu que ambos estão com o mesmo dado?

Será que é isso que vc queria fazer? Senão, vou te pedir para tentar explicar melhor.
PS: Vc falou de buf em alguns momentos, mas nao chegou a usar essa variavel, dando outros nomes, quem sabe por isso fiquei meio perdido.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Sergio38br » 05 Dez 2008 12:34

Boa tarde, ja usou union??

em C18

Código: Selecionar todos
struct
    {
       unsigned b0:1;//
       unsigned b1:1;//
       unsigned b2:1;//
       unsigned b3:1;//
       unsigned b4:1;//
       unsigned b5:1;//
       unsigned b6:1;//
       unsigned b7:1;//
    }cntrl2;
union
   {
      struct
         {
            unsigned   cntrl2;
         };
   }cntrl2a;
     


       cntrl2.b0 = 1 //cntrl2 = 0x01
       cntrl2a.cntrl2 // agora tbem eh 0x01


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

Mensagempor ffcprog » 05 Dez 2008 13:59

nossa sergio, me deu um nó no cerebro agora...

Me explique o que é isto?!
não consegui visualizar o que este comando faz..

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor Sergio38br » 05 Dez 2008 14:07

temos dois nome de variaveis, primeiro cntrl2 que é um tipo bitfield, com o segundo cntrl2a criei uma associação com o primeiro, na verdade vc pode criar esta associação com diversas variaveis ex. poderia ter um cntrl1, cntrl3 cada uma seria acessada usando o cntrl2a.(variavel incluida na declaração do union).

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

Mensagempor msamsoniuk » 06 Dez 2008 00:49

talvez uma forma mais clara do que o sergio citou seja assim:

Código: Selecionar todos

struct message // apenas define como eh a struct
{
  int adc[8];
  int channel[8];
};

union // junta a struct e um buffer no mesmo espaco comum
{
  struct message body;
  char buffer[32];
} msg;

msg.body.adc[0] = adc[0]; // int 16 bits, ocupa o 1.o par de bytes
msg.body.adc[1] = adc[1]; // int 16 bits, ocupa o 2.o par de bytes
...

for(i=0;i!=32;i++)
{
  send_spi_byte(msg.buffer[i]); // encherga a struct como um buffer de bytes
}
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor ffcprog » 09 Dez 2008 10:17

nossa tentei fazer de varias formas diferentes, mais o processo fica lento e grande. acho que utilizando o union vai ficar melhor.
Seguinte, só como exemplo.!!

char buffer_control[32]

os bytes 10 e 11 do buffer_control formão uma word.
os bytes 12 e 13 e 14, são bits de controle. cada bit e 4 bits tem seus nomes.

como ficaria o union para anexar estes dois nomes aqui.
ADC
control
para ====
ADC = bytes 10 e 11 do buffer_control.
control = bytes 12 , 13 , 14 do buffer control.

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor Sergio38br » 09 Dez 2008 10:26

Bom dia
Perguntas:

e o resto da informação??

em relação aos bytes de controle, ele funcionaram apenas como bool ou terão outras informações??

Vc pode mapear todos os bytes destas array?

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

Mensagempor Sergio38br » 09 Dez 2008 15:37

pergunta besta de minha parte, me desculpe, não sei como esta estruturado teu programa, vc quer que os valores das variaveis sejam, espelhados????

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

Mensagempor ffcprog » 09 Dez 2008 15:49

isso.. achou a palavra que eu não estava encontrando.
Só que da array de 32 bytes por exemplo.
Apenas alguns bytes serão espelhados com outros nomes.. :)

esta array de 32 bytes carrega varias informações no sentido PIC >>> PC.

bits de informações
Word´s do ADC de leitura do pic
Etc.
Como exemplo
só para você entender melhor.

char Dados_PIC_PC[10];
Byte 1,2 = 1 word
Byte 3,4,5,6 = 1 longint;
byte 7,8 = 8 bits de controle e 2 nibles para dado bcd
byte 9,10 = 1 palavra de 12 bits para msb destes 16 bits, e 1 nible no lsb que informa valores de 0 a 15;

Melhor entendido assim ?

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor Sergio38br » 09 Dez 2008 16:07

olha para fazer espelhamento tem de copiar mesmo, consigo dizer que um mesmo endereço de variavel tenha dois nomes, mas para espelhar dados:

dado1 = 0x33 e automaticamente espelho_dado1 = 0x33, só copiando os dados

Pensei que vc quizesse acessar os dados com outros nomes...
[]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor ffcprog » 10 Dez 2008 06:56

ixi compliquei novamente né?
Nossa e complicado explicar, ainda mais com o "C", estou engatinhando ainda com esta linguagem.
Bom deixa pra lá, não quero ocupar mais espaço sem chegar em algum lugar.

Pessoal muito obrigado pela ajuda de todos.

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16


Voltar para PIC

Quem está online

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

x