Guys, I'm using a timer on my project and I want to know what happens if my timer call takes too long. Does the next timer call stops the previous one, or a total mess happens? What will exactly happen? I tried to make it take forever and added a boolean variable check but couldn't make it overrun, not sure what I did wrong. I need to figure out a way to check when overruns happens on my timer call, any ideas?
ISR(TIMER2_COMPA_vect)
{
// CODE HERE
}
void timerStart()
{
float frequency = ((float(midiClockBPM)*float(PPQ))/60.0f);
TCCR2A = 0;
TCCR2B = 0;
bitWrite(TCCR2A, WGM21, 1);
bitWrite(TCCR2B, CS20, 1);
uint32_t ocr = F_CPU / frequency - 1;
uint8_t prescalarbits = 0b001;
if (ocr > 255)
{
ocr = F_CPU / frequency / 8 - 1;
prescalarbits = 0b010;
if (ocr > 255)
{
ocr = F_CPU / frequency / 32 - 1;
prescalarbits = 0b011;
}
if (ocr > 255)
{
ocr = F_CPU / frequency / 64 - 1;
prescalarbits = 0b100;
if (ocr > 255)
{
ocr = F_CPU / frequency / 128 - 1;
prescalarbits = 0b101;
}
if (ocr > 255)
{
ocr = F_CPU / frequency / 256 - 1;
prescalarbits = 0b110;
if (ocr > 255)
{
ocr = F_CPU / frequency / 1024 - 1;
prescalarbits = 0b111;
if (ocr > 255)
{
timerStop();
return;
}
}
}
}
}
TCCR2B = prescalarbits;
OCR2A = ocr;
bitWrite(TIMSK2, OCIE2A, 1);
}
void timerStop(void)
{
bitWrite(TIMSK2, OCIE2A, 0);
TCCR2A = (1 << WGM20);
TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22);
OCR2A = 0;
}
Best Regards, WilliamK