Envoyez et recevez des données avec l’USART matériel du PIC16F877A
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 :
RC6/TX/CK → transmission
RC7/RX/DT → réception
| Registre | Rôle |
|---|---|
| SPBRG | Définit le baud rate |
| TXSTA | Configuration de l’émetteur (TX) |
| RCSTA | Configuration du récepteur (RX) |
| TXREG | Registre d’envoi |
| RCREG | Registre de réception |
| PIR1 | Flags TXIF / RCIF |
| PIE1 | Interruptions série (optionnel) |
Le débit série (baud rate) dépend de la fréquence d’horloge et de SPBRG.
SPBRG = (Fosc / (16 × BaudRate)) - 1
Exemple avec Fosc = 4 MHz et 9600 bauds :
SPBRG ≈ 25
Le baud rate doit être identique des deux côtés (PIC et terminal série), sinon les caractères seront illisibles.
#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; }
void UART_Write(char data) { while(!PIR1bits.TXIF); // Attendre que TXREG soit prêt TXREG = data; }
char UART_Read(void) { while(!PIR1bits.RCIF); // Attendre une donnée reçue return RCREG; }
#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); } }
Le PIC reçoit un caractère sur RX puis le renvoie immédiatement sur TX.
void main(void) { char c; ADCON1 = 0x06; UART_Init(); while(1) { c = UART_Read(); UART_Write(c); } }