constexpr uint32_t timer2Prescaler = 64;
constexpr uint32_t deltaT_ms = 1;
constexpr uint8_t seuilOCR = (F_CPU / timer2Prescaler) * deltaT_ms / 1000UL - 1;
volatile unsigned long compteur = 0;
ISR(TIMER2_COMPA_vect) {
compteur++;
}
void setup() {
noInterrupts(); // désactive les interruptions globales
TCCR2A = 1 << WGM21; // timer2 en mode CTC
TCCR2B = 1 << CS22; // préscaler = 64
OCR2A = seuilOCR; // valeur calculée pour un pas de temps en millisecondes
TIMSK2 = 1 << OCIE2A; // autorise l'interruption sur comparaison A du timer2
interrupts(); // réactive les interruptions globales
Serial.begin(115200);
Serial.println("\n--------------------");
Serial.print("F_CPU = "); Serial.print(F_CPU); Serial.println(" Hz");
Serial.print("∆t = "); Serial.print(deltaT_ms); Serial.println(" ms");
Serial.print("Seuil = "); Serial.println(seuilOCR);
Serial.println("--------------------");
}
void loop() {
bool tick = false;
// section critique
noInterrupts(); // désactive les interruptions globales
if (tick = (compteur >= 1000)) compteur = 0;
interrupts(); // réactive les interruptions globales
if (tick) {
Serial.println("tick");
}
}