Ir ao conteúdo
  • Cadastre-se

O tempo para PIC!


Rodrigo Flister

Posts recomendados

Olá amigos do fórum, estou com uma duvida muito grande sobre o tempo que um microcontrolador leva para realizar umas funções. Estou em um projeto onde faço comunicação serial entre 2 PICs, o tempo que eu calculei pelos delays_ms que ocorrem mostram que deveria se levar 2s para transmitir e receber 6 bytes, porém o tempo real que eu medi com um cronometro e de quase 11s. porém saibam que estou usando um simulador, no caso o proteus7 SP6. Então amigos meu problema é o seguinte, se meu tempo de tranmisão for de 10s todo o meu programa vai dar errado e terei de reformulado totalmente, assim queria saber a opinião de vocês, se o problema é no programa onde o tempo de processamento e maior que nós, ou se é no simulador

Link para o comentário
Compartilhar em outros sites

Olá amigos do fórum, estou com uma duvida muito grande sobre o tempo que um microcontrolador leva para realizar umas funções. Estou em um projeto onde faço comunicação serial entre 2 PICs, o tempo que eu calculei pelos delays_ms que ocorrem mostram que deveria se levar 2s para transmitir e receber 6 bytes, porém o tempo real que eu medi com um cronometro e de quase 11s. porém saibam que estou usando um simulador, no caso o proteus7 SP6. Então amigos meu problema é o seguinte, se meu tempo de tranmisão for de 10s todo o meu programa vai dar errado e terei de reformulado totalmente, assim queria saber a opinião de vocês, se o problema é no programa onde o tempo de processamento e maior que nós, ou se é no simulador

O que pode estar acontecendo é falta de sincronização.

Veja que o simulador é perfeito em termos de transmissão. Todos os pics são ligados ao mesmo tempo no simulador.

2s para 12 bytes??? Cara, seu delay está muito alto ainda.

Você deve estar usando Delay_ms(150), experimente colocar 1 ms, em termos práticos, eu já consegui me 'comunicar' com CIs sem utilizar Delay, pois o CIs era do tipo HC (alta frequencia), podendo ter um 'clock' na ordem dos 100Mhz.

O que pode estar acontecendo é que você, no simulador, colocou um valor de frequencia do oscilador diferente do que você compilou o programa.

Link para o comentário
Compartilhar em outros sites

Caro amigo Xanok, minhas configurações estão beleza, o clock no programa e no proteus estão sincronizados, e o tempo de delay que coloquei e de 20ms, menos que isso a comunicação falha, alem disso tenho outro problema, tenho que colocar um delay entre as funções que enviam o byte porque se não o programa trava não me pergunte como, esse dalay tb é de 20ms. Cara ja tentei de tudo pra ver se ficava mais rápido, porém não funcionou.

Link para o comentário
Compartilhar em outros sites

Caro amigo Xanok, minhas configurações estão beleza, o clock no programa e no proteus estão sincronizados, e o tempo de delay que coloquei e de 20ms, menos que isso a comunicação falha, alem disso tenho outro problema, tenho que colocar um delay entre as funções que enviam o byte porque se não o programa trava não me pergunte como, esse dalay tb é de 20ms. Cara ja tentei de tudo pra ver se ficava mais rápido, porém não funcionou.

Não adianta tentar forçar o simulador com frequencias altas. Teste na prática com delay menores, ok?

Link para o comentário
Compartilhar em outros sites

Não em freqüência menores ele roda perfeito, o problema e que pra continuar os testes do projeto tenho que aumentar a freqüência pois só assim posso simular o possíveis erros que terei quando o circuito estiver atuando na maquina.

Sim amigo, é o que estou dizendo.

No simulador você pode simular com delays altos (100ms). Na prática é melhor você colocar delays mais baixos, ele vai funcionar bem.

Link para o comentário
Compartilhar em outros sites

Coloque o código aqui, de preferência na linguagem que você quiser!

Eu faço comunicações com pics de 2Bytes a 30ms usando Software SPI e com delay de 1ms... isso um pic a 20MHz comunicando com um a 4MHz... é fácil fazer, e alias, não existe a necessidade do delay se você estiver trabalhando numa frequencia abaixo do máximo do componente, ele tem plena capacidade de entender o clock [;)]

Abraços, e não esquece de postar o código para ajudar-mos!

Link para o comentário
Compartilhar em outros sites

Aqui estão as duas bibliotecas que desenvolvi para realizar a comunicação.

o emissor

#define clk (pin_b2)

#define dado (pin_b1)

#define retorno2 input(pin_b0)

/* escreve_flister(x): Comando para enviar um byte no caso x pela serial

OBS: Essa biblioteca envia byte, a forma de interpretalos, seja como numeros,

ou como simbolos da tabela ansi depende do programador

*/

