🛠 Apprivoiser les registres modernes de l'ATmega4809 : le timer TCB

Arduino Nano Every · avance · Schéma : IMG-nano-every-avance-1-nanoevery-registres-avr-tcb.svg — Puce ATmega4809 schématique avec le bloc timer TCB0 en évidence, ses registres CTRLA, CCMP et INTCTRL dessinés en pile, et une horloge 20 MHz en entrée

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels