Guia Prático: Comunicação Serial USART para PICs e IoT

A comunicação serial via USART (Universal Synchronous Asynchronous Receiver Transmitter) é essencial para integração de sistemas embarcados em IoT, automação industrial e dispositivos médicos. Este guia combina fundamentos teóricos, configurações práticas e técnicas avançadas para dominar a implementação em microcontroladores PICPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesAprenda sobre microcontroladores PIC com este guia completo. Conheça a teoria, as práticas de otimização e casos reais para aplicações embarcadas de sucesso., incluindo protocolos industriais, otimizações de hardware e estratégias de depuração.

Sumário🔗

Fundamentos da Comunicação Serial🔗

Modos de Operação

1. Assíncrono (UART):

2. Síncrono:

Estrutura do Frame USART

ComponenteBitsDescrição
Start Bit1Transição alta→baixa para sincronização
Dados5-9Configurável como LSB-first ou MSB-first
Paridade0-1Even, Odd, Mark, Space ou None
Stop Bit(s)1-2Garante tempo morto entre frames

Cálculo de Baud Rate:

Para PICs com BRGH (High Baud Rate Select):

  • BRGH = 0:
\[ \text{Baud Rate} = \frac{F_{osc}}{64 \times (SPBRG + 1)} \]
  • BRGH = 1:
\[ \text{Baud Rate} = \frac{F_{osc}}{16 \times (SPBRG + 1)} \]

Exemplo para 115200 bps @16MHz:

\[

SPBRG = \frac{16,000,000}{16 \times 115200} - 1 \approx 8 \quad (\text{Erro 0.16\%})

\]

Arquitetura e Registradores do USART em PICs🔗

Diagrama de Blocos

graph TD A[Transmitter] --> B[Baud Rate Generator] B --> C[Receiver]

Registradores Cruciais

RegistradorBits ImportantesFunção
TXSTATXEN (Bit 5), SYNC (Bit 4)Controle de transmissão
RCSTASPEN (Bit 7), CREN (Bit 4)Controle de recepção
SPBRGValor numéricoGeração do baud rate
PIE1RCIE (Bit 5)Habilitação de interrupções

Configuração Detalhada do Módulo USART🔗

Fluxo de Inicialização (PIC18F4550):

1. Configurar pinos TX/RX (TRISC)

2. Calcular SPBRG para o baud rate desejado

3. Habilitar módulo e definir modo (SYNC/ASYNC)

4. Configurar interrupçõesInterrupções (Interrupts) em PIC: Conceitos, Configuração e ExemplosInterrupções (Interrupts) em PIC: Conceitos, Configuração e ExemplosAprenda os segredos das interrupções em sistemas PIC. Domine técnicas avançadas, gestão de múltiplas interrupções e otimização para desempenho crítico. (opcional)

Código com InterrupçõesInterrupções (Interrupts) em PIC: Conceitos, Configuração e ExemplosInterrupções (Interrupts) em PIC: Conceitos, Configuração e ExemplosAprenda os segredos das interrupções em sistemas PIC. Domine técnicas avançadas, gestão de múltiplas interrupções e otimização para desempenho crítico. e Tratamento de Erros:

