본문 바로가기
  • SpokeHouse
Microchip

Attiny202 - Sleep mode 슬립모드 정리

by SpokeHouse 2024. 12. 18.
728x90

안녕하세요 스포크하우스입니다.

Attiny202은 자료가 많지 않은 것 같습니다. 

일단 슬립모드 진입에 앞서 데이터시트를 보시면 클럭은 32k 저전력 클럭으로 돌려야하고 외부 gpio인터럽트나 RTC 인터럽트 같은 주기적으로 발생하는 인터럽트에 스스로 깨어날 수 있다고 되어있습니다.

이리저리 타이머 인터럽트로도 되긴하는데 RTC가 더 확실히 깨어나는 느낌? 

먼저 rtc 부터 설정 해줍니다.

void RTC_init(void)
{
  /* Initialize RTC: */
  while (RTC.STATUS > 0)
  {
    ;                                   /* Wait for all register to be synchronized */
  }
  RTC.CLKSEL = RTC_CLKSEL_INT32K_gc;    /* 32.768kHz Internal Ultra-Low-Power Oscillator (OSCULP32K) */

  RTC.PITINTCTRL = RTC_PI_bm;           /* PIT Interrupt: enabled */

  RTC.PITCTRLA = RTC_PERIOD_CYC32768_gc /* RTC Clock Cycles 16384, resulting in 32.768kHz/16384 = 2Hz */
  | RTC_PITEN_bm;                       /* Enable PIT counter: enabled */
}

ISR(RTC_PIT_vect)
{
  RTC.PITINTFLAGS = RTC_PI_bm;          /* Clear interrupt flag by writing '1' (required) */
  sleep_count++;
}

PIT 로 진행해야 된다고 하네요 데이터시트에서

ISR 인 인터럽트 발생하면 들어오는 곳이니까 카운터만 해주고 나옵니다.

1초에 한번 들어가서 카운터 해주니까 sleep_count 조건으로 원하는 시간 조정하시면 됩니다.

다음은 main문

int main(void)
{
    SYSTEM_Initialize();
    CLKCTRL_init();
    RTC_init();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);  /* Set sleep mode to POWER DOWN mode */
    sleep_enable();
    
    sei();

    while(1)
    {           
        sleep_cpu();
        
        if(sleep_count >= user_want_time)
        {
           ....실행할 코드
            
            }
            
      }

이게 참 힘들었습니다...

클럭은 32k 여야하니까 이전 포스팅 참조하시면 됩니다.

2024.11.27 - [Microchip] - Attiny202 - 저전력 클럭 설정 32K

set_sleep_mode()를 해주고 sleep_enable()을 해줍니다. 여기까지는 슬립모드로 안들어갑니다.

set_sleep_mode()는 종류가 있으니까 보시면 되구요 저는 최대한 저전력으로 동작하는 power down모드입니다.

그런다음 sleep_cpu();요놈이 실행되면 바로그냥 3~4uA로 전류가 떨어집니다. 좋구요..

그럼 오늘도 대단히 수고하세요

감사합니다.

 

728x90

댓글