Bird
Raised Fist0
Embedded Cprogramming~5 mins

Timer overflow behavior in Embedded C

Choose your learning style10 modes available
Introduction

Timers count up or down in embedded systems. When they reach their limit, they overflow and start again. Understanding this helps control time-based actions.

You want to measure time intervals longer than the timer's max count.
You need to trigger an action every time the timer resets.
You want to create a repeating event like blinking an LED.
You want to avoid errors caused by timer count wrapping around.
You want to handle timer interrupts correctly when overflow happens.
Syntax
Embedded C
void TIMER_ISR(void) {
    if (TIMER_OVERFLOW_FLAG) {
        TIMER_OVERFLOW_FLAG = 0; // Clear overflow flag
        // Your code here to handle overflow
    }
}

The overflow flag is set automatically when the timer reaches its max value.

You must clear the overflow flag inside the interrupt to avoid repeated triggers.

Examples
This checks if a 16-bit timer reached its max value and resets it.
Embedded C
if (timer_count == 0xFFFF) {
    // Timer overflow happened
    timer_count = 0; // Reset count
}
This interrupt toggles an LED every time the timer overflows.
Embedded C
void TimerOverflowISR(void) {
    TIMER_OVERFLOW_FLAG = 0; // Clear flag
    led_state = !led_state; // Toggle LED on overflow
}
Sample Program

This program simulates a 16-bit timer counting up. When it overflows (goes from 65535 to 0), it calls an interrupt function that sets a flag and resets the count. The main loop prints a message each time overflow happens.

Embedded C
#include <stdint.h>
#include <stdio.h>

volatile uint16_t timer_count = 0;
volatile int overflow_flag = 0;

void TimerOverflowISR(void) {
    overflow_flag = 1; // Set overflow flag
    timer_count = 0;   // Reset timer count
}

int main() {
    // Simulate timer counting up to max 16-bit value
    for (int i = 0; i < 70000; i++) {
        timer_count++;
        if (timer_count == 0) { // Overflow happened
            TimerOverflowISR();
        }
        if (overflow_flag) {
            printf("Timer overflow occurred at count %d\n", i);
            overflow_flag = 0;
        }
    }
    return 0;
}
OutputSuccess
Important Notes

Timer overflow happens when the timer reaches its maximum value and wraps to zero.

Always clear the overflow flag inside the interrupt to prevent repeated triggers.

Use overflow interrupts to handle long time delays beyond timer max count.

Summary

Timers count up to a max value and then overflow back to zero.

Overflow triggers an interrupt or flag you can use to run code.

Handling overflow lets you measure longer times and create repeating events.

Practice

(1/5)
1. What happens when a timer in embedded C reaches its maximum count value?
easy
A. It causes the microcontroller to reset.
B. It stops counting permanently.
C. It resets to zero and continues counting (overflow).
D. It triggers a syntax error in the program.

Solution

  1. Step 1: Understand timer counting behavior

    Timers count up from zero to a maximum value based on their bit size.
  2. Step 2: Identify what happens at max value

    When the timer reaches its max, it resets to zero and continues counting, called overflow.
  3. Final Answer:

    It resets to zero and continues counting (overflow). -> Option C
  4. Quick Check:

    Timer overflow means reset to zero [OK]
Hint: Timer overflow means count resets to zero [OK]
Common Mistakes:
  • Thinking timer stops at max value
  • Assuming overflow causes microcontroller reset
  • Confusing overflow with syntax errors
2. Which of the following is the correct way to check a timer overflow flag in embedded C?
easy
A. if (TIMER_FLAG != 1) { /* handle overflow */ }
B. if (TIMER_FLAG == 1) { /* handle overflow */ }
C. if (TIMER_FLAG == 0) { /* handle overflow */ }
D. if TIMER_FLAG = 1 { /* handle overflow */ }

Solution

  1. Step 1: Understand syntax for condition check

    In C, conditions use double equals '==' to compare values inside parentheses.
  2. Step 2: Identify correct overflow flag check

    Checking if TIMER_FLAG equals 1 means overflow occurred, so use 'if (TIMER_FLAG == 1)'.
  3. Final Answer:

    if (TIMER_FLAG == 1) { /* handle overflow */ } -> Option B
  4. Quick Check:

    Use '==' for comparison in if conditions [OK]
Hint: Use '==' to compare flags in if statements [OK]
Common Mistakes:
  • Using single '=' instead of '==' in if condition
  • Checking for zero instead of one for overflow
  • Missing parentheses around condition
3. Given this code snippet, what will be the value of overflow_count after the timer overflows twice?
volatile uint8_t timer = 254;
volatile uint8_t overflow_count = 0;

void timer_ISR() {
  timer++;
  if (timer == 0) {
    overflow_count++;
  }
}
medium
A. 2
B. 1
C. 0
D. 254

Solution

  1. Step 1: Understand timer increment and overflow

    Timer starts at 254, increments to 255, then overflows to 0, triggering overflow_count++.
  2. Step 2: Count overflows after two increments

    After two overflows (timer wraps to 0 twice), overflow_count increments twice, so value is 2.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Two overflows increment count twice [OK]
Hint: Overflow increments count when timer resets to zero [OK]
Common Mistakes:
  • Confusing timer value with overflow count
  • Forgetting overflow increments counter
  • Assuming overflow_count resets with timer
4. Identify the error in this timer overflow handling code:
volatile uint8_t timer = 0;
volatile uint8_t overflow_flag = 0;

void timer_ISR() {
  timer++;
  if (timer = 0) {
    overflow_flag = 1;
  }
}
medium
A. Overflow flag should be reset inside ISR.
B. Timer variable should be uint16_t, not uint8_t.
C. Missing semicolon after timer++.
D. Using assignment '=' instead of comparison '==' in if condition.

Solution

  1. Step 1: Check if condition syntax

    The condition uses '=' which assigns 0 to timer instead of comparing it.
  2. Step 2: Correct comparison operator

    It should use '==' to check if timer equals 0 for overflow detection.
  3. Final Answer:

    Using assignment '=' instead of comparison '==' in if condition. -> Option D
  4. Quick Check:

    Use '==' for comparisons, not '=' [OK]
Hint: Use '==' in if conditions, not '=' [OK]
Common Mistakes:
  • Confusing '=' with '==' in conditions
  • Assuming timer type causes error here
  • Ignoring missing flag reset logic
5. You want to measure a time interval longer than your 8-bit timer max count (255). Which method correctly uses timer overflow to achieve this?
hard
A. Count the number of overflows in an interrupt and multiply by 256 plus current timer value.
B. Reset the timer to zero manually before it overflows.
C. Increase the timer frequency to count faster.
D. Ignore overflow and only read the timer value.

Solution

  1. Step 1: Understand timer max count limitation

    An 8-bit timer counts from 0 to 255, then overflows back to 0.
  2. Step 2: Use overflow count to extend timing range

    Counting overflows lets you track how many times timer wrapped, extending measurable time.
  3. Step 3: Calculate total time

    Total count = (overflow_count * 256) + current timer value, giving full interval.
  4. Final Answer:

    Count the number of overflows in an interrupt and multiply by 256 plus current timer value. -> Option A
  5. Quick Check:

    Overflow count extends timer range [OK]
Hint: Use overflow count x max + timer for long intervals [OK]
Common Mistakes:
  • Resetting timer manually loses overflow info
  • Increasing frequency doesn't extend max count
  • Ignoring overflow loses timing accuracy
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