void envia_bit(int1 bitt)

{

int btt=0;

btt=bitt;

output_bit(dado, btt);// coloca a saida dado com o mesmo valor de btt (0/1)

delay_ms(20);

output_high(clk);//envia um sinal de clock

delay_ms(20);

output_low(clk);

}

void envia_byte(int var)

{

int cont=0;

int1 bitt=0;

for(cont=0;cont<8;cont++)

{

bitt = bit_test(var,cont); // pega o bit menos siguinificativo, da variavel de 8 bits var

envia_bit(bitt); // chama a função envia bit

while(pin_b0==0){} // somente quando um sinal de clock completo for enviado

while(pin_b0==1){} // que o programa ira continuar.

}

}

int flister_envia(int valor)

{

output_low(clk);//envia um sinal de clock

delay_ms(20);

output_high(clk);

delay_ms(20);

output_low(clk);

while(retorno2==0){}

while(retorno2==1){}

envia_byte(valor);// chama a função envia_byte

}

o receptor

#define clk input(pin_b2)

#define dado input(pin_b1)

#define retorno pin_b0

/* x=flister_recebe(): Comando para receber um byte e colocalo na variavel x

OBS: Essa biblioteca recebe byte, a forma de interpretalos, seja como numeros,

ou como simbolos da tabela ansi depende do programador

*/

int dados=0;

int1 bitt=0;

int recebe(void)

{

int cont=0,x=0;

for(cont=0;cont<8;cont++)

{

while(clk==0){}//somente quando um sinal de clock completo for enviado

while(clk==1){}//que o programa ira continuar.

bitt= dado; // coloca o valor da entrada dado (0/1) na variavel bitt

shift_right(&dados,1,bitt);// desloca o bit menos siguinificativo da variavel dados para esquerda

output_high(pin_b0);// pulso

delay_ms(20); // de

output_low(pin_b0); // clock

}

return(dados);

}

int flister_recebe()

{

int bytee=0;

dados=0;

bitt=0;

while(clk==0){}//somente quando um sinal de clock completo for enviado

while(clk==1){}//que o programa ira continuar.

output_high(pin_b3);

delay_ms(20);

output_low(pin_b3);

bytee = recebe();// chama a função recebe e coloca o valor retornado por ela na variavel bytee

return(bytee);

}

Tenho que diminuir o tempo de comunicação, pois quando incrementar essas bibliotecas ao meu programa principal que controla uma maquina que estamos projetando, tenho que enviar 12 byte e se demorar muito o programa falha e a maquina paula.

Link para o comentário
Compartilhar em outros sites

Aqui estão as duas bibliotecas que desenvolvi para realizar a comunicação.

o emissor

#define clk (pin_b2)

#define dado (pin_b1)

#define retorno2 input(pin_b0)

/* escreve_flister(x): Comando para enviar um byte no caso x pela serial

OBS: Essa biblioteca envia byte, a forma de interpretalos, seja como numeros,

ou como simbolos da tabela ansi depende do programador

*/

void envia_bit(int1 bitt)

{

int btt=0;

btt=bitt;

output_bit(dado, btt);// coloca a saida dado com o mesmo valor de btt (0/1)

delay_ms(20);

output_high(clk);//envia um sinal de clock

delay_ms(20);

output_low(clk);

}

void envia_byte(int var)

{

int cont=0;

int1 bitt=0;

for(cont=0;cont<8;cont++)

{

bitt = bit_test(var,cont); // pega o bit menos siguinificativo, da variavel de 8 bits var

envia_bit(bitt); // chama a função envia bit

while(pin_b0==0){} // somente quando um sinal de clock completo for enviado

while(pin_b0==1){} // que o programa ira continuar.

}

}

int flister_envia(int valor)

{

output_low(clk);//envia um sinal de clock

delay_ms(20);

output_high(clk);

delay_ms(20);

output_low(clk);

while(retorno2==0){}

while(retorno2==1){}

envia_byte(valor);// chama a função envia_byte

}

o receptor

#define clk input(pin_b2)

#define dado input(pin_b1)

#define retorno pin_b0

/* x=flister_recebe(): Comando para receber um byte e colocalo na variavel x

OBS: Essa biblioteca recebe byte, a forma de interpretalos, seja como numeros,

ou como simbolos da tabela ansi depende do programador

*/

int dados=0;

int1 bitt=0;

int recebe(void)

{

int cont=0,x=0;

for(cont=0;cont<8;cont++)

{

while(clk==0){}//somente quando um sinal de clock completo for enviado

while(clk==1){}//que o programa ira continuar.

bitt= dado; // coloca o valor da entrada dado (0/1) na variavel bitt

shift_right(&dados,1,bitt);// desloca o bit menos siguinificativo da variavel dados para esquerda

output_high(pin_b0);// pulso

delay_ms(20); // de

output_low(pin_b0); // clock

}

return(dados);

}

int flister_recebe()

{

int bytee=0;

dados=0;

bitt=0;

while(clk==0){}//somente quando um sinal de clock completo for enviado

while(clk==1){}//que o programa ira continuar.

output_high(pin_b3);

delay_ms(20);

output_low(pin_b3);

bytee = recebe();// chama a função recebe e coloca o valor retornado por ela na variavel bytee

return(bytee);

}

Tenho que diminuir o tempo de comunicação, pois quando incrementar essas bibliotecas ao meu programa principal que controla uma maquina que estamos projetando, tenho que enviar 12 byte e se demorar muito o programa falha e a maquina paula.

Ola amigo, uma observação.

Em todo seu programa as operações de 'clock' não parecem seguir a lógica que você quer.

Como exemplo esse código aqui:


for(cont=0;cont<8;cont++)
{
while(clk==0){}//somente quando um sinal de clock completo for enviado
while(clk==1){}//que o programa ira continuar.
bitt= dado; // coloca o valor da entrada dado (0/1) na variavel bitt
shift_right(&dados,1,bitt);// desloca o bit menos siguinificativo da variavel dados para esquerda
[B] output_high(pin_b0);// pulso
delay_ms(20); // de
output_low(pin_b0); // clock[/B]
}

Você faz output_high - delay_ms(20) - output_low

Mas fazendo as interações do FOR completas, você vai ver que falta um delay_ms.

cont=0 - output_high - delay_ms(20) - output_low - cont=1 - output_high - delay_ms(20) - output_low - cont=2 - output_high - delay_ms(20) - output_low.. e assim por diante

Acho que a lógica mais correta seria:

cont=0 - output_high - delay_ms(20) - output_low - delay_ms(20) - cont=1 - output_high - delay_ms(20) - output_low - delay_ms(20) - cont=2 - output_high - delay_ms(20) - output_low - delay_ms(20)..


for(cont=0;cont<8;cont++)
{
while(clk==0){}//somente quando um sinal de clock completo for enviado
while(clk==1){}//que o programa ira continuar.
bitt= dado; // coloca o valor da entrada dado (0/1) na variavel bitt
shift_right(&dados,1,bitt);// desloca o bit menos siguinificativo da variavel dados para esquerda
output_high(pin_b0);// pulso
delay_ms(20); // de
output_low(pin_b0); // clock
[B] delay_ms(20); // [/B]
}

Estou chutando que seja esse o problema.

De uma conferida no seu código, e arrume todos os trechos que apresentam o mesmo problema.

Link para o comentário
Compartilhar em outros sites

Xanok amigão vl pela dica, não resolveu o problema do tempo mais sim uma outra anomalia que aparecia so quando meu programa principal executava uma função. Agora sobre o tempo eu ja me convenci que o problema e no proteus pois mandei piscar um led e 20ms e pudi ver ele piscar beleza, so para garantir que não estava viajando eu fiz o teste com o gerador de sinais e e simplesmente impossível ver o led piscar nessa freqüência ~50Hz. Portanto tenha-se o caso encerrado. E a culpa e do proteus aquele safado!!!!

Link para o comentário
Compartilhar em outros sites

Xanok amigão vl pela dica, não resolveu o problema do tempo mais sim uma outra anomalia que aparecia so quando meu programa principal executava uma função. Agora sobre o tempo eu ja me convenci que o problema e no proteus pois mandei piscar um led e 20ms e pudi ver ele piscar beleza, so para garantir que não estava viajando eu fiz o teste com o gerador de sinais e e simplesmente impossível ver o led piscar nessa freqüência ~50Hz. Portanto tenha-se o caso encerrado. E a culpa e do proteus aquele safado!!!!

Sim amigo, foi o que te disse, não tem como simular sinais que oscilam em uma velocidade menor que 30 ms. Até porque o computador em geral tem uma precisão de timer na ordem dos 11 à 17 ms. Então adicionando isso a calculos e macuquisses que o simulador tem que fazer, você verá o quanto um simulador é complexo.

Conseguiste fazer na prática o circuito de novo para testar se ele está ok?

Link para o comentário
Compartilhar em outros sites

eu tenho certeza que seu gravador grava até os pics 18F, pois eles não tem diferença nenhuma na gravação, usam o mesmo método e mesmo tipo de arquivo. E mesma pinagem.

Alias, eu ja fiz simulação de comunicação entre dois MCU's a 8MHz sem usar delay e funcionou, nunca passei por esse problema de "delays menores que 30ms"...

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!