Ir ao conteúdo
  • Cadastre-se

Enviando e recebendo strings entre 2 PICs com comunicação serial


Posts recomendados

Estou tentando fazer um programa onde o usuário entra com uma mensagem que é exibida em um display LCD no primeiro PIC e após apertar a tecla #, a mesma é enviada para o segundo PIC e exibida no display do mesmo.

O problema é que ao ser enviada a mensagem para o segundo PIC. A mesma não é exibida de forma correta, uma vez que ao invés de apagar o display e exibir a nova mensagem, ele mantém a segunda e vai escrevendo por cima, além de começar a escrever na segunda linha do LCD ao invés da primeira.

 

Código do Receptor

#include <16f877a.h>
#include <string.h>
#use delay(clock=4000000)
#use fast_io(b)
#use rs232(baud=2400,xmit=pin_c6,rcv=pin_c7,stream=serial)
#include <lcd.c>
#fuses xt,nowdt,noprotect,put,brownout,nolvp

char c[41];
int1 flag;
int8 n;
int8 i;

#int_RDA
void RDA_isr(void){
   
   fgets(c,serial);
   n = strlen(c);
   flag = 1;

}

void main(){
   
   enable_interrupts(INT_RDA);
   enable_interrupts(global);
   lcd_init();

   while(1){

      if(flag){
         lcd_putc("\f");
         lcd_gotoxy(1,1);
         //printf(lcd_putc,"%s",c);
         for(i=0;i<n;i++){
            if(i==20)
               lcd_putc("\n");
            lcd_putc(c[i]);
         }
         flag = 0;
         strcpy(c,"");
      }

   }
}
Código do Emissor

#include <16f877a.h>
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#use rs232(baud=2400, xmit=pin_c6, rcv=pin_c7,stream=serial)
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>
#fuses xt,nowdt,noprotect,put,brownout,nolvp


void main(){

   char c;
   char c2[41];
   int8 count = 0;
   int8 count2 = 0;
   int1 flag = 0;

   lcd_init();
   kbd_init();
   port_b_pullups(true);

   while(1){

      c = kbd_getc();

      if(c != 0){
         if(c == '#'){
            fputs(c2,serial);
            lcd_putc("\f");
            count = 0;
            count2 = 0;
            lcd_gotoxy(1,1);
            flag = 0;
            strcpy(c2,"");
         }else{
            lcd_putc(c);
            c2[count2] = c;
            count++;
            count2++;
            if(count2 == 40)
               count2 = 0;
            if(count == 20){
               count = 0;
               flag = !flag;
               if(flag == 1)
                  lcd_putc("\n");
               else
                  lcd_gotoxy(1,1);
             }
         }
      }
    }
}

Coloquei em anexo o circuito.

Capturar.PNG

Link para o comentário
Compartilhar em outros sites

@thalespi Isso aí é CCS C ? Creio que sim, vamos ver se consigo te ajudar.

 

Analisando seu código de recebimento:

if(flag){
         lcd_putc("\f");
         lcd_gotoxy(1,1);
         //printf(lcd_putc,"%s",c);
         for(i=0;i<n;i++){
            if(i==20)
               lcd_putc("\n");
            lcd_putc(c[i]);
         }
         flag = 0;
         strcpy(c,"");
      }

if(flag) >>Se recebeu a string...

lcd_putc("\f");>>limpa o display...

lcd_gotoxy(1,1);>>coloca o cursor do display na primeira linha, e primeira posição...

 

