0
0
Embedded Cprogramming~20 mins

Generating precise delays with timers in Embedded C - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Timer Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of timer delay calculation
What is the output of this code snippet that calculates timer counts for a 1ms delay on a 16 MHz clock with a prescaler of 64?
Embedded C
#include <stdio.h>

int main() {
    unsigned long clock_freq = 16000000; // 16 MHz
    unsigned int prescaler = 64;
    unsigned int delay_ms = 1;
    unsigned int timer_counts = (clock_freq / prescaler) / 1000 * delay_ms;
    printf("Timer counts: %u\n", timer_counts);
    return 0;
}
ATimer counts: 250
BTimer counts: 25000
CTimer counts: 1000
DTimer counts: 16000
Attempts:
2 left
💡 Hint
Remember to divide the clock frequency by the prescaler, then by 1000 for milliseconds.
🧠 Conceptual
intermediate
2:00remaining
Understanding timer overflow for delay generation
Which statement correctly explains why timer overflow is used to generate precise delays in embedded systems?
ATimer overflow triggers an interrupt exactly when the timer reaches zero, allowing precise delay control.
BTimer overflow occurs when the timer count exceeds its maximum value, signaling that the desired delay time has passed.
CTimer overflow resets the CPU clock to synchronize delay timing with the system clock.
DTimer overflow disables the timer to save power during delay periods.
Attempts:
2 left
💡 Hint
Think about what happens when a timer reaches its maximum count value.
🔧 Debug
advanced
2:00remaining
Identify the error in delay timer setup
This code aims to configure a timer for a 500 microsecond delay on a 8 MHz clock with prescaler 10. What error causes the delay to be incorrect?
Embedded C
void setup_timer() {
    unsigned long clock_freq = 8000000;
    unsigned int prescaler = 10;
    unsigned int delay_us = 500;
    unsigned int timer_counts = (clock_freq / prescaler) / 1000000 * delay_us;
    // Timer register setup omitted
    // Assume timer_counts loaded into timer register
}
AThe delay_us variable should be in milliseconds, not microseconds.
BThe prescaler value is too high for 500 microseconds delay.
CThe calculation uses integer division causing loss of precision before multiplication.
DThe clock frequency should be divided by 1000, not 1000000.
Attempts:
2 left
💡 Hint
Check the order of operations and data types in the calculation.
📝 Syntax
advanced
2:00remaining
Identify the syntax error in timer initialization code
Which option contains the syntax error that prevents this timer initialization code from compiling?
Embedded C
void init_timer() {
    unsigned int prescaler = 64;
    unsigned int timer_value = 25000;
    TCCR0A = 0x00;
    TCCR0B = (1 << CS01) | (1 << CS00); // prescaler 64
    TCNT0 = timer_value;
}
ATCNT0 = timer_value;
Bunsigned int timer_value = 25000;
Cvoid init_timer() {
DTCCR0B = (1 << CS01) | (1 << CS00); // prescaler 64
Attempts:
2 left
💡 Hint
Check if the prescaler bits set in TCCR0B match the prescaler value 64.
🚀 Application
expert
3:00remaining
Calculate timer reload value for 1ms delay with 12-bit timer
You have a 12-bit timer (max count 4095) running at 1 MHz clock with prescaler 1. To generate a 1ms delay using timer overflow, what reload value should you load into the timer register at start?
A3095
B3995
C3595
D3905
Attempts:
2 left
💡 Hint
Calculate total counts needed for 1ms, then subtract from max count to find reload value.