🛠 Manipulation directe des registres PORT : le bit-banging à 16 MHz

Arduino Duemilanove — Fiche carte · avance · Schéma : IMG-duemilanove-avance-2-manipulation-registres-port-avr.svg — boîtier ATmega328 vu de dessus avec les ports PORTB (broches 8 à 13) et PORTD (broches 0 à 7) surlignés, tableau de correspondance broche Arduino → bit de port (broche 13 = PORTB bit 5), oscilloscope montrant un créneau rapide sur la broche 13.

Objectifs

digitalWrite est pratique mais lent sur un AVR 8 bits : une dizaine de cycles par appel, soit un créneau limité à quelques dizaines de kHz. Pour piloter des neopixels, un affichage multiplexé ou un protocole maison, on descend au niveau des registres : DDRx, PORTx, PINx. La table de correspondance officielle broches Arduino ↔ bits de port (PinMapping168) est votre carte de navigation. Vous allez générer un créneau mesurable à l'oscilloscope et écrire dans un port entier d'un seul coup d'écriture.

Matériel

Code complet

// Carre rapide sur la broche 13 = PORTB bit 5 (voir PinMapping168)
// Broches 8..13 = PORTB bits 0..5 ; broches 0..7 = PORTD bits 0..7 ;
// broches analogiques A0..A5 = PORTC bits 0..5.

void setup {
  DDRB |= (1 << DDB5);      // broche 13 en sortie (registre DDR du port B)
  // Equivalence : pinMode(13, OUTPUT);
}

void loop {
  noInterrupts;           // le timer0 du millis perturbe les mesures
  PORTB |=  (1 << PORTB5);  // broche 13 a 1  -> 1 cycle CPU
  PORTB &= ~(1 << PORTB5);  // broche 13 a 0  -> 1 cycle CPU
  // NB : |= et &= font 2 ecritures ; en assembleur, sbi/cbi font 1 cycle.
  interrupts;
}

Écrire 8 LED d'un coup : PORTD = B10101010; place les broches 0–7 dans l'état voulu en une seule instruction (attention : les broches 0/1 sont la liaison série FTDI — ne pas casser le moniteur en plein téléversement).

Vérification attendue

À l'oscilloscope sur la broche 13, un créneau dont la période se compte en centaines de nanosecondes (les boucles C tournent autour de ~1–2 MHz de commutation, bien plus avec sbi/cbi en assembleur) — contre ~50 kHz maximum avec digitalWrite. La LED 13 reste faiblement allumée (PWM naturel par rapport de service). Le test « une écriture, 8 LED » fait basculer tout un port simultanément.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels