MEGAWIN

MG82F6D Series WDT Int.

롬돌이 2022. 11. 17. 13:54
반응형

1. 프로그램 개요

P22Green 0 LED, P24 Red LED, P26Green 1 LED가 연결되어 있다.

와치도그 타미어가 있을 때의 루프와 없을 때의 루프를 비교테스트 한다.

 

2. 회로도

                    

    

 

 

 

 

 

3. Code

main routine

void main()

{

           u8 i;

           WDT_Clear();                                      // clear WDT

InitSystem();                                      // System 초기화

          WDT_SetClock_32K_DIV_64_1024ms();         // 와치도그용 클럭 셋팅

           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

           }

           LED_G_0=1;LED_G_1=1;LED_R=1;              // LED All OFF

 

           while(1)

           { //  not clear WDT, will trigger WDT interrupt

                     LED_G_0=!LED_G_0;                   // LED_G_0 Toggle

                     DelayXms(100);

           }

}

 

⑵ 시스템 초기화 루틴

/***********************************************************************************

*Function:   void InitSystem(void)

*Description:           Initialize MCU

*Input:  

*Output:    

*************************************************************************************/

void InitSystem(void)

{

           InitPort();

           InitInterrupt();

 

           INT_EnAll();

}

- 포트 설정만 수행한다.

- 인터럽트 초기화

- #define INT_EnAll()                       EA=1              // Global enable

 

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, P26LED 구동을 위하여 Push-Pull type로 설정한다.

}

*** 사용된 매크로함수는 “API_Macro_MG82FG6D16.H”에서 찾아볼 수 있다.

\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\MG82F6D16_GPIO_P44P45P47\code\include

 

 

Interrupt 초기화

 

/***********************************************************************************

*Function:   void InitInterrupt(void)

*Description:   Initialize Interrupt

*Input:  

*Output:    

*************************************************************************************/

void InitInterrupt(void)

{

           INT_EnSF_WDT();       // Enable WDT interrupt, must enble SF interrupt

è SFIE(System Flag Interrupt Enable Register)WDTFIESet 시켜서 WDTF 인터럽트를 활성화시킨다.

è SF 인터럽트도 반드시 활성화시켜야 한다.

           INT_EnSF();               // Enable SF interrupt

è EIE1(Extended Interrupt Enable 1 Register)ESF 비트를 셋 시킴

è ESF(Enabel System Flag Interrupt)가 활성화 되면 PCON1 MCDF, RTCF, BOF1, BOF0, WDTF, AUXR3 STAF, STOF, UTIE가 셋 되어 있을 때의 TI0 와 같은 인터럽트 플래그 발생 시 SFIE의 해당 비트가 셋 되어 있으면 이 플래그가 셋 된다.

}

 

 

⑸ 와치도그타이머 클럭설정

#define WDT_SetClock_32K_DIV_64_1024ms()          WDTCR=(WDTCR&(~0x07))|0x06

- 와치도그 Clock을 설정하는 WDTCS1, WDTCS0 비트가 각각 default 0이므로 WDT Clock SourceILRCO(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_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  다시 카운트를 시작하면 이 비트는 클리어된다.

 

⑺ 인터럽트

 

/***********************************************************************************

*Function:   void INT_SF(void)

*Description:   SF(System Flag)Interrupt handler

                                          RTC,WDTF,BOD0F,BOD1F

*Input:  

*Output:    

*************************************************************************************/

void INT_SF(void) interrupt INT_VECTOR_SF

{

         if((PCON1&WDTF)!=0)               // PCON1WDTF 비트는 WDT Overflow 플래그이고, SF 인터럽트가 발생하는 원인이된다..

         {

                  PCON1=WDTF;                // WDTF 비트를 클리어 키기 위해서는 해당 비트에 1을 써 주면 된다.

                  LED_R=!LED_R;               // LED_R을 토글 시킨다.

         }

           else if((PCON1&BOF0)!=0)

           {

                     PCON1=BOF0;

           }

           else if((PCON1&BOF1)!=0)

           {

                     PCON1=BOF1;

           }

           else if((PCON1&RTCF)!=0)

           {

                     PCON1=RTCF;

           }

}

 

 

4. 프로그램 실행

*** Keil compiler가 인스톨되어 있어야함 ***

해당 Example 폴더를 찾아가 KeilPrj폴더를 Open 한다.

\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\ MG82F6D16_WDT_Int

 

해당 폴더의 Keil project 파일을 더블 클릭하여 실행시킨다.(MG82F6D16_DEMO.uvproj)

 

Rebuild 아이콘을 클릭하여 프로젝트를 컴파일 한다.

 

Demo BoardUSB Connector를 연결하여 전원을 인가하고, 전원 스위치를 ON시키고, OCD ICE를 연결한 상태에서 위 이미지의 Start/Stop Debug Session(Ctrl+F5) 버튼을 눌러 컴파일된 프로젝트의 디버그 데이터를 다운로드 시킨다.(컴파일 시 에러가 발생하지 않아야함)

 

 

다운로드 후 Run(F5) 버튼을 클릭하면 프로그램이 동작한다.

5. 동작 영상

https://youtu.be/KCF60CWHLyc

 

 

반응형