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

Arduino Duemilanove — Ficha de placa · 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.

Objetivos

digitalWrite es práctico pero lento en un AVR de 8 bits: una decena de ciclos por llamada, lo que limita la frecuencia a unas pocas decenas de kHz. Para controlar neopíxeles, una pantalla multiplexada o un protocolo propio, hay que bajar al nivel de los registros: DDRx, PORTx, PINx. La tabla oficial de correspondencia pines Arduino ↔ bits de puerto (PinMapping168) es su carta de navegación. Va a generar una señal medible con osciloscopio y escribir en un puerto completo de una sola vez.

Material

Código completo

// 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;
}

Escribir 8 LEDs de una vez: PORTD = B10101010; coloca los pines 0–7 en el estado deseado con una sola instrucción (atención: los pines 0/1 son la conexión serie FTDI — no rompa el monitor mientras se está cargando el programa).

Verificación esperada

Con el osciloscopio en el pin 13, una señal cuyo período se cuenta en cientos de nanosegundos (los bucles en C rondan los ~1–2 MHz de conmutación, mucho más con sbi/cbi en ensamblador) — frente a ~50 kHz máximo con digitalWrite. El LED 13 permanece débilmente encendido (PWM natural por relación de trabajo). La prueba «una escritura, 8 LEDs» hace cambiar todo un puerto simultáneamente.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales