Estou querendo entender melhor como funciona a inteface de comunicação serial USART do PIC18F4550, mais estou tendo algumas duvidas estou tentando mandar uma string “TESTE” pela serial a uma velocidade baixa de 1200bps, na recepção receberia esta string se for igual a string TESTE um led verde seria acesso se não um led vermelho seria acesso.

OpenUSART( USART_TX_INT_OFF & // quando devo habilitar esta função
USART_RX_INT_OFF & 
// quando devo habilitar esta função
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_SINGLE_RX &
// quando devo habilitar esta função
USART_BRGH_HIGH,2499 );
// A partir de quando devo considerar
baud rate alto e baud rate baixo. para a taxa de 1200bps meu calculo de 2499
esta correto;
Transmissão de String (está correto)
putrsUSART(“TESTE”); transmite a string
Recepção de String (esta correto)
while(!DataRdyUSART ()); //aguarda até que seja verificado um novo dado no
buffer de recepção
getsUSART(recebe_dado,5);// aguarda a chegada de cinco caracteres vindos da
USART (esta correto)
Como faço para comparar a string recebida(recebe_dado)
com a string TESTE para acender os leds


Um abraço,

Exibições: 7807

Responder esta

Respostas a este tópico

Salve Eustaquio Luiz Ferreira;

   Fiz algo similar ao seu projetinho, alguns meses atrás, porém, utilizando o PIC18F452 e PIC16F877A, programei através do software MikroC Pro for PIC (software da empresa Mikroeletronica).
   No meu projeto o PIC 18F ou 16F recebia o valor de tensão linear referente a uma medição de temperatura, esse valor era disponibilizado noo pino 2 do PIC (Canal AD do PIC). Depois enviava o valor correspondente a temperatura convertida pelo AD do PIC, para o porta COM2 do Computador PC.

   Acredito que a forma de programar o PIC184550 seja a mesma do PIC18452, a experiência que tenho no uso da USART dos PIC16 e 18F é através de estudo de apostilas pegas na internet, seria muito bom fazer um treinamento mas não tenho grana para fazer um treinamento, e como encontrei muito material usando o compilador MikroC resolvi adotar o mesmo, ao invés do  excelente compilador C18, excelente compilador Hi-Tech ou CCS que não gosto muito.

Bem segue abaixo o código do meu projeto, baseado no compilador MikroC Pro

OBS: ABAIXO EM NEGRITO ESTÃO AS FUNÇÕES USADAS NO MIKROC PRO, PARA ENVIO DE CARACTER PELA PORTA SERIAL USART.

//=========================================================================================================================

/* Projeto Medidor de Temperatura de 0 a 150C ,exibindo Valor no Display LCD
   Alfanumerico 16x2, envio do valor da temperatura medida para a porta Com 2 do computador PC, sensor linear utilizado LM35
   Microcontrolador utilizado PIC16F877A ou PIC18F452
 Autor:   Alexandre Augusto*/


//============ Declaração dos Defines ==============================================================
  # define Rs_LCD   portc.rc4
  # define En_LCD   portc.rc5
//==================================================================================================

       //
//============ Declaração de Protótipos das funções ================================================
  LCD_Comando (char Com); // Declaração de Protótipos das funções
  LCD_Letra (char Com);
  LCD_Mensagem (char Texto[51]);
//==================================================================================================


//============ Funções criadas =====================================================================
  LCD_Comando (char Com)
  {/*char Valor;
   Valor=Aux; */
   Rs_LCD=0; PORTB=Com;/* PORTB recebe valor da variável Com*/ En_LCD=1; Delay_ms(1); En_LCD=0; }


  LCD_Mensagem(char Texto[51])
   { int i=0;
     do{ LCD_Letra(Texto[i]);
         i++;
           }while(Texto[i]!=0);
   }


  LCD_Letra(char Com)
   {/*char Valor;
    Valor=Aux; */
    Rs_LCD=1; PORTB=Com;/* PORTB recebe valor da variável Com*/ En_LCD=1; Delay_ms(1); En_LCD=0; }


