1. 프로그램 개요
P22는 Green 0 LED, P24는 Red LED, P26은 Green 1 LED가 연결되어 있다.
와치도그 타이머를 1024ms로 설정하고 시스템을 동작시킨다.
① 전체 LED가 켜 졌다가 1초 후 OFF
② LEG_G_0이 약 10회 토글
③ LED_R이 빠르게 토글되다가 리셋 되어 ①번부터 반복된다.
2. 회로도
3. Code
⑴ main routine
void main()
{
u8 i;
WDT_Clear(); // clear WDT
InitSystem(); // System 초기화
WDT_SetClock_32K_DIV_64_1024ms(); // WDT clock : 32kHz(ILRCO)
WDT_EnReset(); // Watchdog overflow 시 시스템 리셋이 되도록 설정
WDT_Enable(); // enable WDT
LED_G_0=0;LED_G_1=0;LED_R=0; // LED ALL ON
for(i=0;i<10;i++)
{
DelayXms(100);
WDT_Clear(); // clear WDT
} // 1000ms delay
LED_G_0=1;LED_G_1=1;LED_R=1; // LED ALL OFF
while(1)
{
for(i=0;i<10;i++)
{
DelayXms(200);
LED_G_0=!LED_G_0;
WDT_Clear(); // clear WDT
} // LED_G_0을 200ms 마다 토글 10회
LED_G_0=1; // LED_G_0 OFF
while(1)
{ // not clear WDT, will reset MCU
LED_R=!LED_R; // LED_R 10ms 마다 토글, WDT를 클리어시키지 않으므로 약 100회 토글 뒤 리셋됨
DelayXms(10);
}
}
}
⑵ 시스템 초기화 루틴
/***********************************************************************************
*Function: void InitSystem(void)
*Description: Initialize MCU
*Input:
*Output:
*************************************************************************************/
void InitSystem(void)
{
InitPort();
}
- 포트 설정만 수행한다.
⑶ Port 초기화
/***********************************************************************************
*Function: void InitPort(void)
*Description: Initialize IO Port
*Input:
*Output:
*************************************************************************************/
void InitPort(void)
{
PORT_SetP2PushPull(BIT2|BIT4|BIT6); // Set P22,P24,P26 as Push-Pull,For LED.
è P22, P24, P26은 LED 구동을 위하여 Push-Pull type로 설정한다.
}
*** 사용된 매크로함수는 “API_Macro_MG82FG6D16.H”에서 찾아볼 수 있다.
\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\MG82F6D16_GPIO_WDT_Reset\code\include
⑷ 와치도그타이머 클럭설정
#define WDT_SetClock_32K_DIV_64_1024ms() WDTCR=(WDTCR&(~0x07))|0x06
- 와치도그 Clock을 설정하는 WDTCS1, WDTCS0 비트가 각각 default 0이므로 WDT Clock Source는 ILRCO(32kHz)가 된다.
- 이 때 PS[2:0]을 0x06으로 설정하면 WDT 주기는 1024ms로 설정된다.
è (EN)MG82F6D16_Datasheet_V051.PDF의 “9.4 WDT Register”를 참조한다.
è (EN)MG82F6D17_Datasheet_V038.PDF의 “10.4 WDT Register”를 참조한다.
è (EN)MG82F6D64/32_Datasheet_V102.PDF의 “10.4 WDT Register”를 참조한다.
⑸ 와치도그 타이머 시스템 리셋 설정
#define WDT_EnReset() WDTCR|=WREN
- WDTCR의 WREN을 셋 시켜 두면, WDT 오버플로우가 시스템 리셋의 원인이 된다. 한 번 셋 시켜 두면 Page 0~F에서는 클리어 시킬 수 없고, Page P에서만 0 또는 1로 수정이 가능하다.
⑹ 와치도그타이머 시작
#define WDT_Enable() WDTCR|=ENW
- WDTCR 레지스터의 ENW 비트가 셋 되어 있는 동안 WDT는 동작한다. ENW가 한 번 셋 되면 PAGE 0~F에서는 소프트웨어적으로 클리어시킬 수가 없다. Page P에서만 0 또는 1로 변경이 가능한다.
⑹ 와치도그타이머 클리어
#define WDT_Clear() WDTCR|=CLRW
- WDTCR 레지스터의 CLRW 비트에 1을 쓰게 되면 8비트 WDT 카운터의 값을 00H로 클리어 시키게 된다.이 비트는 0을 써서 클리어 시킬 필요가 없다. 00H 다시 카운트를 시작하면 이 비트는 클리어된다.
4. 프로그램 실행
*** Keil compiler가 인스톨되어 있어야함 ***
해당 Example 폴더를 찾아가 KeilPrj폴더를 Open 한다.
\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\ MG82F6D16_WDT_Reset
해당 폴더의 Keil project 파일을 더블 클릭하여 실행시킨다.(MG82F6D16_DEMO.uvproj)
Rebuild 아이콘을 클릭하여 프로젝트를 컴파일 한다.
Demo Board에 USB Connector를 연결하여 전원을 인가하고, 전원 스위치를 ON시키고, OCD ICE를 연결한 상태에서 위 이미지의 Start/Stop Debug Session(Ctrl+F5) 버튼을 눌러 컴파일된 프로젝트의 디버그 데이터를 다운로드 시킨다.(컴파일 시 에러가 발생하지 않아야함)
다운로드 후 Run(F5) 버튼을 클릭하면 프로그램이 동작한다.
5. 동작 영상
'MEGAWIN' 카테고리의 다른 글
MG82F6D Series TIM_T0T1_Mode 0 (0) | 2022.11.23 |
---|---|
MG82F6D Series TIM_T2_Mode2_Capture (0) | 2022.11.22 |
MG82F6D Series WDT Int. (0) | 2022.11.17 |
MG82F6D Series GPIO P44P45P47 (0) | 2022.11.14 |
MG82F6D Series CLK ILRCO P60OC (0) | 2022.11.11 |