#include <xc.h>
volatile char receivedData;
void USART_Init(unsigned long baudrate) {
    TRISC6 = 0;  // TX como saída
    TRISC7 = 1;  // RX como entrada
    SPBRG = (unsigned char)((_XTAL_FREQ / (64UL * baudrate)) - 1;
    TXSTAbits.SYNC = 0;   // Modo assíncrono
    RCSTAbits.SPEN = 1;   // Habilita módulo
    TXSTAbits.TXEN = 1;   // Habilita transmissão
    RCSTAbits.CREN = 1;   // Habilita recepção
    // Interrupções
    PIE1bits.RCIE = 1;
    INTCONbits.PEIE = 1;
    INTCONbits.GIE = 1;
}
void __interrupt() ISR() {
    if (PIR1bits.RCIF) {
        if (RCSTAbits.OERR) { // Trata overrun
            RCSTAbits.CREN = 0;
            RCSTAbits.CREN = 1;
        }
        receivedData = RCREG;
        PIR1bits.RCIF = 0;
    }
}

Exemplos Práticos e Protocolos Avançados🔗

Buffer Circular para Recepção

#define BUFFER_SIZE 64
char rxBuffer[BUFFER_SIZE];
volatile uint8_t head = 0, tail = 0;
char USART_ReadBuffer() {
    if (head == tail) return 0;
    char data = rxBuffer[tail];
    tail = (tail + 1) % BUFFER_SIZE;
    return data;
}

Protocolo Modbus RTU

Estrutura do Quadro:

| Endereço | Função | Dados         | CRC16      |
| 1 byte   | 1 byte | 0-252 bytes   | 2 bytes    |

ImplementaçãoEstrutura de Código em C para PIC: Definições e Convenções EssenciaisEstrutura de Código em C para PIC: Definições e Convenções EssenciaisDescubra técnicas avançadas de programação em C para microcontroladores PIC. Aprenda otimização de memória, gestão de interrupções e depuração eficaz. de CRC-16:

uint16_t Modbus_CRC16(const uint8_t *data, uint8_t length) {
    uint16_t crc = 0xFFFF;
    for (uint8_t pos = 0; pos < length; pos++) {
        crc ^= data[pos];
        for (uint8_t i = 8; i != 0; i--) {
            if (crc & 0x0001) {
                crc >>= 1;
                crc ^= 0xA001;
            } else crc >>= 1;
        }
    }
    return crc;
}

Integração com Sistemas Externos🔗

Comunicação com GPS (NMEA 0183)

  • Baud Rate: 4800/9600
  • Decodificação de Sentenças:
if (data == '$') bufferIndex = 0; // Início da mensagem
buffer[bufferIndex++] = data;

Controle de Módulo Wi-Fi ESP8266

  • Comandos AT:
void Send_AT_Command(const char *cmd) {
    DE_RE_PIN = 1; // Modo transmissão
    USART_WriteString(cmd);
    while (!TXSTAbits.TRMT);
    DE_RE_PIN = 0; // Modo recepção
}

RS-485 Multi-drop

void RS485_Send(const char *data) {
    DE_RE_PORT = 1;
    __delay_us(50);
    USART_WriteString(data);
    while (!TXSTAbits.TRMT);
    __delay_us(50);
    DE_RE_PORT = 0;
}

Hardware e Considerações de Projeto🔗

Diagrama de Conexão TTL para RS-232

PIC (5V) → MAX232 → DB9 (PC)
GND compartilhado

Dicas Críticas:

  • Filtros RC: 100Ω + 1nF em linhas longas
  • Isolamento Galvânico: Optoacopladores 6N137 para ambientes ruidosos
  • Terminação RS-485: Resistores de 120Ω nos extremos da rede

Depuração e Tratamento de Erros🔗

Ferramentas Essenciais:

  • Analisador Lógico: Verificação de timing (ex: Saleae Logic)
  • Terminal Serial: Putty, Tera Term, CoolTerm
  • Osciloscópio: Checagem de níveis lógicos

Erros Comuns e Soluções:

ErroCausaSolução
FERRBaud rate incorretoRecalcular SPBRG
OERRBuffer não lidoImplementar buffer circular
Dados InválidosRuído elétricoAdicionar filtros RC

Otimizações e Boas Práticas🔗

1. Controle de Fluxo:

  • Implementar hardware (RTS/CTS) para evitar perda de dados

2. Power Management:

SLEEP();
TXSTAbits.TXEN = 0; // Desliga transmissor em idle

3. Clock de Alta Precisão:

// Configurar PLL para 64MHz (PIC18F45K50)
OSCCON = 0x70;
OSCTUNEbits.PLLEN = 1;

4. DMA para Alta Velocidade:

Próximos Passos:

Explore protocolos como JSON over Serial, implemente correção de erros via Reed-Solomon, ou integre com sistemas IoTProjetos de Internet das Coisas (IoT) usando PIC e Módulos Wi-FiProjetos de Internet das Coisas (IoT) usando PIC e Módulos Wi-FiExplore a integração de microcontroladores PIC com IoT, combinando hardware robusto, segurança avançada e comunicação eficiente para a indústria. usando MQTT-SN. Para desafios avançados, estude a comunicação multi-mestre em redes RS-485 com collision detection!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados