Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
thalespi

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

Recommended Posts

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

Compartilhar este post


Link para o post
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. 

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Sim, no Proteus.

    Acredito ser algum problema com o vetor ou a forma como está acontecendo a comunicação serial.

    Editado por thalespi

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Vou tentar usar o debugger. Obrigado pela dica!

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×