Chaque module contient un guide détaillé sur le sujet traité :
| Module | Sujet | Guide |
|---|---|---|
| Module00 | Makefiles | MAKEFILE_GUIDE.md |
| Module01 | Timers | TIMERS_GUIDE.md |
| Module02 | UART | UART_GUIDE.md |
| Module03 | PWM | PWM_GUIDE.md |
| Module04 | Interrupts | INTERRUPTS_GUIDE.md |
| Module05 | ADC | ADC_GUIDE.md |
| Module06 | I2C | I2C_GUIDE.md |
| Module07 | EEPROM | EEPROM_GUIDE.md |
| Module08 | SPI | SPI_GUIDE.md |
Ouvrir Windows Powershel en tant qu'administrateur, puis :
| Étape | Commande | Objectif |
|---|---|---|
| 1 | usbipd list |
List les ports et trouve le microcontrolleur |
| 2 | usbipd detach --busid x-x |
Libère le port x-x |
| 3 | usbipd attach --wsl --busid x-x |
Attache au bon WSL |
Et finalement sur le terminal WSL :
| Étape | Commande | Objectif |
|---|---|---|
| 4 | ls /dev/ttyUSB* |
Quelque chose comme /dev/ttyUSB0 |
| 5 | make flash (ou avrdude ...) |
Flashe le code |
Un microcontrôleur doit parfois échanger des données avec un autre appareil :
- ton PC (via USB),
- un autre microcontrôleur,
- un capteur ou module externe (GPS, Bluetooth, etc.). Il existe deux grands types de communication :
| Type | Exemple Description |
|---|---|
| Parallèle | ancien bus IDE, vieux écrans plusieurs fils → chaque bit passe sur un fil séparé |
| Série | USB, UART, SPI, I2C… 1 seul fil pour envoyer les bits un à un, l’un après l’autre |
avr-gcc→ Compile ton code C pour l’architecture AVRavr-objcopy→ Convertit le binaire en format.hexavrdude→ Transfère le programme sur la carte via USB
- Port
B= broches numériques 8 à 13 (souvent reliées à LEDs, SPI, etc.) - Port
C= broches analogiques (A0–A5) - Port
D= broches 0–7 (souvent RX/TX, boutons, etc.) Chacun de ces ports est contrôlé par 3 registres.
Un registre est une petite zone mémoire directement à l’intérieur du microcontrôleur, souvent de 8 bits.
Chaque bit représente un interrupteur matériel 🕹️, qui contrôle une fonction très précise du processeur ou d’un périphérique (GPIO, Timer, UART, etc.).
En C, les registres sont déclarés sur la librairie <avr/io.h>.
| Nom | Signification | Exemple |
|---|---|---|
| DDRx | Data Direction Register | configure la direction (entrée ou sortie) |
| PORTx | Output Register | crit un état logique/valeur (HIGH ou LOW) |
| PINx | Input Register | lit l’état logique/valeur d’une broche (si c'est une entrée) |
1 octet = 8 bits
Exemple : 0b10101100 (le 0b indique du binaire en C).
Chaque bit correspond à une puissance de 2 :
bit: 7 6 5 4 3 2 1 0
val: 128 64 32 16 8 4 2 1
| Opérateur | Nom | Exemple | Résultat |
|---|---|---|---|
& |
ET logique | a & b |
1 si les deux bits sont 1 |
| |
OU logique | a | b |
1 si au moins un bit est 1 |
^ |
XOR (OU exclusif) | a ^ b |
1 si un seul des deux bits est 1 |
~ |
NON logique | ~a |
inverse tous les bits |
<< |
Décalage à gauche | 1 << 3 → 0b00001000 |
utile pour positionner un bit |
>> |
Décalage à droite | 0b1000 >> 3 → 0b00000001 |
inverse du précédent |
Exemple :
PORTB |= (1 << PB0);→ met à 1 le bit 0 sans toucher aux autres bits.PORTB &= ~(1 << PB0);→ met à 0 le bit 0 sans affecter les autres.if (PINB & (1 << PB1)) { // le bouton relié à PB1 est pressé }→ l'input de la broche B(1 << 0) = 0001→ est unmask,1 << 0veut dire : décale le 1 de zéro position → donc(1 << 0) = 0b00000001(en binaire) =1(en décimal).
Une résistance qui "tire vers le haut" (VCC) le signal quand rien n'est connecté.
VCC (+5V)
│
[SW1]
│
├──────→ PD2 (lecture)
│
??? ← Pin FLOTTANTE (lecture aléatoire)
VCC (+5V)
│
├─── [Pull-up ~47kΩ] ← Maintient HIGH par défaut
│ │
[SW1] │
│ │
├────────────────┴──→ PD2 (lecture)
│
GND (0V)
DDRD &= ~(1 << PD2); // 1. Configurer en ENTRÉE
PORTD |= (1 << PD2); // 2. Activer pull-up interne| Bouton | Circuit | PD2 |
|---|---|---|
| Relâché | VCC → Pull-up → PD2 | HIGH (5V) |
| Appuyé | VCC → SW1 → GND | LOW (0V) |
if (!(PIND & (1 << PD2))) // Si LOW → bouton appuyéLes boutons mécaniques ont des rebonds pendant 5-50ms :
Appui physique :
┌─────────────────────
│
────────┘
Signal électrique réel :
┌─┐ ┌──┐ ┌──────────
│ │ │ │ │
────────┘ └─┘ └──┘
↑─────────↑
Rebonds (5-50ms)
if (!(PIND & (1 << PD2))) // 1. Détection initiale
{
_delay_ms(50); // 2. Attendre stabilisation (50ms)
if (!(PIND & (1 << PD2))) // 3. Confirmer que toujours appuyé
{
// Action (incrément, etc.)
while (!(PIND & (1 << PD2))); // 4. Attendre relâchement
_delay_ms(50); // 5. Anti-rebond du relâchement
}
}Pourquoi la double vérification ?
- Filtre les parasites électriques
- Garantit que c'est un vrai appui stable
- Évite les faux positifs
screen est un terminal virtuel qu’on peut attacher directement à un périphérique série (/dev/ttyUSB0, /dev/ttyACM0, etc.).
Il sert à écouter et envoyer des données sur le port série de ton microcontrôleur.
| Action | Commande |
|---|---|
Lancer screen |
screen /dev/ttyUSB0 115200 |
| Quitter proprement | Ctrl + A, puis Ctrl + D ou taper :quit |
| Détacher | Ctrl + A, D |
| Lister les sessions | screen -ls |
| Rejoindre une session | screen -r |
| Forcer la fermeture | sudo fuser -k /dev/ttyUSB0 |