🛠 Apprivoiser les registres modernes de l'ATmega4809 : le timer TCB
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
- 1 × Arduino Nano Every
- Cable micro-USB
- Opcional: analizador lógico en el pin 13 para medir el periodo
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.
- Buscar
TCCR1B,OCR1A,TIMSK1: estos registros no existen en el 4809; la familia AVRex utiliza TCA0/TCA1, TCB0 a TCB3, etc. Lea el esquema de pines y el archivopins_arduino.hde la variantenona4809. - Olvidar reconocer
INTFLAGSen la ISR: interrupción permanente, el programa parece congelado. - Divisor de reloj incorrecto:
CLKSELofrece SYSCLK, /2, /16, /128, /256, o el reloj externo — un CCMP calculado para /256 con /2 da una frecuencia 128 veces demasiado alta. - Escribir en los registros de un TCB ya requisado por el core para el PWM (
analogWrite): verifique qué temporizador sirve a qué pin antes de hacerlo. seiolvidado: las interrupciones globales permanecen enmascaradas, ninguna ISR se ejecuta.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
multi-serie.inoArduinoadc-filtre.inoArduinointerrupt-bouton.inoArduinonvm-consignes.inoArduinosommeil-every.inoArduinowatchdog-secours.inoArduino