🛠 Registres AVR et interruption timer
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
- 1 × Arduino Nano classique (ATmega328P @ 16 MHz, quartz céramique)
- La LED builtin (broche 13) ; un oscilloscope ou un analyseur logique est un plus pour mesurer la période
- Aucune connexion externe obligatoire
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
- ISR trop longue : appeler Serial.print ou delay dans un ISR bloque les autres interruptions et corrompt millis ; l'ISR doit rester minimale.
- Oublier le bit WGM12 (mode CTC) ou CS12|CS10 (prescaler) : le timer ne démarre jamais, aucune bascule observable.
- Modifier une variable partagée ISR/loop sans volatile ni section critique : le compilateur optimise la lecture et loop ne voit jamais le changement.
- Confondre PB5 et broche 13 : la correspondance physique est propre au bootloader Arduino sur 328P ; vérifier la fiche brochage du boîtier TQFP/MLF.
- >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
buzzer-melodie.inoArduinoservo-sweep.inoArduinoultrason-hcsr04.inoArduinolcd-i2c.inoArduinoeeprom-contre.inoArduinosommeil-watchdog.inoArduino