Ir ao conteúdo
  • Cadastre-se

Problemas com simulador proteus (comunicação serial do PIC)


Rodrigo Flister

Posts recomendados

Ola pessoal, ja a algum tempo venho trabalhando em um projeto, cujo no qual tenho que realizar uma comunicação serial entre 2 PICs. Um PIC18f442 e um 16f628, estou usando o copilador CCS e para simular estou usando o Proteus 7 SP6. Depois de muito apanhar de bibliotecas prontas do copilador, como a usart.c e a rs232.c, resolvi criar meu próprio protocolo de comunicação, tendo como base a comunicação serial do tipo SPI. Esses são os códigos :

O transmissor

#include <16f628.h>

#use delay (clock=12000000)

#fuses HS, NOWDT, PUT, NOLVP, NOBROWNOUT

#define clk pin_b2

#define dado pin_b1

#define retorno pin_b0

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(100);

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

delay_ms(100);

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.

}

}

main()

{

int vari=15;

while (true)envia_byte(20);// chama a função envia_byte infinitas vezes enviando o valor 18

}

O receptor

#include <18f442.h>

#use delay (clock=12000000)

#fuses HS, NOWDT, PUT, NOLVP, NOBROWNOUT

#include <LCD.c>

#define clk input(pin_b2)

#define dado input(pin_b1)

#define retorno pin_b0

int recebe(void)

{

int cont=0, dados=0,x=0;

int1 bitt=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_left(&dados,1,bitt);// desloca o bit menos siguinificativo da variavel dados para esquerda

output_high(pin_b0);

delay_ms(100);

output_low(pin_b0);

}

return(dados);

}

main()

{

int bytee=0;

lcd_init(); // inicia o LCD

while(true)

{

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

printf(lcd_putc,"\f resultado -> %u", bytee);// imprime no LCD

delay_ms(500);

}

}

Já testei o programa de varias maneiras, um amigo ajudou a conferir se estava tudo ok, e chegamos a conclusão que deveria funcionar. porém quando jogo no proteus ele envia e recebe, so que esses dados são totalmente diferentes dos que eu envio. Gostaria de pedir que os amigos do clube, dessem uma olhada no código e me falacem o que acham, e se alguem já teve uma ma experiencia com o proteus, na qual ele não mostrou os resultados devidos quando tudo estava certo.

OBS: os resultados estranhos que falei são +- assim, quando mando 15 ele escreve 232, ou outros números que não tem seu correspondente binário nem um pouco similar a 15. Alem disso os números ficam alterando, quando deveriam estar em um valor único.

Link para o comentário
Compartilhar em outros sites

Não, para você ter uma ideia, eu envio 15 que e 00001111 e recebo 232 11101000

Ok!

Para testes, experimente trocar as funções de tempo de US para MS, ok?


void envia_bit(int1 bitt)
{
int btt=0;
btt=bitt;
[B]delay_ms(100);[/B]
output_high(clk);
[B]delay_ms(100);[/B]
output_bit(dado, btt);
output_low(clk);
}

Adicione também um delay antes também...

Se você mandar 0b01010101 ele recebe 0b10101011 ?

Link para o comentário
Compartilhar em outros sites

Acabei de testar Xanok e a única coisa que mudou foi o tempo que demora para mudar de um numero para outro.

Só uma coisa, no CCS o INT é de 8 ou 16 bits?

Experimente aumentar o loop de 8 para 16:

for(cont=0;cont<[B]16[/B];cont++)
{

No send e no rcv

Link para o comentário
Compartilhar em outros sites

Xanok, editei meu post inicial colocando comentários no código para ajuda no seu entendimento. Agora sobre o valor das variáveis , no CCS int vale 8 bits, e colocar 16 no loop não funcionou. Dês de já agradeço imensamente sua colaboração e paciência em responder meus tópicos.

Link para o comentário
Compartilhar em outros sites

Xanok, editei meu post inicial colocando comentários no código para ajuda no seu entendimento. Agora sobre o valor das variáveis , no CCS int vale 8 bits, e colocar 16 no loop não funcionou. Dês de já agradeço imensamente sua colaboração e paciência em responder meus tópicos.

É que nem o CHAR também, que geralmente é 1 byte (8 bits), não faz muito sentido ter dois tipos de tamanhos iguais, mas tudo bem se ele é 8 então.

Em casa eu faço um exemplo em MikroC, você compara dai.

abração!

Link para o comentário
Compartilhar em outros sites

Lucas eu testei sua ideia, mas permaneceu a mesma coisa, vou editar meu tópico inicial colocar o programa do jeito que ele está agora. Do programa inicial para esse atual eu tive as seguintes melhoras. Antes os valores que imprimidos pelo LCD eram totalmente randômicos, agora são valores que ficam alternado entre si. Eu já realizei muitos testes e estou começando a desconfiar do proteus, porque estava vendo o programa so que com os delays maiores tipo 1s, e reparei que a sequência de pisques das I/Os da comunicação esta diferente do que esta programado EX: o clk da 2 pulsos antes de mudar o estado do pino de dados, ou o sinal de retorno do recebedor vem antes de enviar o clk.

Link para o comentário
Compartilhar em outros sites

Lucas eu testei sua ideia, mas permaneceu a mesma coisa, vou editar meu tópico inicial colocar o programa do jeito que ele está agora. Do programa inicial para esse atual eu tive as seguintes melhoras. Antes os valores que imprimidos pelo LCD eram totalmente randômicos, agora são valores que ficam alternado entre si. Eu já realizei muitos testes e estou começando a desconfiar do proteus, porque estava vendo o programa so que com os delays maiores tipo 1s, e reparei que a sequência de pisques das I/Os da comunicação esta diferente do que esta programado EX: o clk da 2 pulsos antes de mudar o estado do pino de dados, ou o sinal de retorno do recebedor vem antes de enviar o clk.

Me veio agora uma coisa sobre o LCD...

Talves você esteja printando o valor de endereço da variavel e não seu valor em si, não acha?

Em vez de usar o print LCD, faça os valores recebidos sairem em uma das portas em paralelo, bem mais 'seguro' de testar.

Nos simuladores você não pode querer testar 10 Mhz, nenhum simulador de real-time vai te mostrar os valores. No simulador, tente sempre colocar alguns atrasos, ou usar o Osciloscopio para chegar os sinais

Link para o comentário
Compartilhar em outros sites

O galera, muito obrigado pela ajuda, grassa a vocês eu realizei o que queria. Não posso chamar meu programa de comunicação serial, porque eu uso 4 portas, no lugar de 2, mas os resultados foram bons. Só tive um problema, quando eu estava fazendo apenas a comunicação entre os pics, foi tudo uma maravilha, agora que encorporei a comunicação no meu programa de controle de processo industrial ele ta dando birra e nau funciona em certas horas. Mas isso não vai me impedir, vou batendo cabeça ate chegar la.

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