#include <avr/power.h>
Many AVRs contain a Power Reduction Register (PRR) or Registers (PRRx) that allow you to reduce power consumption by disabling or enabling various on-board peripherals as needed. Some devices have the XTAL Divide Control Register (XDIV) which offer similar functionality as System Clock Prescale Register (CLKPR).
There are many macros in this header file that provide an easy interface to enable or disable on-board peripherals to reduce power. See the table below.
Not all AVR devices have a Power Reduction Register (for example the ATmega8). On those devices without a Power Reduction Register, the power reduction macros are not available..
Not all AVR devices contain the same peripherals (for example, the LCD interface), or they will be named differently (for example, USART and USART0). Please consult your device's datasheet, or the header file, to find out which macros are applicable to your device.
For device using the XTAL Divide Control Register (XDIV), when prescaler is used, Timer/Counter0 can only be used in asynchronous mode. Keep in mind that Timer/Counter0 source shall be less than 1/4 th of peripheral clock. Therefore, when using a typical 32.768 kHz crystal, one shall not scale the clock below 131.072 kHz.
Not all AVR devices have a clock prescaler. On those devices without a Clock Prescale Register or XTAL Divide Control Register, these macros are not available.
typedef enum { clock_div_1 = 0, clock_div_2 = 1, clock_div_4 = 2, clock_div_8 = 3, clock_div_16 = 4, clock_div_32 = 5, clock_div_64 = 6, clock_div_128 = 7, clock_div_256 = 8, clock_div_1_rc = 15, // ATmega128RFA1 only } clock_div_t;Clock prescaler setting enumerations for device using System Clock Prescale Register.
typedef enum { clock_div_1 = 1, clock_div_2 = 2, clock_div_4 = 4, clock_div_8 = 8, clock_div_16 = 16, clock_div_32 = 32, clock_div_64 = 64, clock_div_128 = 128 } clock_div_t;Clock prescaler setting enumerations for device using XTAL Divide Control Register.
clock_prescale_set(x)
Set the clock prescaler register select bits, selecting a system clock division setting. This function is inlined, even if compiler optimizations are disabled.
The type of x
is
clock_div_t
.
For device with XTAL Divide Control Register (XDIV),
x
can actually range from 1 to 129. Thus, one does
not need to use clock_div_t
type as
argument.
clock_prescale_get()Gets and returns the clock prescaler register setting. The return type is
clock_div_t
.For device with XTAL Divide Control Register (XDIV), return can actually range from
1 to 129. Care should be taken has the return value could differ from the typedef enum
clock_div_t. This should only happen if clock_prescale_set was previously called with a
value other than those defined by clock_div_t
.