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:
// 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; } } } }
Olá,
ResponderExcluiracabei de conhecer o site e me parece bastante interessante...
testarei alguns exemplos que tem aqui.
Continue assim.
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.
ResponderExcluirAgora sim. Eu ja conhecia um pouco sobre os microcontroladores. Mikroc é facil de usar e sempre esta completo. Gostei muito do site. Parabens!
ResponderExcluirBoas, em vez de serem dados do pc podem ser dados de outro pic?
ResponderExcluirPodem 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.
ExcluirEstou 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.
ExcluirEstou utilizando o seguinte!
ResponderExcluirchar 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
Amigão já testei retirando o \r do comando if(strcmp(output,"LL\r")==0)...
Excluirtiago posso colocar essa saída tx do pic direto no conector db9 da placa mãe >> tx para rx e enviar dados??????
ResponderExcluirtiago posso colocar essa saída tx do pic direto no conector db9 da placa mãe >> tx para rx e enviar dados??????
ResponderExcluirPessoal, 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.
ResponderExcluirBoa 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.
ResponderExcluiralguem sabe me indicar onde consigo material para fazer o empacotamento dos dados de cada canal?
Olá, como ficaria essa programação em assembly?
ResponderExcluirMuda muito coisa.
Olá, como ficaria essa programação em assembly?
ResponderExcluirMuda muito coisa.
Poderia me dizer como ficaria essa programação em assembly?
ResponderExcluir