출처 : http://cafe.naver.com/mpucafe.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=904
워치독 타이머
워치독 타이머(Watchdog Timer)는 타임아웃이 되기 전에 주기마다 소프트웨어 적으로 워치독 리셋(WDR) 명령을 이용하여 그 값을 클리어시켜 주지 않으떤 MCU를 리셋시킴으로써 시스템이 정상적으로 동작하고 있는지를 항상 감시하는 마이크로프로세서의 신뢰성 향상 기술이다.
이것은 AVR의 내부에 독립적으로 존재하는 워치독 오실레이터에서 1MHz의 를럭을 발진하여 동작하며, 사용자가 이를 8가지로 분주하여 워치독 타임아웃 시간을 변경시킬 수 있다.
지정된 시간 이내에 워치독 리셋(WDR) 명령을 실행하거나 워치독의 동작을 금지 시키거나 MCU 리셋이 발생하는 경우에 워치독 타이머의 값이 리셋된다.
지정된 시간 이내에 워치독 타이머를 리셋시키지 않아 워치독 타임아웃이 발생하면 1클럭 주기의 워치독 타임아웃 신호를 출력하여 MCU를 리셋시킨다.
워치독 타이머의 개략적인 구성을 도시하면 아래 <그림 1.4.13>과 같고,
<그림 1.4.13>
이를 사용하는데 관련된 위치독 타이머 제어 레지스터 WDTCR(Watchdog Timer Control Register)은 <그림 1.4.14>에 보였다.
<그림 1.4.14>
비트2~0 의 WDP2~O(Watchdog Timer Prescaler)은 <표 1.4.21>과 같이 1MHz의 클럭을 분주하여 워치독의 타임아웃 시간을 설정하는 데 사용한다.
비트4의 WDCE(Watchdog Change Enable)는 워치독 동작을 해제하거나 타임아웃 주기를 변경하는 것이 가능하도록 하는데, 여기에 1을 쓰면 4를럭 후에 자동으로 클리어된다.
비트3의 WDE(Watchdog Enable)는 1일 때 워치독 동작을 설정하고 0일 때 워치독을 해제한다.
워치독 타이머 설정 변경 절차
AVR의 워치독 타이머에서는 프로그램의 오류로 워치독이 뜻하지 않게 해제되거나 타임아웃 주기가 변경되는 것을 방지하기 위하여 3단계의 안전 레벨(safety level)을 사용하고 있다.
안전 레벨은 확장 퓨즈 바이트(Extended Fuse Byte)의 M161C 및 상위 퓨즈 바이트(Fuse High Byte)의 WDTON 비트를 사용하여 <표1.4.22>와 같이 3단계중의 하나로 설정된다.
그러나, 이들 비트는 안전 레벨에 따라 사용하는 방법이 다르며 지정된 절차를 따라야 한다.
예를 들어 워치독을 해제하려면 반드시 다음과 같은 절차로 수행하여야 한다.
단, 안전 레벨2에서는 워치독 타이머가 항상 동작하며 이를 해제할 수 없다.
① WDTCR 레지스터에 동시에 WDCE : 1, WDE : 1로 라이트한다.
② 4클럭 사이클 이내에 WDTCR 레지스터에 WDE : 0으로 라이트한다.
안전 레벨0은
ATmega161 호환 모드의 동작으로서 워치독이 디폴트로 금지되어 있으며,
WDE 비트를 1로 하면 아무 제한없이 워치독이 사용되고 타임아웃 주기도 아 무런 제한없이 변경될 수 있다.
그러나, 워치독 타이머의 동작을 해제하려면 앞에서 설명했던 바와 같이 지정된 처리단계로 수행해야 한다.
안전 레벨1에서는
워치독이 디폴트로 금지되어 있으며, WDE 비트를 1로 하면 아무 제한없이 워치독이 허용된다.
그러나, 타임아웃 주기를 변경하거나 워치독 타이머의 동작을 해제하려면 지정된 처리단계로 수행해야 한다.
여기서 지정된 처리단계란
① WDCE와 WDE 비트에 동시에 1을 쓰고
② 다음의 4클럭 사이클 이내에 WDCE 비트를 0으로 하고 WDE 비트와 WDP2~0 비츠에 원하는 값을 쓰는 것이다.
안전 레벨2에서는
워치독이 디폴트로 허용되어 있으며, WDE 비트를 읽어보면 항상 1로 읽혀지고 워치독을 해제시킬 수 없다.
그러나, 타임아웃 주기를 변경하려면 지정된 처리단계로 수행해야 한다.
여기서 지정된 처리단계란
① WDCE와 WDE 비트에 동시에 1을 쓰고
② 다음의 4클럭 사이클 이내에 WDCE 비트를 0으로 하고 WDP2~0 비트에 원하는 값을 쓰는 것이다.
이때 WDE 비트에는 무슨 값을 쓰더라도 상관없다.
/* Watchdog(ATmege8535용) -----------------------------------------------------------
WDTCR : |-(7)|-(6)|-(5)|WDCE(4)|WDE(3)|WDP2(2)|WDP1(1)|WDP0(0)|
워치독 타이머의 동작을 해제절차
-① WDTCR 레지스터에 동시에 WDCE : 1, WDE : 1로 라이트한다.
-② 4클럭 사이클 이내에 WDTCR 레지스터에 WDE : 0으로 라이트한다.
----------------------------------------------------------------------------------*/
#define _WDR() { asm("WDR"); } //Reset Watch dog timer
void WDT_off(void)
{
// Reset WDT
_WDR();
// WDCE와 WDE 비트에 동시에 1을 쓰고
WDTCR |= (1<<WDCE)|(1<<WDE);
// Turn off WDT
WDTCR = 0x00;
}
#include <avr/wdt.h> wdt_disable(void) --> 워치독 타이머를 끈다 wdt_enable(uint8_t timeout) --> 워치독 타이머를 킨다 wdt_reset(void) -- > 워치독 타이머를 리셋한다 Table(3V일때) 0 -> 16K Cycles 15ms 45ms 1 -> 32K Cycles 30ms 94ms 2 -> 64K Cycles 60ms 0.19s 3 -> 128K Cycles 0.12s 0.38s 4 -> 256K Cycles 0.24s 0.75s 5 -> 512K Cycles 0.49s 1.5s 6 -> 1024K Cycles 0.97s 3.0s 7 -> 2048K Cycles 1.9s 6.0s
여신사랑
전 128로 소프트 리셋을 했습니다.
어렵지않구요
두가지 방법을 알려드릴께요(저도 찾아봐서 그대로 했는데 되더군요 ㅎㅎㅎ)
한가지 방법은 제가 지금쓰고있는데
void (* reset)(void)=0x0000;
(*reset)();
하는 방법이구
다른 방법은 #asm("jmp 0")입니다. 이방법은 써보지 않았는데 될거구요.
위에건 써먹어 봤습니다.
두번째 질문에서 소프트웨어리셋명령을 받고 싶어도 232에서 받아주지 않으면 않됩니다.
구지 그방법을 쓰실려면 WATCHDOG을 쓰세요 즉 MCU와 컴과 지속적으로 이상유무를 던져주다 이상이 생겨 통신이 않되면 MCU를 리셋하게 만들면 해결될듯한데요. 09/15 14:15
로미
jum 0 <<-- 이거는 칩 자체가 초기화가 안됩니다(디폴트). 사용자가 설정한 내용만 초기화가 됩니다. 09/15 14:34
'Embeded' 카테고리의 다른 글
RS232 UART (0) | 2008.01.07 |
---|---|
Watchdog (0) | 2008.01.07 |
데이터 시트 볼때 유의할 점 (0) | 2007.12.28 |