Fork me on GitHub

12/05/13

TUTORIAL: Comunicação Serial com PIC

TUTORIAL: Comunicação Serial com PIC


Como muita gente tem duvidas, resolvi fazer este tutorial para sobre a comunicação serial com PIC.
Estou utlizando o PIC16F628A, configurando para utilizar o clock interno.
Os pinos RB1 e RB2, são usados pela serial, para receber(RX) e transmitir(TX).
A comunicação serial possui várias velocidades de transmissão (baud rate), que variam de 300 bps até 115200 bps.

EXEMPLOS:

Receber um caracter e exibí-lo no display de LCD:
// configura os pinos
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;


char valor;//variavel q recebe um valor da serial

void main() {
   uart1_init(9600);//inicia o modulo UART com velocidade de 9600bps
   delay_ms(10);//espere 10ms para estabilizar
   lcd_init();//inicia o LCD
   lcd_cmd(_LCD_CURSOR_OFF);//desliga o cursor do lcd

   while(1)
   {
    if(uart1_data_ready())//se algum dado foi recebido
    {
      valor = uart1_read();//salva o dado na variavel
      lcd_chr_CP(valor);//exibe o caracter no lcd
    }
   }
}



Receber uma string e exibí-lo no lcd quando for pressionado ENTER:
// Configura os pinos
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

char valor[16];//variavel q recebe um valor da serial

void main() {
   uart1_init(9600);//inicia o modulo UART com velocidade de 9600bps
   delay_ms(10);//espere 10ms para estabilizar
   lcd_init();//inicia o LCD
   lcd_cmd(_LCD_CURSOR_OFF);//desliga o cursor do lcd

   while(1)
   {
    if(uart1_data_ready())//se algum dado foi recebido
    {
      uart1_read_text(valor, "\r", 16);//caso o ultimo caracter recebido for ENTER
      //salva o dado na variavel "valor" e executa essas duas linhas abaixo
      lcd_cmd(_LCD_CLEAR);//limpa o lcd
      lcd_out(1,1,valor);//exibe a string
    }
   }
}
}



Recebe um caracter, caso for 'A' seta pino RA7, se for 'B' reseta o pino RA7
char valor;//variavel q recebe um valor da serial

void main() {
   uart1_init(9600);//inicia o modulo UART com velocidade de 9600bps
   delay_ms(10);//espere 10ms para estabilizar
   TRISA.F7 = 0;//define pino ra7 como saida
   while(1)
   {
    if(uart1_data_ready())//se algum dado foi recebido
    {
      valor = uart1_read();//salva o dado na variavel
      if(valor=='A') PORTA.F7 = 1;
      else if(valor=='B') PORTA.F7 = 0;
    }
   }
}
}

15 comentários:

  1. Olá,
    acabei de conhecer o site e me parece bastante interessante...
    testarei alguns exemplos que tem aqui.

    Continue assim.

    ResponderExcluir
  2. Olá conheci o site agora e achei muito bom vamos por o fórum para bombar a exemplo dos nossos vizinhos argentinos no site todopic.com.ar que tem muitaaaas postagens sobre PIC não sei se Você conhece Tiago mas o fórum deles bomba de informações sobre PIC e programação.

    ResponderExcluir
  3. Agora sim. Eu ja conhecia um pouco sobre os microcontroladores. Mikroc é facil de usar e sempre esta completo. Gostei muito do site. Parabens!

    ResponderExcluir
  4. Boas, em vez de serem dados do pc podem ser dados de outro pic?

    ResponderExcluir
    Respostas
    1. Podem sim. É so ligar o TX de um pic no RX do outro pic e vice-versa...Nos códigos, o baud rate devem ser iguais.

      Excluir
    2. Estou a fazer um projeto de comunicação entre pics, mas estou tendo problemas. Estou a usar o CCS C, poderia-me dar umas dicas do que pode estar correndo mal. No simulador proteus funciona bem.

      Excluir
  5. Estou utilizando o seguinte!
    char output[10];
    UART1_Read_Text(output, "\r", 10);
    UART1_Write_Text(output);
    if(strcmp(output,"LL\r")==0)
    {
    PORTB.RB0 = 1;
    UART1_Write_Text("Led Ligado \n" );
    }
    Porem, não consigo jogar acender esse LED, parece que a comparação está com algum problema, tem alguma dica pra me dar? Se preferir, pode me passar seu email! Obrigado

    ResponderExcluir
    Respostas
    1. Amigão já testei retirando o \r do comando if(strcmp(output,"LL\r")==0)...

      Excluir
  6. tiago posso colocar essa saída tx do pic direto no conector db9 da placa mãe >> tx para rx e enviar dados??????

    ResponderExcluir
  7. tiago posso colocar essa saída tx do pic direto no conector db9 da placa mãe >> tx para rx e enviar dados??????

    ResponderExcluir
  8. Pessoal, tenho uma dúvida e não acho em lugar nenhum a resposta. Possuo um PIC 16f877a e um Arduino Uno. Gostaria de saber se tem como fazer a leitura da porta serial do PIC através do arduino conectado ao PC. Aguardando respostas.

    ResponderExcluir
  9. Boa noite pessoal, estou precisando de um auxilio, preciso fazer a leitura de entradas analógicas e transmiti-las pela serial, a leitura de um canal esta ok, porem preciso fazer de mais duas, pelas informações que apurei é necessário fazer empacotamento dos dados de cada canal, e depois gerar em gráfico num supervisório, no meu casa gerar o gráfico no Java.
    alguem sabe me indicar onde consigo material para fazer o empacotamento dos dados de cada canal?

    ResponderExcluir
  10. Olá, como ficaria essa programação em assembly?
    Muda muito coisa.

    ResponderExcluir
  11. Olá, como ficaria essa programação em assembly?
    Muda muito coisa.

    ResponderExcluir
  12. Poderia me dizer como ficaria essa programação em assembly?

    ResponderExcluir

Postagens Relacionadas!!