🛠 Apprivoiser les registres modernes de l'ATmega4809 : le timer TCB
Objectifs
Quitter l'API Arduino pour toucher les registres : l'ATmega4809 n'a PAS les vieux timers T0/T1/T2 du 328P, mais des périphériques modernes TCA et TCB. On configure ici un TCB (16 bits, mode interruption périodique) qui bascule la LED 13 à 0,5 Hz sans delay ni millis, en manipulant TCB0.CTRLA, TCB0.CCMP, TCB0.INTCTRL et le drapeau INTFLAGS.
Matériel
- 1 × Arduino Nano Every
- Câble micro-USB
- Optionnel : logiqueur d'analyse sur broche 13 pour mesurer la période
Code complet
// TCB0 en interruption periodique : toggle LED 13 sans delay
// Horloge noyau 20 MHz, diviseur /256 -> 78125 Hz
// CCMP = 78124 -> debordement 1 Hz -> LED basculee a 0,5 Hz
ISR(TCB0_OVF_vect) {
TCB0.INTFLAGS = TCB_CAPT_bm; // acquitter l'interruption
digitalToggle(LED_BUILTIN); // 13
}
void setup {
pinMode(LED_BUILTIN, OUTPUT);
TCB0.CTRLB = TCB_CNTMODE_INT_gc; // periode simple
TCB0.CCMP = 78124; // 78125 / (78124+1) = 1 Hz
TCB0.INTCTRL = TCB_CAPT_bm; // irq sur comparaison
TCB0.CTRLA = TCB_CLKSEL_CLKDIV256_gc | TCB_ENABLE_bm;
sei; // autoriser les irq
}
void loop {
// Le CPU ne fait rien : c'est le peripherique qui travaille.
}
Vérification attendue
La LED 13 clignote à 0,5 Hz (une bascule par seconde) alors que loop est vide. Supprimez l'acquittement INTFLAGS : la LED s'allume figée (l'interruption redéclenche en boucle) — expérience pédagogique sur les drapeaux. Comparez avec le tuto 1 : ici le comptage est matériel, le code applicatif reste 100 % disponible.
Erreurs fréquentes
- Chercher
TCCR1B,OCR1A,TIMSK1: ces registres n'existent pas sur le 4809 ; la famille AVRex utilise TCA0/TCA1, TCB0 à TCB3, etc. Lisez le schéma des broches et le fichierpins_arduino.hdu variantnona4809. - Oublier d'acquitter
INTFLAGSdans l'ISR : interruption permanente, le programme semble gelé. - Mauvais diviseur d'horloge :
CLKSELpropose SYSCLK, /2, /16, /128, /256, ou l'horloge externe — un CCMP calculé pour /256 avec /2 donne une fréquence 128 fois trop élevée. - Écrire dans les registres d'un TCB déjà réquisitionné par le core pour le PWM (
analogWrite) : vérifiez quel timer sert quelle broche avant. seioublié : le globalement-interrupts reste masqué, aucune ISR ne s'exécute.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
multi-serie.inoArduinoadc-filtre.inoArduinointerrupt-bouton.inoArduinonvm-consignes.inoArduinosommeil-every.inoArduinowatchdog-secours.inoArduino