Como fazer comunicação serial entre um software e o PIC16F877A

Aprimore seus projetos implementando uma comunicação serial UART com o seu PIC e um software desenvolvido com a linguagem C#

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 Tec Dicas 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:

Pinagem do PIC16F877A - Datasheet Microchip
Pinagem do PIC16F877A - Datasheet Microchip

Materiais

Para construir uma comunicação serial no PIC16F877A precisamos da estrutura básica montada no protoboard e depois pegue uma caneta e um papel para anotar os seguintes componentes necessários:

  • 1 Módulo conversor USB Serial Ch340/Ch340g.
  • Cabos jumpers Macho - Macho e Macho - Fêmea.
  • 4 Resistores de 220 ohms.
  • 4 LEDS.

Montando o PIC

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:

Esquema do PIC16F877A no protoboard com comunicação serial UART
Esquema do PIC16F877A no protoboard com comunicação serial UART
PIC16F877A no protoboard com comunicação serial UART
PIC16F877A no protoboard com comunicação serial UART

Com o módulo USB Serial em mãos pegue 3 cabos Macho - Fêmea e encaixe nos pinos GND, RXD, TXD e deixe o jumper amarelo ligado no VCC e 5V, pois será utilizado a alimentação do computador. Se o módulo não tiver este jumper, coloque um cabo no VCC e conecte no 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 de 220 ohms e os 4 LEDs nos pinos 19, 20, 21 e 22 do PIC.

É necessário instalar o CH340g Driver 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 um 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:

Clique nas imagens para ampliar

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 - Tec Dicas
 *
 * Created on 8 de Novembro de 2017, 12:50
 * Firmware para acender e apagar LEDs via comunicação serial UART
 */

#define _XTAL_FREQ 20000000 // 20 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)

char op; // Variável para guardar a opção

// Procedimentos para acender e apagar os LEDs
void led1()
{
    if(PORTDbits.RD0 == 1)
    {
        PORTDbits.RD0 = 0;
    }
    else
    {
        PORTDbits.RD0 = 1;
    }
}

void led2()
{
    if(PORTDbits.RD1 == 1)
    {
        PORTDbits.RD1 = 0;
    }
    else
    {
        PORTDbits.RD1 = 1;
    }
}

void led3()
{
    if(PORTDbits.RD2 == 1)
    {
        PORTDbits.RD2 = 0;
    }
    else
    {
        PORTDbits.RD2 = 1;
    }
}

void led4()
{
    if(PORTDbits.RD3 == 1)
    {
        PORTDbits.RD3 = 0;
    }
    else
    {
        PORTDbits.RD3 = 1;
    }
}

void main(void)
{
    // Seta as portas D0, D1, D2 e D3 como OUTPUT
    TRISD = (0 << TRISD0)||(0 << TRISD1)||(0 << TRISD2)||(0 << TRISD3);
    
    UART_Init(9600); // Inicializa a porta serial com 9600 baudrates
    
    while(1)
    {
        if(UART_Data_Ready()) // Se a serial estiver disponível
        {
            op = UART_Read(); // Opção que será interpretada
            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.

Clique nas imagens para ampliar

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!

Programa COMPicLED para realizar comunicação serial UART com um PIC16F877A
Software COMPicLED para realizar comunicação serial UART com um PIC16F877A

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, ligue o módulo de fonte na energia e veja o resultado!

PIC16F877A no protoboard com comunicação serial UART controlado pelo sistema COMPicLED
PIC16F877A no protoboard com comunicação serial UART controlado pelo software COMPicLED

Comente qual foi sua experiência em desenvolver este projeto ou tire suas dúvidas!


Comentários



Voltar ao topo
Aguarde..