void main()
{

float Resultado_AD, Var_AUX, Tensao_Real, Tensao_Amostra, Aux ;
int Milhar, Centena, Dezena, Unidade, Cont=0 , j ;//  A Declaração da variável deve ser feita antes da definição dos TRIS
//CUIDADO:  SEMPRE A Declaração da variáveis deve ser feita antes da definição dos TRIS , isso para o compilador MikroC
char Serial[10];

//=========== Confgiurações de Entra/Saída ================================
TRISB=0b00000000;   // configura PORTB como saída, está ligado nos pinos de de dados do Display LCD
TRISC=0b00000000;
TRISD=0b00000000; // rd0 e rd1 entradas, rd6 e rd7 saidas

//============ Configurações do A/D ========================================
INTCON=0b00000000; // Desabilita todas interrupções
ADCON1=0b00001110; /* ADMF=0 justificado a esquerda(usa 8 bits mais significati
                     vos,
                     PCFG3=1,PCFG=1,PCFG1=1,PCFG0=0 significa AN7 à AN1 Como
                     canais digitais , e AN0 como digital(Conversor A/D),
                     Vref+=VDD, Vref-=VSS, e sem Referênica externa.*/

ADCON0=0b10000001;/* ADCS1=1,ADCS2=0, significa Fosc/32
                     CH2=0,CH1=0,CH0=0, seleciona canal AD, no caso Canal 0
                     (RA0/AN0)
                     ADON=0 conversão Desligada, em 1 conversão ligada   */
                    
                    

   LCD_Comando(0x3c); // Sequência de incialização do LCD 20X2
   LCD_Comando(0x3c);
   LCD_Comando(0x3c);
   LCD_Comando(0x3c);
   LCD_Comando(8);
   LCD_Comando(1);
   LCD_Comando(6);
   LCD_Comando(0x0c);  // com 0x0c ao inves de 0x0f o cursor do LCD Fica apagado


   LCD_Comando(1); // Limpa a tela do LCD
   LCD_Comando(0x80); // Posiciona cursor LCD na 1º linha e 1º Coluna
  while (1)
 {
    ADCON0.GO_DONE=1; /* Bit GO/DO do registrador ADCON0 setado, isso faz
                        a conversão ter início*/
    do{
      }while(ADCON0.GO_DONE==1); /* Fica travado esperando fim da conversão,
                                   que ocorre quando o bit GO/DONE vai para 0 */

    Resultado_AD=ADRESH; /* Variável Resul_AD recebe resultado da convesão, que
                       está armazenado no registrador ADRESH, o qual foi
                       justificado a esquerda, através de ADMF=0 . */

    Var_AUX = Resultado_AD;
    PORTD = Var_AUX ;
    Aux=Resultado_AD;



  /*
 Tensao_Amostra=(4/204)*(Resultado_AD);
 Tensao_Real=(28/4)*(Tensao_Amostra);
 Tensao_Real= Tensao_Real*10;
 Aux=Tensao_Real;
    */

                Centena=0;
                while(Aux>=100)
             { Aux=Aux-100;
                   Centena=Centena+1;
                  }
                Dezena=0;
                while(Aux>=10)
             { Aux=Aux-10;
                   Dezena=Dezena+1;
                  }
                Unidade=0;
                while(Aux>=1)
             { Aux=Aux-1;
                   Unidade=Unidade+1;
                  }

        //        LCD_Comando(1);
                LCD_Comando(0x80); // Posiciona cursor na 1º linha do LCD alfanumérico 16X2
                LCD_Mensagem ("Temperatura");
                LCD_Comando(0xc0);  // Posiciona cursor na 2º linha do LCD alfanumérico 16X2
                LCD_Mensagem ("T = ");
                Serial[0]= 0x23; /*Envia o Caracter jogo da velha, que indica inicio da comunição serial
                                   # corresponde ao numero 0x23 da tabela ASCII*/
                LCD_Letra (Centena+0x30); /* Exibe no Display LCD O Valor da casa das centenas na
                                           forma do caracter char, simbolo da tabela ASCII */
                Serial[1]= Centena+0x30;
                                          
                LCD_Letra (Dezena+0x30); /* Exibe no Display LCD O Valor da casa das centenas na
                                          forma de caracter char, símbolo da tabela ASCII*/
                Serial[2]= Dezena+0x30;

             //   LCD_Letra (','); // Exibe a vírgula de por exemplo; 29,5 Volts
            
            
                LCD_Letra (Unidade+0x30); /* Exibe no Display LCD O Valor da casa das unidades na
                                           forma de caracter char, símbolo da tabela ASCII */

                Serial[3]= Unidade+0x30;
                LCD_Mensagem (" C");
               
               
    Cont++;
    if (Cont==40)
    {
      Cont=0;

      Soft_UART_Init(&PORTC, 7, 6, 9600, 0); // Configura pinos RC7, RC6 do PIC , Bautrate 9600bps, sem paridade

      j=0;
      do{

          Soft_UART_Write(Serial[j]); //Envia esse char pela serial.  // /

         j++;
         }while(j<4);
    }

 }
}

 

//=========================================================================================================================

 

Segue em anexo uma apostila que ensina a usar as funções prontas do MikroC para comunicação serial (no MikroC Pro muda pouca coisa, é quase igua o material da apostila), ler a partir da página 48. O ideal é ler o datasheet do PIC18F4550 entender o funcionamento dos registradores que controlam a USART, e saber como programar esse registradores no compilador C, a ser usado, seja qual for.

 

Espero ter ajudado

ABS

Alexandre Augusto

 

Anexos

Alexandre, valeu pelas dicas. Vou ler a apostila e analisar o se código.

 

Obrigado,

 

 

 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço