🛠 Timer1 et registres AVR : le tempo sans delay
Objetivos
Programar el ATmega328P « en metal desnudo »: timer1 en modo CTC, registros TCCR1A/TCCR1B/TCNT1/OCR1A, cálculo del prescaler a 8 MHz, conmutación de salida mediante registro GPIO. La ficha de la LilyPad es formal — no incluye radio integrada (Wi-Fi/Bluetooth solo mediante módulos externos cosidos) — por lo tanto, el dominio de los registros y los temporizadores es lo que desbloquea los cronometrajes precisos y el ahorro de energía.
Material
- 1 LilyPad SimpleSnap (ATmega328P @ 8 MHz)
- 1 LED en la pastilla 9 (pin Arduino 9 = PB1 = salida OC1A del timer1 en el ATmega328P)
- >
- Adaptador FTDI para la escala de tiempo serie (opcional)
Código completo
// Timer1 en CTC : carré précis sur la pastille 9 (PB1), sans delay ni tone
// 8 MHz / prescaler 8 = 1 MHz au timer ; 1 MHz / (OCR1A+1 = 250) = 4 kHz d'ISR
volatile uint16_t battements = 0;
void setup {
DDRB |= _BV(PB1); // pastille 9 = PB1 en sortie
TCCR1A = 0; // mode normal côté comparaison de sortie
TCCR1B = _BV(WGM12) // CTC : TCNT1 repart à 0 sur comparaison avec OCR1A
| _BV(CS11); // prescaler /8 -> horloge timer à 1 MHz
OCR1A = 249; // 1 MHz / 250 = une ISR toutes les 250 µs
TIMSK1 = _BV(OCIE1A); // autoriser l'ISR « comparaison A » du timer1
sei; // activer les interruptions globales
}
ISR(TIMER1_COMPA_vect) { // exécutée toutes les 250 µs
if (++battements >= 2000) { // 2000 x 250 µs = 0,5 s
battements = 0;
PINB = _BV(PB1); // écrire 1 dans PINB bascule la broche (XOR matériel)
}
}
void loop {
// 100 % libre : lecture de capteurs, calculs, ou sleep entre deux battements
}
Verificación esperada
El LED parpadea a 1 Hz (0,5 s por estado) con la precisión del cristal de 8 MHz, sin un solo delay: loop permanece disponible para otras tareas o para el sueño. Al cambiar OCR1A, la frecuencia sigue exactamente el cálculo 8 MHz / 8 / 250 / 2000 / 2. Un osciloscopio lógico en la pastilla observa una señal cuadrada nítida de 1 Hz.
Errores frecuentes
- Precalcular OCR1A para 16 MHz: todo parpadea el doble de rápido — el LilyPad funciona a 8 MHz, hay que rehacer el cálculo.
- Olvidar sei o el bit OCIE1A de TIMSK1: la ISR nunca se dispara, el LED permanece fijo.
- Modificar TCCR1B sin poner TCNT1 a 0: se produce una interrupción inmediata con un contador obsoleto.
- Intentar usar tone en paralelo en la misma pastilla: tone (núcleo de Arduino) y este código compiten por el timer1.
- Buscar una radio integrada: ninguna LilyPad tiene Wi-Fi/Bluetooth integrado; las radios son módulos externos cosidos, de lo contrario, quedarse con los periféricos AVR (timer, ADC, UART, SPI, I²C internos).
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinoluxmetre-couture.inoArduinointerrupteur-tilt.inoArduinoservo-balayage.inoArduino