🛠 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

Objetivos

Abandonar la API de Arduino para acceder a los registros: el ATmega4809 NO tiene los antiguos temporizadores T0/T1/T2 del 328P, sino periféricos modernos TCA y TCB. Aquí configuramos un TCB (16 bits, modo de interrupción periódica) que alterna el LED 13 a 0,5 Hz sin delay ni millis, manipulando TCB0.CTRLA, TCB0.CCMP, TCB0.INTCTRL y la bandera INTFLAGS.

Material

Código completo

// 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.
}

Verificación esperada

El LED 13 parpadea a 0,5 Hz (una alternancia por segundo) mientras loop está vacío. Elimine el reconocimiento de INTFLAGS: el LED se enciende fijo (la interrupción se reactiva en bucle) — experiencia pedagógica sobre las banderas. Compare con el tutorial 1: aquí el conteo es por hardware, el código de aplicación permanece 100 % disponible.

Errores frecuentes

> SIN VERIFICAR: asignación exacta de los TCB a los pines en la variante Nano Every — cruzar con pins_arduino.h del core megaavr antes de cualquier uso aplicativo.

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales