Bird
Raised Fist0
Embedded Cprogramming~10 mins

Timer interrupt for periodic tasks in Embedded C - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Timer interrupt for periodic tasks
Start Timer
↓
Timer counts up
↓
Timer reaches compare value
↓
Interrupt triggered
↓
Interrupt Service Routine (ISR) runs
↓
Perform periodic task
↓
Clear interrupt flag
↓
Return to main program
↩Back to Timer counts up
The timer counts up until it reaches a set value, triggering an interrupt that runs a special function to perform tasks periodically, then clears the interrupt and continues.
Execution Sample
Embedded C
volatile int flag = 0;
void ISR_Timer() {
  flag = 1; // Set flag on interrupt
  clear_interrupt_flag(); // Clear interrupt flag inside ISR
}
int main() {
  setup_timer_interrupt();
  while(1) {
    if(flag) { flag=0; do_task(); }
  }
}
This code sets a flag in the timer interrupt and the main loop checks the flag to run a periodic task.
Execution Table
StepTimer CountInterrupt?ISR ActionFlag ValueMain Loop Action
10NoNo0No task
21NoNo0No task
32NoNo0No task
43YesSet flag=11Task runs, flag reset to 0
50NoNo0No task
61NoNo0No task
72NoNo0No task
83YesSet flag=11Task runs, flag reset to 0
💡 Timer keeps running and interrupt triggers periodically at count 3
Variable Tracker
VariableStartAfter Step 4After Step 4 Main LoopAfter Step 8After Step 8 Main Loop
flag01010
Timer Count03333
Key Moments - 2 Insights
Why does the main loop check the flag instead of running the task directly in the ISR?
The ISR should be very fast and not do heavy work. The flag signals the main loop to run the task safely outside the interrupt (see execution_table step 4 and main loop action).
What happens if the interrupt flag is not cleared inside the ISR?
The interrupt will keep triggering repeatedly, causing the ISR to run continuously and blocking the main program (implied in concept_flow step 'Clear interrupt flag').
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 4, what is the value of 'flag' after the ISR runs?
A0
B1
CUndefined
D-1
💡 Hint
Check the 'Flag Value' column at step 4 in the execution_table.
At which step does the main loop reset the flag back to 0?
AStep 4 Main Loop Action
BStep 3
CStep 4
DStep 5
💡 Hint
Look at the 'Main Loop Action' column in the execution_table after step 4.
If the timer compare value changes from 3 to 5, how would the interrupt steps change?
AInterrupt never triggers
BInterrupt triggers at Timer Count 3 still
CInterrupt triggers at Timer Count 5 instead of 3
DInterrupt triggers continuously
💡 Hint
Refer to the 'Timer Count' and 'Interrupt?' columns in the execution_table.
Concept Snapshot
Timer interrupt runs a special function when timer reaches a set count.
ISR sets a flag to signal main code.
Main loop checks flag and runs periodic tasks.
ISR must be short and clear interrupt flags.
Timer repeats to create periodic behavior.
Full Transcript
A timer counts up continuously. When it reaches a preset value, it triggers an interrupt. The interrupt runs a small function called ISR that sets a flag variable. The main program loop checks this flag regularly. When the flag is set, the main loop runs the periodic task and resets the flag. This way, the heavy work is done outside the interrupt, keeping the system responsive. The interrupt flag must be cleared inside the ISR to avoid repeated triggers. Changing the timer compare value changes how often the interrupt happens.

Practice

(1/5)
1.

What is the main purpose of a timer interrupt in embedded C programming?

easy
A. To stop the main program permanently
B. To run code automatically at regular time intervals
C. To manually start a function when needed
D. To increase the speed of the processor

Solution

  1. Step 1: Understand timer interrupt functionality

    Timer interrupts trigger code execution automatically at set time intervals without manual intervention.
  2. Step 2: Compare options with timer interrupt purpose

    Only To run code automatically at regular time intervals describes automatic, regular code execution, which matches timer interrupt use.
  3. Final Answer:

    To run code automatically at regular time intervals -> Option B
  4. Quick Check:

    Timer interrupt = automatic periodic code run [OK]
Hint: Timer interrupts run code regularly without manual calls [OK]
Common Mistakes:
  • Thinking timer interrupts stop the main program
  • Confusing manual function calls with interrupts
  • Assuming timer interrupts speed up the processor
2.

Which of the following is the correct way to enable a timer interrupt in embedded C?

void setup() {
    // Enable timer interrupt here
}
easy
A. TIMSK |= (1 << TOIE0);
B. TIMSK = 0;
C. TCCR0 = 0;
D. PORTB |= (1 << PB0);

Solution

  1. Step 1: Identify register for timer interrupt enable

    TIMSK register controls timer interrupt enable bits; setting TOIE0 bit enables Timer0 overflow interrupt.
  2. Step 2: Analyze each option

    TIMSK |= (1 << TOIE0); sets TOIE0 bit correctly. TIMSK = 0; clears TIMSK disabling interrupts. TCCR0 = 0; sets timer control register, not interrupt enable. PORTB |= (1 << PB0); sets port pin, unrelated to interrupts.
  3. Final Answer:

    TIMSK |= (1 << TOIE0); -> Option A
  4. Quick Check:

    Enable timer interrupt = set TIMSK TOIE0 bit [OK]
Hint: Enable timer interrupt by setting TIMSK TOIE0 bit [OK]
Common Mistakes:
  • Clearing TIMSK disables interrupts
  • Confusing timer control register with interrupt enable
  • Setting port pins instead of interrupt bits
3.

What will be the output of the following code snippet if the timer interrupt triggers every 1 second and increments count?

volatile int count = 0;

ISR(TIMER0_OVF_vect) {
    count++;
}

int main() {
    setup_timer_interrupt();
    while(count < 3) {}
    printf("Count: %d", count);
    return 0;
}
medium
A. Count: 5
B. Count: 0
C. Count: 1
D. Count: 3

Solution

  1. Step 1: Understand interrupt increments

    Each timer interrupt increments count by 1 every 1 second.
  2. Step 2: Analyze loop condition and output

    Main loop waits until count reaches 3, then prints count. So output is "Count: 3".
  3. Final Answer:

    Count: 3 -> Option D
  4. Quick Check:

    count increments 3 times before print [OK]
Hint: Loop waits for count 3, so output is Count: 3 [OK]
Common Mistakes:
  • Assuming count stays 0 without interrupt
  • Printing before count reaches 3
  • Confusing count increments with time
4.

Identify the error in the following code that prevents the timer interrupt from working properly:

volatile int flag = 0;

ISR(TIMER1_COMPA_vect) {
    flag = 1;
}

int main() {
    setup_timer1();
    while(flag == 0) {
        // wait
    }
    // do something
    return 0;
}
medium
A. The ISR vector name is incorrect for Timer1 Compare A interrupt
B. The flag variable should not be volatile
C. The setup_timer1() function is missing enabling the interrupt
D. The while loop condition should be flag != 0

Solution

  1. Step 1: Check ISR vector correctness

    ISR vector TIMER1_COMPA_vect is correct for Timer1 Compare A interrupt.
  2. Step 2: Verify interrupt enabling in setup

    If setup_timer1() does not enable the interrupt, ISR never triggers, so flag stays 0.
  3. Final Answer:

    setup_timer1() function is missing enabling the interrupt -> Option C
  4. Quick Check:

    Interrupt must be enabled in setup for ISR to run [OK]
Hint: Always enable interrupt in setup function [OK]
Common Mistakes:
  • Assuming ISR vector name is wrong
  • Removing volatile from flag
  • Changing loop condition incorrectly
5.

You want to toggle an LED every 500ms using a timer interrupt on an 8-bit microcontroller with a 1MHz clock. Which approach correctly sets up the timer interrupt for this periodic task?

Options:
  1. Set timer prescaler to 64, preload timer to 131, enable overflow interrupt.
  2. Set timer prescaler to 256, preload timer to 0, enable compare match interrupt at 500.
  3. Set timer prescaler to 8, preload timer to 0, enable overflow interrupt.
  4. Set timer prescaler to 1024, preload timer to 0, enable overflow interrupt.
hard
A. Set timer prescaler to 64, preload timer to 131, enable overflow interrupt.
B. Set timer prescaler to 256, preload timer to 0, enable compare match interrupt at 500.
C. Set timer prescaler to 8, preload timer to 0, enable overflow interrupt.
D. Set timer prescaler to 1024, preload timer to 0, enable overflow interrupt.

Solution

  1. Step 1: Calculate timer counts for 500ms with 1MHz clock

    Timer tick = prescaler / clock = 64 / 1,000,000 = 64us. Counts needed = 500ms / 64us = 7812.5 counts.
  2. Step 2: Use 8-bit timer overflow with preload

    8-bit timer max count = 256. Number of overflows = 7812.5 / 256 ≈ 30.5. Preload = 256 - (7812.5 % 256) = 256 - 132.5 ≈ 123.5 (131 preload with prescaler 64 is closest practical setup).
  3. Step 3: Analyze options

    Set timer prescaler to 64, preload timer to 131, enable overflow interrupt. uses prescaler 64 and preload 131, which is a common approach to adjust overflow timing. Other options either use wrong prescaler or compare match without correct value.
  4. Final Answer:

    Set timer prescaler to 64, preload timer to 131, enable overflow interrupt. -> Option A
  5. Quick Check:

    Prescaler 64 + preload adjusts overflow for 500ms toggle [OK]
Hint: Use prescaler and preload to match 500ms timer overflow [OK]
Common Mistakes:
  • Ignoring timer resolution and prescaler effect
  • Using wrong interrupt type for timing
  • Not calculating preload for overflow timing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard