Go Down

### Topic: Timer Calls - overruns? (Read 1 time)previous topic - next topic

#### WilliamK Govinda

##### Feb 03, 2011, 01:52 pm
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?

Code: [Select]
`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

#1
##### Feb 03, 2011, 07:53 pm
Quote
Does the next timer call stops the previous one

No.  Unless you re-enable interrupts (which is a very bad idea), your interrupt service routine runs to completion.

Quote
What will exactly happen?

Your interrupt service routine completes.  A single machine instruction is executed on the loop side.  Your interrupt service routine is called again.  Essentially, loop gets starved.

Quote
I need to figure out a way to check when overruns happens on my timer call, any ideas?

Time loop...

Code: [Select]
`unsigned long PreviousLoop;void loop( void ){  unsigned long CurrentLoop;  unsigned long DeltaLoop;  CurrentLoop = micros();  // or millis()  DeltaLoop = CurrentLoop - PreviousLoop;  PreviousLoop = CurrentLoop;  // DeltaLoop continues to increase as loop becomes starved.  At a certain point, for all practical purposes, loop stops running.}`

Go Up