This sketch blinks an LED on D10 (on a Uno) at one second intervals. It does not use delay
, micros
, millis
or any unsigned long variables (apart from a constant).
const int STROBE_FREQ = 1000; // sets the period in milliseconds
const unsigned long countTo = ((float) F_CPU / 1024.0) / (1000.0 / STROBE_FREQ);
void setup ()
{
// D10 to output
bitSet (DDRB, 2);
// Fast PWM top at OCR1A
TCCR1A = bit (WGM10) | bit (WGM11); // fast PWM
TCCR1B = bit (WGM12) | bit (WGM13) | bit (CS12) | bit (CS10); // fast PWM, prescaler of 1024
OCR1A = countTo - 1; // zero relative
OCR1B = (countTo / 2) - 1; // 50% duty cycle
bitSet (TCCR1A, COM1B1); // clear OC1B on compare
} // end of setup
void loop ()
{
// do something useful
}
It frees up the main loop to do something useful without worrying about time taken to do the blinking.
For more details see my page about timers.