AVR 와치독(Watchdog) 타이머 사용하기
MCU가 예외 상황으로 멈춰 있을때 리셋을 걸어 주어야 하는데.. 이때 Watchdog를 사용할 수 있다.
초기화는 WDTCR레지스터의 비트3을 설정해주면 와치독 타이머가 동작한다.
이때 주의 사항은 MCUSR레지스터의 WDRF비트를 0으로 설정해 주어야 한다.
와치독 타이머가 동작하면 설정한 주기 이내로 레지스터 값을 클리어 해 주어야 하는데
#asm("WDR")
로 가능하다.
WIN AVR을 이용하면 wdt.h에 기본 함수가 정의 되어 있어 간단히 사용할 수 있다.
AVR Watchdoc 타이머 사용 예제 소스코드
MCU가 예외 상황으로 멈춰 있을때 리셋을 걸어 주어야 하는데.. 이때 Watchdog를 사용할 수 있다.
초기화는 WDTCR레지스터의 비트3을 설정해주면 와치독 타이머가 동작한다.
이때 주의 사항은 MCUSR레지스터의 WDRF비트를 0으로 설정해 주어야 한다.
와치독 타이머가 동작하면 설정한 주기 이내로 레지스터 값을 클리어 해 주어야 하는데
#asm("WDR")
로 가능하다.
WIN AVR을 이용하면 wdt.h에 기본 함수가 정의 되어 있어 간단히 사용할 수 있다.
AVR Watchdoc 타이머 사용 예제 소스코드
#include <avr/wdt.h>
#define WDTO_15MS 0
#define WDTO_30MS 1
#define WDTO_60MS 2
#define WDTO_120MS 3
#define WDTO_250MS 4
#define WDTO_500MS 5
#define WDTO_1S 6
#define WDTO_2S 7
void main(void)
{
:
//Watchdog 초기화 - ATmega162에서는 MCUSR레지스터가 MCUCSR이다.
MCUCSR &=~(1<<WDRF);
wdt_enable(WDTO_500MS);
while(1)
{
:
//주기적으로 와치독 클리어
if(gTimerTickWD>400)
{
gTimerTickWD = 0;
wdt_reset();
}
}
}
#define WDTO_15MS 0
#define WDTO_30MS 1
#define WDTO_60MS 2
#define WDTO_120MS 3
#define WDTO_250MS 4
#define WDTO_500MS 5
#define WDTO_1S 6
#define WDTO_2S 7
void main(void)
{
:
//Watchdog 초기화 - ATmega162에서는 MCUSR레지스터가 MCUCSR이다.
MCUCSR &=~(1<<WDRF);
wdt_enable(WDTO_500MS);
while(1)
{
:
//주기적으로 와치독 클리어
if(gTimerTickWD>400)
{
gTimerTickWD = 0;
wdt_reset();
}
}
}
반응형