🛠 Timer1 et registres AVR : le tempo sans delay

LilyPad Arduino · avance · Schéma : IMG-lilypad-avance-3-lilypad-registres-timer1.svg — ATmega328P en coupe avec bloc timer1 CTC, registres OCR1A et TCNT1, prescaler /8 et signal carré de sortie sur la pastille 9.

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales