Os microcontroladores PIC fabricados pela empresa Microchip são utilizados em larga escala no desenvolvimento embarcado desde os dias atuais. Para que você enriqueça seus projetos com PIC, este tutorial ensina como realizar uma comunicação serial entre um software desenvolvido em C# e o PIC16F877A.
Os PICs foram desenvolvidos com a tecnologia USART (Universal Synchronous Asynchronous Receiver / Transmitter) porém é possível configurar o modo de comunicação que seu PIC irá realizar, como UART ou dispositivos Master e Slave (Mestre e Escravo) conhecido como comunicação SPI (Serial Peripheral Interface).
A interface de comunicação UART (Universal Asynchronous Receiver / Transmitter) é conhecida por fornecer uma comunicação Full Duplex entre dois dispositivos como por exemplo, o PIC e o computador. O UART usa somente duas linhas de dados para transmitir (TX) e receber (RX), sendo uma comunicação serial bem simples. Como é uma comunicação assíncrona não é necessário enviar um valor de clock junto com um dado, diferente de uma comunicação síncrona.
Este tutorial foi baseado em outro tutorial publicado no tecdicas com o título "Como piscar um LED com o PIC16F877A", sendo recomendável sua leitura para entender as partes básicas da montagem e desenvolvimento no PIC16F877A.
Para auxiliar na montagem veja a pinagem do PIC16F877A retirada do datasheet.

Materiais
Para construir uma comunicação serial no PIC16F877A precisamos da estrutura básica montada no prootoboard e depois pegue uma caneta e um papel para anotar os seguintes componentes necessários.
- 1 Módulo conversor USB Serial Ch340g.
- Fios jumpers.
- 4 Resistores de 220Ω.
- 4 LEDs.
Dicas de montagem
Com os componentes separados agora você pode montar a comunicação serial em seu PIC16F877A, para isso pegue o módulo USB Serial e observe o esquema com as ligações atentamente.

A montagem deve ficar semelhante a imagem abaixo.

Para este projeto, a fonte de alimentação com regulador de tensão LM7805 é excluída, pois será utilizada a alimentação da USB do computador, sendo gerenciada pelo módulo Ch340g, consumindo em média 6mA. Conecte dois fios jumper macho-fêmea nos pinos VCC e 5V do módulo para o 5V do protoboard. Os pinos do PIC16F877A responsáveis pela comunicação UART são os pinos 25 e 26, para isso conecte o TXD no RX (26), RXD no TX (25) e GND no GND do protoboard.
Coloque os 4 resistores limitadores de corrente de 220Ω e os 4 LEDs em modo current source nos pinos 19, 20, 21 e 22 do PIC.
É necessário instalar o Driver CH340g disponíveis para sistemas operacionais Windows 86x e 64x. Para instalar corretamente, o módulo deve estar conectado na porta USB do computador. Depois verifique no gerenciador de dispositivos do Windows qual a porta serial (COM) o módulo foi instalado. Qualquer dúvida sobre o módulo Serial USB CH340g consulte seu datasheet.
Desenvolvendo o firmware
Primeiramente é importante possuir uma IDE e compilador para desenvolver um firmware que controle o PIC16F877A. Depois de instalar o MPLAB X e o compilador XC8, crie um projeto novo na IDE com o nome de "COMPic" e adicione um arquivo main.c com o nome de "led.c". Para a comunicação UART funcionar é preciso implementar uma biblioteca no projeto.
Faça o download da Biblioteca UART, pegue o arquivo header uart.h e cole na pasta de seu projeto. Depois adicione o arquivo uart.h no projeto conforme as imagens abaixo.


Com a biblioteca UART adicionada cole este código abaixo na IDE e compile clicando no botão Build Project. Se apareceu a mensagem no painel Output da IDE "BUILD SUCCESSFUL" seu código foi compilado com sucesso. Este código é responsável em acender e apagar os 4 LEDs, para isso ele recebe um carácter para acender ou apagar o LED que você escolheu, mas quem envia? Vamos ver no próximo capítulo! É recomendável que você estude os registradores do PIC utilizando o compilador XC8. Depois grave o firmware em hexadecimal no PIC com um gravador universal de 40 pinos.
/*
* File: led.c
* Author: Ana Paula Messina - tecdicas
*
* Created on 8 de Novembro de 2017, 12:50
* Firmware para acender e apagar LEDs via comunicação serial UART
*/
#define _XTAL_FREQ 16000000 // 16 MHz
#include <xc.h>
#include "uart.h" // Biblioteca UART
// Padrão de configurações
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// Variável para guardar a opção
char op;
// Procedimentos para acender e apagar os LEDs
void led1()
{
if(RD0 == 1)
{
RD0 = 0;
}
else
{
RD0 = 1;
}
}
void led2()
{
if(RD1 == 1)
{
RD1 = 0;
}
else
{
RD1 = 1;
}
}
void led3()
{
if(RD2 == 1)
{
RD2 = 0;
}
else
{
RD2 = 1;
}
}
void led4()
{
if(RD3 == 1)
{
RD3 = 0;
}
else
{
RD3 = 1;
}
}
void main(void)
{
// Seta as portas D0, D1, D2 e D3 como OUTPUT
TRISD = (0 << TRISD0)||(0 << TRISD1)||(0 << TRISD2)||(0 << TRISD3);
// Inicializa a porta serial com 9600 baudrate
UART_Init(9600);
while(1)
{
// Se a serial estiver disponível
if(UART_Data_Ready())
{
// Opção que será interpretada
op = UART_Read();
if (op == ('1') )
{
led1();
}
else if (op == ('2') )
{
led2();
}
else if (op == ('3') )
{
led3();
}
else if (op == ('4') )
{
led4();
}
}
}
}
Enviando dados via comunicação serial
Para enviar os dados por uma comunicação serial UART foi desenvolvido um pequeno software com a linguagem C# utilizando a IDE oficial da Microsoft, o Visual Studio 2017 Community. Para este tutorial é recomendado que você tenha uma experiência básica na IDE e na linguagem para entender o que foi desenvolvido.
Para isso abra o seu Visual Studio 2017 e crie um novo projeto em C# para aplicativo Windows Forms, coloque o nome de "COMPicLED", selecione o diretório para salvar o projeto e de OK.


Faça uma tela simples com 4 botões e coloque as propriedades a seguir:
- No Form coloque o Name de FrmLED e o Text de COMPicLED.
- No botão 1 coloque o Name de btnLed1 e o Text de LED 1.
- No botão 2 coloque o Name de btnLed2 e o Text de LED 2.
- No botão 3 coloque o Name de btnLed3 e o Text de LED 3.
- No botão 4 coloque o Name de btnLed4 e o Text de LED 4.
As cores dos botões são feitas com a propriedade BackColor e a fonte em Font, use sua criatividade!

Para acessar o código do Form1.cs pressione F7 e digite o seguinte código.
using System;
using System.IO.Ports;
using System.Windows.Forms;
/// <summary>
/// Pequeno software desenvolvido para enviar dados via
/// comunicação serial para controlar LEDs com PIC16F877A
///
/// Desenvolvido por Ana Paula Messina - Tec Dicas
/// 08/11/2017
/// </summary>
namespace COMPicLED
{
public partial class FrmLED : Form
{
SerialPort s;
public FrmLED()
{
InitializeComponent();
s = new SerialPort();
s.PortName = "COM4"; // Mude conforme a sua porta serial
s.BaudRate = 9600;
}
private void Porta1()
{
AcenderLed("1"); // OP 1
}
private void Porta2()
{
AcenderLed("2"); // OP 2
}
private void Porta3()
{
AcenderLed("3"); // OP 3
}
private void Porta4()
{
AcenderLed("4"); // OP 4
}
private void AcenderLed(string led)
{
if (!s.IsOpen) // Se a porta serial não estiver aberta
{
try
{
s.Open(); // Abre a porta
s.Write(led); // Escreve a opção
s.Close(); // Fecha
}
catch
{
MessageBox.Show("Conecte o seu dispositivo na porta USB.", "Atenção",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
// Eventos dos botões
private void btnLed1_Click(object sender, EventArgs e)
{
Porta1();
}
private void btnLed2_Click(object sender, EventArgs e)
{
Porta2();
}
private void btnLed3_Click(object sender, EventArgs e)
{
Porta3();
}
private void btnLed4_Click(object sender, EventArgs e)
{
Porta4();
}
}
}
Compile o código para verificar se está tudo certo e depois conecte seu PIC na porta USB e veja o resultado!
O vídeo abaixo é do projeto em sua primeira versão, onde utilizava o módulo de fonte de alimentação, porém podemos observar o mesmo resultado nos LEDs.
Comente qual foi sua experiência em desenvolver este projeto ou tire suas dúvidas!
Se inscreva no canal do YouTube para mais conteúdo de eletrônica digital e embarcados!