🛠 Programmer aux registres : interruption Timer/Counter1

Arduino Leonardo — Fiche carte · avance · Schéma : IMG-leonardo-avance-7-leonardo-registres-avr-interruption-timer.svg — Broche PB7 (D13) de l'ATmega32u4 basculée par l'ISR du Timer1 en mode CTC, registre TCCR1B/OCR1A et signal créneau à 1 Hz

Objectifs

Sortir de l'API Arduino pour piloter l'ATmega32u4 « à nu » : configurer le Timer/Counter1 en mode CTC (Clear Timer on Compare Match) avec un diviseur de 1024, déclencher une interruption matérielle à 1 Hz, et basculer la LED de la broche 13 (PB7) directement dans le registre PINB. Vous comprendrez le chemin complet : horloge 16 MHz, prescaler, OCR1A, vecteur d'interruption, et pourquoi une ISR doit rester minimale.

Matériel

Code complet

// Clignotement 0,5 Hz par interruption Timer/Counter1 en mode CTC
// 16 MHz / 1024 (prescaler) / 15625 = 1 Hz d'increment compare

volatile uint8_t clignotements = 0;

void setup {
  DDRB |= (1 << DDB7);          // PB7 (Arduino D13) en sortie
  noInterrupts;
  TCCR1A = 0;
  TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10); // mode CTC, prescaler 1024
  TCNT1  = 0;
  OCR1A  = 15624;               // 16e6 / 1024 / (15624+1) = 1 Hz
  TIMSK1 |= (1 << OCIE1A);      // autorise l'interruption Compare Match A
  interrupts;
}

ISR(TIMER1_COMPA_vect) {
  PINB = (1 << PINB7);          // écriture de 1 dans PINB = bascule la broche
  clignotements++;
}

void loop {
  // Le travail se fait dans l'ISR ; la boucle principale reste libre.
  // Exemple : Serial toutes les 2 bascules (0,5 Hz) si besoin.
}

Vérification attendue

La LED clignote à 0,5 Hz (une bascule par seconde, donc une extinction/allumage toutes les 2 s). Vérifiez la précision en comparant 60 clignotements à une montre : l'erreur vient uniquement de la tolérance du quartz 16 MHz. Suspendez le loop avec delay : le clignotement continue, preuve que c'est bien le timer et une interruption qui pilotent la broche.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels