RTC Overflow Interrupt Code Example
#define RTC_EXAMPLE_PERIOD (511)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/cpufunc.h>
void RTC_init(void);
void LED0_init(void);
inline void LED0_toggle(void);
void RTC_init(void)
{
uint8_t temp;
temp = CLKCTRL.XOSC32KCTRLA;
temp &= ~CLKCTRL_ENABLE_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
while(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)
{
;
}
temp = CLKCTRL.XOSC32KCTRLA;
temp &= ~CLKCTRL_SEL_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
temp = CLKCTRL.XOSC32KCTRLA;
temp |= CLKCTRL_ENABLE_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
while (RTC.STATUS > 0)
{
;
}
RTC.PER = RTC_EXAMPLE_PERIOD;
RTC.CLKSEL = RTC_CLKSEL_TOSC32K_gc;
RTC.DBGCTRL |= RTC_DBGRUN_bm;
RTC.CTRLA = RTC_PRESCALER_DIV32_gc
| RTC_RTCEN_bm
| RTC_RUNSTDBY_bm;
RTC.INTCTRL |= RTC_OVF_bm;
}
void LED0_init(void)
{
PORTB.OUT |= PIN5_bm;
PORTB.DIR |= PIN5_bm;
}
inline void LED0_toggle(void)
{
PORTB.OUTTGL |= PIN5_bm;
}
ISR(RTC_CNT_vect)
{
RTC.INTFLAGS = RTC_OVF_bm;
LED0_toggle();
}
int main(void)
{
LED0_init();
RTC_init();
sei();
while (1)
{
}
}
RTC Periodic Interrupt Code Example
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/cpufunc.h>
void RTC_init(void);
void LED0_init(void);
inline void LED0_toggle(void);
void RTC_init(void)
{
uint8_t temp;
temp = CLKCTRL.XOSC32KCTRLA;
temp &= ~CLKCTRL_ENABLE_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
while(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)
{
;
}
temp = CLKCTRL.XOSC32KCTRLA;
temp &= ~CLKCTRL_SEL_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
temp = CLKCTRL.XOSC32KCTRLA;
temp |= CLKCTRL_ENABLE_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
while (RTC.STATUS > 0)
{
;
}
RTC.CLKSEL = RTC_CLKSEL_TOSC32K_gc;
RTC.DBGCTRL = RTC_DBGRUN_bm;
RTC.PITINTCTRL = RTC_PI_bm;
RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc
| RTC_PITEN_bm;
}
void LED0_init(void)
{
PORTB.OUT |= PIN5_bm;
PORTB.DIR |= PIN5_bm;
}
inline void LED0_toggle(void)
{
PORTB.OUTTGL |= PIN5_bm;
}
ISR(RTC_PIT_vect)
{
RTC.PITINTFLAGS = RTC_PI_bm;
LED0_toggle();
}
int main(void)
{
LED0_init();
RTC_init();
sei();
while (1)
{
}
}
RTC PIT Wake from Sleep Code Example
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/cpufunc.h>
void RTC_init(void);
void LED0_init(void);
inline void LED0_toggle(void);
void SLPCTRL_init(void);
void RTC_init(void)
{
uint8_t temp;
temp = CLKCTRL.XOSC32KCTRLA;
temp &= ~CLKCTRL_ENABLE_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
while(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)
{
;
}
temp = CLKCTRL.XOSC32KCTRLA;
temp &= ~CLKCTRL_SEL_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
temp = CLKCTRL.XOSC32KCTRLA;
temp |= CLKCTRL_ENABLE_bm;
ccp_write_io((void*)&CLKCTRL.XOSC32KCTRLA, temp);
while (RTC.STATUS > 0)
{
;
}
RTC.CLKSEL = RTC_CLKSEL_TOSC32K_gc;
RTC.DBGCTRL = RTC_DBGRUN_bm;
RTC.PITINTCTRL = RTC_PI_bm;
RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc
| RTC_PITEN_bm;
}
void LED0_init(void)
{
PORTB.OUT |= PIN5_bm;
PORTB.DIR |= PIN5_bm;
}
inline void LED0_toggle(void)
{
PORTB.OUTTGL |= PIN5_bm;
}
ISR(RTC_PIT_vect)
{
RTC.PITINTFLAGS = RTC_PI_bm;
LED0_toggle();
}
void SLPCTRL_init(void)
{
SLPCTRL.CTRLA |= SLPCTRL_SMODE_PDOWN_gc;
SLPCTRL.CTRLA |= SLPCTRL_SEN_bm;
}
int main(void)
{
LED0_init();
RTC_init();
SLPCTRL_init();
sei();
while (1)
{
sleep_cpu();
}
}