📡 Qu’est-ce que l’UART ?

L’UART (Universal Asynchronous Receiver Transmitter) permet d’échanger des données série entre le microcontrôleur et un autre appareil : ordinateur, adaptateur USB-série, module Bluetooth, autre microcontrôleur, etc.

Sur le PIC16F877A, le module série matériel s’appelle souvent USART. Il possède :

💡 Broches UART du PIC16F877A

RC6/TX/CK → transmission

RC7/RX/DT → réception

⚙️ Registres principaux

RegistreRôle
SPBRGDéfinit le baud rate
TXSTAConfiguration de l’émetteur (TX)
RCSTAConfiguration du récepteur (RX)
TXREGRegistre d’envoi
RCREGRegistre de réception
PIR1Flags TXIF / RCIF
PIE1Interruptions série (optionnel)

🔢 Réglage du baud rate

Le débit série (baud rate) dépend de la fréquence d’horloge et de SPBRG.

Formule en mode asynchrone haute vitesse (BRGH = 1)

SPBRG = (Fosc / (16 × BaudRate)) - 1

Exemple avec Fosc = 4 MHz et 9600 bauds :

SPBRG ≈ 25

⚠️ Important

Le baud rate doit être identique des deux côtés (PIC et terminal série), sinon les caractères seront illisibles.

📝 Initialisation UART (9600 bauds)

C (XC8)
#include <xc.h>
#define _XTAL_FREQ 4000000

void UART_Init(void) {
    // RC6 = TX en sortie, RC7 = RX en entrée
    TRISCbits.TRISC6 = 1; 
    TRISCbits.TRISC7 = 1;

    // Baud rate = 9600 pour Fosc = 4 MHz, BRGH = 1
    SPBRG = 25;

    // TXSTA : BRGH=1 (haute vitesse), TXEN=1 (émission activée)
    TXSTAbits.BRGH = 1;
    TXSTAbits.SYNC = 0;
    TXSTAbits.TXEN = 1;

    // RCSTA : SPEN=1 (port série activé), CREN=1 (réception continue)
    RCSTAbits.SPEN = 1;
    RCSTAbits.CREN = 1;
}

📤 Envoyer un caractère

TX
void UART_Write(char data) {
    while(!PIR1bits.TXIF); // Attendre que TXREG soit prêt
    TXREG = data;
}

📥 Recevoir un caractère

RX
char UART_Read(void) {
    while(!PIR1bits.RCIF); // Attendre une donnée reçue
    return RCREG;
}

⚠️ Erreurs de réception

  • OERR (Overrun Error) : trop de données reçues sans lecture
  • FERR (Framing Error) : erreur de trame, souvent liée au baud rate

🧪 Exemple complet : envoyer “Bonjour” en boucle

Exemple complet
#include <xc.h>
#define _XTAL_FREQ 4000000

void UART_Init(void) {
    TRISCbits.TRISC6 = 1;
    TRISCbits.TRISC7 = 1;

    SPBRG = 25;

    TXSTAbits.BRGH = 1;
    TXSTAbits.SYNC = 0;
    TXSTAbits.TXEN = 1;

    RCSTAbits.SPEN = 1;
    RCSTAbits.CREN = 1;
}

void UART_Write(char data) {
    while(!PIR1bits.TXIF);
    TXREG = data;
}

void UART_Write_Text(const char* txt) {
    while(*txt) {
        UART_Write(*txt++);
    }
}

void main(void) {
    ADCON1 = 0x06; // Met les broches en numérique si besoin
    UART_Init();

    while(1) {
        UART_Write_Text("Bonjour depuis le PIC16F877A !\r\n");
        __delay_ms(1000);
    }
}

🔁 Exemple : écho série

Le PIC reçoit un caractère sur RX puis le renvoie immédiatement sur TX.

Echo UART
void main(void) {
    char c;
    ADCON1 = 0x06;
    UART_Init();

    while(1) {
        c = UART_Read();
        UART_Write(c);
    }
}

🛠️ Applications courantes de l’UART