for(i=0;i<n;i++){ //varre a string recebida...

if(i==20)>>se a string estourar a linha do display,

lcd_putc("\n"); >>passa para a próxima linha

lcd_putc(c); >>escreve no display 

flag = 0; >>terminou de escrever a string no display, zera o flag de recepção

strcpy(c,""); >>zera o buffer de recepção

 

Acho que seu problema todo está no zeramento do buffer de recepção (strcpy(c,""); tenta fazer assim:

 

int j;

for(j=0;j<=41;j++){

   c[j]="0";

}

 

Se não resolver, tenta essa:

 

É possível que o display não esteja recebendo o comando pra limpar (\f) antes de recomeçar a escrever, por via das dúvidas tenta assim:

printf(LCD_PUTC, "\f");

 

e no lugar de lcd_putc("\n"); tenta colocar assim: lcd_gotoxy(1,2); ou então assim: printf(LCD_PUTC, "\n");

 

Abraço. 

Link para o comentário
Compartilhar em outros sites

5 horas atrás, ViniciusKruz disse:

@thalespi Isso aí é CCS C ? Creio que sim, vamos ver se consigo te ajudar.

 

Analisando seu código de recebimento:


if(flag){
         lcd_putc("\f");
         lcd_gotoxy(1,1);
         //printf(lcd_putc,"%s",c);
         for(i=0;i<n;i++){
            if(i==20)
               lcd_putc("\n");
            lcd_putc(c[i]);
         }
         flag = 0;
         strcpy(c,"");
      }

if(flag) >>Se recebeu a string...

lcd_putc("\f");>>limpa o display...

lcd_gotoxy(1,1);>>coloca o cursor do display na primeira linha, e primeira posição...

 

for(i=0;i<n;i++){ //varre a string recebida...

if(i==20)>>se a string estourar a linha do display,

lcd_putc("\n"); >>passa para a próxima linha

lcd_putc(c); >>escreve no display 

flag = 0; >>terminou de escrever a string no display, zera o flag de recepção

strcpy(c,""); >>zera o buffer de recepção

 

Acho que seu problema todo está no zeramento do buffer de recepção (strcpy(c,""); tenta fazer assim:

 

int j;

for(j=0;j<=41;j++){

   c[j]="0";

}

 

Se não resolver, tenta essa:

 

É possível que o display não esteja recebendo o comando pra limpar (\f) antes de recomeçar a escrever, por via das dúvidas tenta assim:

printf(LCD_PUTC, "\f");

 

e no lugar de lcd_putc("\n"); tenta colocar assim: lcd_gotoxy(1,2); ou então assim: printf(LCD_PUTC, "\n");

 

Abraço. 

Obrigado pela ajuda!

Infelizmente não funcionou :/

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@thalespi ,

 

A grande vantagem do Proteus é que se voce gerar todos os arquivos necessários na hora da compilação, voce pode executar seu programa fonte de maneira controlada, com breakpoints, e acompanhar o conteudo de suas variáveis. Inclusive pode acompanhar o código Assembly que equivale a cada uma das instruções de seu programa em CCS.

 

Com isso, você faz o debug em tempo recorde.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@thalespi Suspeitei desde o principio!!! Faz muito tempo que parei de confiar nos resultados do proteus no que se refere ao firmware. Pelo que vi no seu codigo ele esta correto é bem possível que o problema seja na simulação. O proteus é bom mas sempre poderá acontecer essas coisas, sempre desconfie dele e se possível faça sempre o projeto físico, sem simulações,  mesmo em protoboard o resultado será sempre real.

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz ,

 

Já encontrei erros em 3 modelos de componentes do Proteus, sendo um display e dois microcontroladores Atmega. Entrei em contato com o suporte oficial, eles confirmaram o bug, e em menos de 24 horas recebí os modelos corrigidos, e logo na próxima versão eles disponibilizaram os modelos atualizados.

Sempre pode existir um erro aqui ou alí, pois existem tantos componentes dentro dele que a chance de algum ter um bug existe, mesmo sendo bem pequena.

 

Tirando isso, para mim o que funcionou no Proteus, funcionou no hardware real.

Já fiz erros bobos, como gravar fuses errados, esquecer algum capacitor de filtragem, mas sempre erros de minha parte na montagem ou gravação dos Atmegas.

 

Hoje, eu faço tudo primeiro no Proteus. Ganho um tempo enorme simulando e recompilando, e o projeto fica pronto em menos de um décimo do tempo que levava quando eu não usava o Proteus.

 

É um programa caro, mas se pagou em poucos projetos, me dando mais tempo livre no dia a dia !

 

Só posso falar bem desse programa...

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@aphawk realmente ele é muito bom,  a parte de eletrônica então nem se fala. Às vezes eu preciso testar alguma logica ou alguma coisa simples eu recorro a ele. No passado eu fazia meus projetos completamente nele mas quando montava fisicamente, surgiam coisas inexplicáveis como ésta acontecendo agora com o autor deste tópico.  Tinham coisas que rodavam vou proteus mas não rodavam físicamente,  e tinham coisas que rodavam fisicamente mas não rodavam no proteus. Mas mesmo assim ainda acho que é uma ferramenta extraordinária,  só precisa ser usada com cautela, a não ser que se tenha uma licença que permita suporte, aí seria outra história.

 

Abraço. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@ViniciusKruz ,

 

Foi justamente pelo fato de ter direito ao suporte que me incentivou a gastar um bom dinheiro na compra do programa. Mas mesmo comprando, só tenho direito a atualizações por apenas 6 meses, após esse prazo tenho de pagar para ter direito novamente às atualizações, e o valor é alto, tanto que estou esperando lançarem a versão 9 para pagar e ter as atualizações...

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...