🛠 Registres AVR et interruption timer

Arduino Nano (Classic, ATmega328P) · avance · Schéma : IMG-nano-classic-avance-7-nanoc-registres-timer.svg — Arduino Nano, LED sur broche 13, timer1 du ATmega328P en mode CTC déclenché par interruption, chronogramme OCR1A

Objectifs

Sortir de l'abstraction Arduino en programmant directement les registres du ATmega328P : configurer le timer1 en mode CTC (Clear Timer on Compare Match) pour générer une interruption périodique précise, sans dépendre de delay ni de millis. L'ISR ne fait que basculer la LED builtin — la discipline « ISR courte » classique de l'AVR.

Matériel

Code complet

// Timer1 en CTC : interruption ~1 Hz, ISR bascule la LED 13
// 16 MHz / (1024 * 15625) = 1 Hz environ
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_COMPA_vect) {     // appelee a chaque compare match
  PINB |= _BV(PB5);          // bascule directe de la broche 13 (PB5)
}

void setup {
  DDRB |= _BV(DDB5);         // PB5 (broche 13) en sortie
  noInterrupts;
  TCCR1A = 0;                // mode normal d'abord
  TCCR1B = _BV(WGM12);       // CTC sur OCR1A
  TCNT1  = 0;
  OCR1A  = 15624;            // 16e6/1024/15625 = 1 Hz
  TCCR1B |= _BV(CS12) | _BV(CS10);  // prescaler 1024 : démarre
  TIMSK1 |= _BV(OCIE1A);     // autorise l'IT compare match A
  interrupts;
}

void loop {
  // Le coeur tourne sans delay : tout est dans l'ISR
}

Vérification attendue

La LED builtin bascule exactement une fois par seconde, avec une régularité quartzée (le quartz 16 MHz est bien plus stable que les dérives d'un delay imbriqué). Le code occupe quelques centaines d'octets de flash. En coupant l'autorisation d'interruption (cli), la LED se fige immédiatement — preuve que seul le timer travaille.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels