Comprendre les bits pour configurer TRISx et piloter PORTx
Sur un PIC, les registres sont des blocs de bits. Chaque bit contrôle (ou représente) une broche. Sur le PIC16F877A, on manipule principalement :
Le préfixe 0b suivi de bits (0/1) représente une valeur en binaire.
Exemple : 0b00000001
Exemple : mettre RB0 à 1, et laisser les autres bits à 0.
0b00000001 = seul RB0 est à 1
Sur le PIC16F877A, plusieurs broches de PORTA sont analogiques par défaut. Il faut souvent configurer ADCON1 pour les utiliser en numérique.
| Code binaire | Hex | Description |
|---|---|---|
| 0b00000000 | 0x00 | Toutes les broches de PORTB en sortie |
| 0b00000001 | 0x01 | RB0 en entrée, le reste en sortie |
| 0b00001111 | 0x0F | RB0 à RB3 en entrée, RB4 à RB7 en sortie |
| 0b11110000 | 0xF0 | RB4 à RB7 en entrée, RB0 à RB3 en sortie |
| 0b11111111 | 0xFF | Toutes les broches de PORTB en entrée |
TRISx : 1 = entrée / 0 = sortie.
PORTx : 1 = HIGH / 0 = LOW.
#include <xc.h> #define _XTAL_FREQ 4000000 // 1) Configuration des broches analogiques en numérique ADCON1 = 0b00000110; // 2) Direction : RB0 en sortie (ici tout PORTB en sortie) TRISB = 0b00000000; // 3) État initial PORTB = 0b00000000;
PORTB |= 0b00000001; // met RB0 à 1 sans toucher aux autres // ou PORTBbits.RB0 = 1;
PORTB &= 0b11111110; // met RB0 à 0 sans toucher aux autres // ou PORTBbits.RB0 = 0;
Les opérations bit à bit permettent de modifier une seule broche sans casser les autres sorties. C’est indispensable en vrai projet.
// OR (|=) : force un bit à 1 PORTB |= 0b00000001; // RB0 = 1 // AND (&=) : force un bit à 0 (avec un masque) PORTB &= 0b11111110; // RB0 = 0 // XOR (^=) : inverse un bit (toggle) PORTB ^= 0b00000001; // toggle RB0 // Exemple : allumer RB0 + RB1 + RB2 PORTB |= 0b00000111;
Si tu fais PORTB = 0bxxxxxxxx, tu écrases tout le registre.
Pour modifier une seule broche, préfère PORTBbits.RBx ou des masques (|=, &=, ^=).
| Binaire | Hex | Décimal | Broches actives |
|---|---|---|---|
| 0b00000000 | 0x00 | 0 | Aucune |
| 0b00000001 | 0x01 | 1 | RB0 |
| 0b00000010 | 0x02 | 2 | RB1 |
| 0b00000100 | 0x04 | 4 | RB2 |
| 0b00001000 | 0x08 | 8 | RB3 |
| 0b00010000 | 0x10 | 16 | RB4 |
| 0b00100000 | 0x20 | 32 | RB5 |
| 0b01000000 | 0x40 | 64 | RB6 |
| 0b10000000 | 0x80 | 128 | RB7 |
| 0b11111111 | 0xFF | 255 | RB0 à RB7 |
Le PIC16F877A possède plusieurs ports. Pour PORTA, il faut souvent désactiver le mode analogique avant d’utiliser les broches en numérique.
// Désactive les fonctions analogiques sur PORTA / PORTE ADCON1 = 0b00000110; // RA0 en sortie, le reste en entrée TRISA = 0b11111110; // Allumer RA0 PORTA |= 0b00000001; // Éteindre RA0 PORTA &= 0b11111110;