The ATmega328P uses timer/counter registers to store the number of clock pulses, depending on the specific timer being used. These registers are associated with its built-in hardware Timer/Counter units.
Timer/Counter Registers in ATmega328P
The ATmega328P has three timers:
- Timer/Counter0 (8-bit)
- Timer/Counter1 (16-bit)
- Timer/Counter2 (8-bit)
Each of these has its own register to count the clock pulses:
1.Timer/Counter0 (8-bit):
- Register: TCNT0
- Size: 8 bits (counts from 0 to 255)
- This register holds the current count value for Timer/Counter0.
2.Timer/Counter1 (16-bit):
- Register: TCNT1H (high byte) and TCNT1L (low byte)
- Size: 16 bits (counts from 0 to 65,535)
- Combined 16-bit value: TCNT1 = (TCNT1H << 8) | TCNT1L
3.Timer/Counter2 (8-bit):
- Register: TCNT2
- Size: 8 bits (counts from 0 to 255)
How It Works:
These registers increment with every clock tick, depending on the timer's prescaler and mode configuration.
For example:
- If no prescaler is used, the counter increments at the CPU clock speed (e.g., 16 MHz for Arduino Uno).
- If a prescaler is set (e.g., 64), the timer increments every 64×clock period.
Example Use:
To read the current count of Timer/Counter0:
c
uint8_t timer0_count = TCNT0;
To reset the counter:
c
TCNT0 = 0; // Clear Timer/Counter0
Summary
- The TCNT0, TCNT1H/TCNT1L, and TCNT2 registers store the number of clock pulses for Timer/Counter0, Timer/Counter1, and Timer/Counter2, respectively.
- The choice of register depends on the timer you are using and its configuration.
Top comments (0)