해보기는 했어?

오늘 안됐다고 포기하지 말고 용기내서 내일 다시 해 보자.

MEGAWIN

MG82F6D Series BOD

롬돌이 2022. 11. 28. 10:03
반응형

1. 프로그램 개요

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

Brown-Out Detector(BOD0, BOD1)VDD 전원을 모니터한다.

BOD01.7V 확인으로 고정되어 있고, BOD14.2V, 3.7V, 2.4V, 2.0V로 설정할 수 있다.

BOD0가 확인 레벨과 맞게 되면 PCON1레지스터의 BOF0 비트가 셋 된다. 만약 ESF(EIE1레지스터의 3번비트와 BOF0IE(SFIE레지스터의 1번 비트)가 사용가능하게 되어 있으면 BOF0는 인터럽트 플래그를 발생시킨다. 정상동작이든 대기모드이든 상관없이 인터럽트가 동작한다. BOD1도 동일한 동작을 하게 되며, 만약 AWBOD1(PCON2 레지스터의 7번 비트)이 셋 되어 있으면 CPUPower Down 모드에 있을 때 인터럽트로 Wake up 시키는 것도 가능하다.

 

 

 

 

2. 회로도

/* LED 부분 회로도 추가 */

 

3. Code

main routine

void main()

{

InitSystem();                                      // 시스템 초기화 루틴

 

           bBOD1Flag=0;                                              // BOD1 발생 플래그

           LED_G_0=0;LED_G_1=0;LED_R=0;                         // LED ALL ON

           DelayXms(1000);                                            // 1초 딜레이

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

while(1)

{

                     DelayXms(200);                                   // 200ms 딜레이

                     LED_G_0=!LED_G_0;                              // LED_G Toggle

                     if(bBOD1Flag)                                     // BOD1 플래그가 셋 되어 있으면

                     {

                                if((PCON1 & BOF1)!=0)               // PCON1 레지스터의 BOF1이 셋 되어 있으면

                                {// BOF1 set VDD<3.7V               // VDD3.7V 미만이 된 것임

                                          PCON1 = BOF1;             // clear flag

                                }

                                else                                      // BOF1이 클리어 되어 있으면

                                {// VDD>3.7V                           // VDD3.7V 이상이므로

                                          //Power voltage restored. Enable BOD1 interruption

                                          LED_R=1;                     // LED_ROFF 시키고

                                          bBOD1Flag = FALSE;       // bBOD1Flag를 클리어 시키고

                                          INT_EnSF_BOD1();          // 시스템 인터럽트에 BOD1을 등록시킨다.

                                }

                     }

}

}

- InitBOD 루틴에서 BOD1에 의해 MCU가 리셋 되도록 설정할 수도 있고, 인터럽트만 발생할 수 있도록 설정할 수도 있다.

- 동작 영상을 보면 BOD1 설정 전압인 3.7V 미만으로 입력 전원이 낮아졌을 때 LED가 켜지는 것을 확인할 수 있다. MCU리셋을 시키지 않았을 때이다.

- MCU 리셋을 시켰을 경우 BOD1 설정 전압 이하로 내려가면 MCU가 리셋에 걸리고, 그 이상이 되면 다시 동작을 시작하는 것을 확인할 수 있다.

- MCU 리셋을 시킬 경우 출력 포트 핀들의 리셋 상태를 확인할 필요가 있다. 불필요한 오동작을 방지하기 위해서 설계시 주의가 필요하다.

 

⑵ 시스템 초기화 루틴

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

*Function:   void InitSystem(void)

*Description:           Initialize MCU

*Input:  

*Output:    

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

void InitSystem(void)

{

 

           InitPort();

           InitBOD();

           InitInterrupt();

 

           INT_EnAll();                                                                              // Enable global interrupt

}

포트 초기화를 시키고, BOD 초기화를 시킴. 인터럽트를 설정하고 EA를 셋 시켜 인터럽트 동작에 대비한다.

각각의 루틴들을 확인해 보도록 한다.

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

 

 

⑶ 포트 초기화 루틴 è 회로도를 보면서 각 입출력 핀의 속성을 지정한다.

è (EN)MG82F6D16_Datasheet_V051.PDF13Configurable I/O Ports”를 참조한다.

è (EN)MG82F6D17_Datasheet_V051.PDF14Configurable I/O Ports”를 참조한다.

è (EN)MG82F6D64/32_Datasheet_V051.PDF14Configurable I/O Ports”를 참조한다.

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

*Function:   void InitPort(void)

*Description:            Initialize IO Port

*Input:  

*Output:    

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

void InitPort(void)

{

           PORT_SetP3QuasiBi(BIT0|BIT1);                                       // Set P30,P31 as Quasi-Bidirectional,For UART.

           PORT_SetP2PushPull(BIT2|BIT4|BIT6);                              // Set P22,P24,P26 as Push-Pull,For LED.

}

- P30, P31 : 각각 RXD0, TXD0 속성을 갖고 있어 양방향 핀으로 설정한다.

#define PORT_SetP3QuasiBi(x)                            P3M0=P3M0&(~(x));P3M1=P3M1&(~(x))

Port 3의 핀들을 Quasi-Bidirectional(default) 속성으로 설정하려면, P3M0, P3M1 레지스터의 대응되는 비트를 각각 0으로 설정하면 된다.

 

- P22, P24, P26Push-Pull type으로 설정한다.(LED연결)

#define PORT_SetP2PushPull(x)                           P2M0=P2M0|(x); SFRPI=1;P2M1=P2M1&(~(x));SFRPI=0

Port 2의 핀들을 Push-Pull 속성으로 설정하려면 P2M0의 해당 비트는 1(set), P2M1의 해당비트는 0(clear)로 각각 설정하면 된다.

P2M1 레지스터는 SFR Page 1에서만 설정이 가능하므로 위 매크로에서 보면 SFRPI=1, SFRPI=0의 코드가 추가되었다.

정상적인 동작을 위하여 SFRPI default 0으로 항상 유지시킨다.

 

 

*** 위 매크로함수는 “API_Macro_MG82FG6D16.H”에서 찾아볼 수 있다.(각각의 IC별로 선언된 API_Macro_MG82FG6Dxx.H를 찾아본다.)

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

 

BOD 초기화 루틴

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

*Function:   void InitBOD(void)

*Description:           Initialize BOD

*Input:  

*Output:    

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

void InitBOD(void)

{

           u8 x;

           // clear flag

           PCON1=BOF0|BOF1;

è BOF0, BOF1 Clear 시키기 위하여 해당 비트에 1을 쓴다.

           x=BIT0;                    

è x = 0x01

           x=x|POW_BOD1_Enable;                                       // Enable BOD1

è x = 0x05

           //x=x|POW_BOD1_Disable;                                   // Disable BOD1

 

           //x=x|POW_BOD1_Set42V;                                    // BOD1 Detecting 4.2V

           x=x|POW_BOD1_Set37V;                                       // BOD1 Detecting 3.7V

           //x=x|POW_BOD1_Set24V;                                    // BOD1 Detecting 2.4V

           //x=x|POW_BOD1_Set20V;                                    // BOD1 Detecting 2.0V

è x = 0x25

           //x=x|POW_BOD1_Enable_OnPD;                           // Enable BOD1 on PD mode

           x=x|POW_BOD1_Disable_OnPD;                             // Disable BOD1 on PD mode

è x = 0x25

           x=x|POW_BOD1_EnReset;                                    // Enable BOD1 to trigger a MCU reset

           //x=x|POW_BOD1_DisReset;                      // Disable BOD1 to trigger a MCU reset

è x = 0x2D

           x=x|POW_BOD0_EnReset;                                    // Enable BOD0(1.7V) to trigger a MCU reset

           //x=x|POW_BOD0_DisReset;                      // Disable BOD0(1.7V) to trigger a MCU reset

è x = 0x2F

           IAP_WritePPage(PCON2_P, x);         

è 설정된 데이터를 PCON2에 라이팅한다.

}        

 

- BOD13.7V에 맞춰 동작하도록하고, BD1 Power Down Mode에서는 동작하지 않도록 하고, BOD0에 의한 리셋이 동작하도록 한다.

 

 

 

⑸ 인터럽트 설정

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

*Function:   void InitInterrupt(void)

*Description:          Initialize Interrupt

*Input:  

*Output:    

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

void InitInterrupt(void)

{

         INT_EnSF_BOD1();                       // Enable BOD1 interrupt

         INT_EnSF();                               // Enable SF interrupt

        

}       

- BOD1인터럽트 사용 설정

- SF 인터럽트사용 설정

 

 

 

 

 

4. 프로그램 실행

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

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

\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\MG82F6D16_BOD\KeilPrj

 

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

 

 

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

 

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

 

 

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

5. 동작 영상

https://youtube.com/shorts/fJKv2uDqGn0?feature=share

 

 

1. 프로그램 개요

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

Brown-Out Detector(BOD0, BOD1)VDD 전원을 모니터한다.

BOD01.7V 확인으로 고정되어 있고, BOD14.2V, 3.7V, 2.4V, 2.0V로 설정할 수 있다.

BOD0가 확인 레벨과 맞게 되면 PCON1레지스터의 BOF0 비트가 셋 된다. 만약 ESF(EIE1레지스터의 3번비트와 BOF0IE(SFIE레지스터의 1번 비트)가 사용가능하게 되어 있으면 BOF0는 인터럽트 플래그를 발생시킨다. 정상동작이든 대기모드이든 상관없이 인터럽트가 동작한다. BOD1도 동일한 동작을 하게 되며, 만약 AWBOD1(PCON2 레지스터의 7번 비트)이 셋 되어 있으면 CPUPower Down 모드에 있을 때 인터럽트로 Wake up 시키는 것도 가능하다.

 

 

 

 

2. 회로도

/* LED 부분 회로도 추가 */

 

3. Code

main routine

void main()

{

InitSystem();                                      // 시스템 초기화 루틴

 

           bBOD1Flag=0;                                              // BOD1 발생 플래그

           LED_G_0=0;LED_G_1=0;LED_R=0;                         // LED ALL ON

           DelayXms(1000);                                            // 1초 딜레이

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

while(1)

{

                     DelayXms(200);                                   // 200ms 딜레이

                     LED_G_0=!LED_G_0;                              // LED_G Toggle

                     if(bBOD1Flag)                                     // BOD1 플래그가 셋 되어 있으면

                     {

                                if((PCON1 & BOF1)!=0)               // PCON1 레지스터의 BOF1이 셋 되어 있으면

                                {// BOF1 set VDD<3.7V               // VDD3.7V 미만이 된 것임

                                          PCON1 = BOF1;             // clear flag

                                }

                                else                                      // BOF1이 클리어 되어 있으면

                                {// VDD>3.7V                           // VDD3.7V 이상이므로

                                          //Power voltage restored. Enable BOD1 interruption

                                          LED_R=1;                     // LED_ROFF 시키고

                                          bBOD1Flag = FALSE;       // bBOD1Flag를 클리어 시키고

                                          INT_EnSF_BOD1();          // 시스템 인터럽트에 BOD1을 등록시킨다.

                                }

                     }

}

}

- InitBOD 루틴에서 BOD1에 의해 MCU가 리셋 되도록 설정할 수도 있고, 인터럽트만 발생할 수 있도록 설정할 수도 있다.

- 동작 영상을 보면 BOD1 설정 전압인 3.7V 미만으로 입력 전원이 낮아졌을 때 LED가 켜지는 것을 확인할 수 있다. MCU리셋을 시키지 않았을 때이다.

- MCU 리셋을 시켰을 경우 BOD1 설정 전압 이하로 내려가면 MCU가 리셋에 걸리고, 그 이상이 되면 다시 동작을 시작하는 것을 확인할 수 있다.

- MCU 리셋을 시킬 경우 출력 포트 핀들의 리셋 상태를 확인할 필요가 있다. 불필요한 오동작을 방지하기 위해서 설계시 주의가 필요하다.

 

⑵ 시스템 초기화 루틴

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

*Function:   void InitSystem(void)

*Description:           Initialize MCU

*Input:  

*Output:    

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

void InitSystem(void)

{

 

           InitPort();

           InitBOD();

           InitInterrupt();

 

           INT_EnAll();                                                                              // Enable global interrupt

}

포트 초기화를 시키고, BOD 초기화를 시킴. 인터럽트를 설정하고 EA를 셋 시켜 인터럽트 동작에 대비한다.

각각의 루틴들을 확인해 보도록 한다.

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

 

 

⑶ 포트 초기화 루틴 è 회로도를 보면서 각 입출력 핀의 속성을 지정한다.

è (EN)MG82F6D16_Datasheet_V051.PDF13Configurable I/O Ports”를 참조한다.

è (EN)MG82F6D17_Datasheet_V051.PDF14Configurable I/O Ports”를 참조한다.

è (EN)MG82F6D64/32_Datasheet_V051.PDF14Configurable I/O Ports”를 참조한다.

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

*Function:   void InitPort(void)

*Description:            Initialize IO Port

*Input:  

*Output:    

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

void InitPort(void)

{

           PORT_SetP3QuasiBi(BIT0|BIT1);                                       // Set P30,P31 as Quasi-Bidirectional,For UART.

           PORT_SetP2PushPull(BIT2|BIT4|BIT6);                              // Set P22,P24,P26 as Push-Pull,For LED.

}

- P30, P31 : 각각 RXD0, TXD0 속성을 갖고 있어 양방향 핀으로 설정한다.

#define PORT_SetP3QuasiBi(x)                            P3M0=P3M0&(~(x));P3M1=P3M1&(~(x))

Port 3의 핀들을 Quasi-Bidirectional(default) 속성으로 설정하려면, P3M0, P3M1 레지스터의 대응되는 비트를 각각 0으로 설정하면 된다.

 

- P22, P24, P26Push-Pull type으로 설정한다.(LED연결)

#define PORT_SetP2PushPull(x)                           P2M0=P2M0|(x); SFRPI=1;P2M1=P2M1&(~(x));SFRPI=0

Port 2의 핀들을 Push-Pull 속성으로 설정하려면 P2M0의 해당 비트는 1(set), P2M1의 해당비트는 0(clear)로 각각 설정하면 된다.

P2M1 레지스터는 SFR Page 1에서만 설정이 가능하므로 위 매크로에서 보면 SFRPI=1, SFRPI=0의 코드가 추가되었다.

정상적인 동작을 위하여 SFRPI default 0으로 항상 유지시킨다.

 

 

*** 위 매크로함수는 “API_Macro_MG82FG6D16.H”에서 찾아볼 수 있다.(각각의 IC별로 선언된 API_Macro_MG82FG6Dxx.H를 찾아본다.)

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

BOD 초기화 루틴

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

*Function:   void InitBOD(void)

*Description:           Initialize BOD

*Input:  

*Output:    

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

void InitBOD(void)

{

           u8 x;

           // clear flag

           PCON1=BOF0|BOF1;

è BOF0, BOF1 Clear 시키기 위하여 해당 비트에 1을 쓴다.

           x=BIT0;                    

è x = 0x01

           x=x|POW_BOD1_Enable;                                       // Enable BOD1

è x = 0x05

           //x=x|POW_BOD1_Disable;                                   // Disable BOD1

 

           //x=x|POW_BOD1_Set42V;                                    // BOD1 Detecting 4.2V

           x=x|POW_BOD1_Set37V;                                       // BOD1 Detecting 3.7V

           //x=x|POW_BOD1_Set24V;                                    // BOD1 Detecting 2.4V

           //x=x|POW_BOD1_Set20V;                                    // BOD1 Detecting 2.0V

è x = 0x25

           //x=x|POW_BOD1_Enable_OnPD;                           // Enable BOD1 on PD mode

           x=x|POW_BOD1_Disable_OnPD;                             // Disable BOD1 on PD mode

è x = 0x25

           x=x|POW_BOD1_EnReset;                                    // Enable BOD1 to trigger a MCU reset

           //x=x|POW_BOD1_DisReset;                      // Disable BOD1 to trigger a MCU reset

è x = 0x2D

           x=x|POW_BOD0_EnReset;                                    // Enable BOD0(1.7V) to trigger a MCU reset

           //x=x|POW_BOD0_DisReset;                      // Disable BOD0(1.7V) to trigger a MCU reset

è x = 0x2F

           IAP_WritePPage(PCON2_P, x);         

è 설정된 데이터를 PCON2에 라이팅한다.

}        

 

- BOD13.7V에 맞춰 동작하도록하고, BD1 Power Down Mode에서는 동작하지 않도록 하고, BOD0에 의한 리셋이 동작하도록 한다.

 

 

 

⑸ 인터럽트 설정

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

*Function:   void InitInterrupt(void)

*Description:          Initialize Interrupt

*Input:  

*Output:    

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

void InitInterrupt(void)

{

         INT_EnSF_BOD1();                       // Enable BOD1 interrupt

         INT_EnSF();                               // Enable SF interrupt

        

}       

- BOD1인터럽트 사용 설정

- SF 인터럽트사용 설정

 

 

 

 

 

4. 프로그램 실행

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

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

\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\MG82F6D16_BOD\KeilPrj

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

 

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

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

 

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

5. 동작 영상

https://youtube.com/shorts/fJKv2uDqGn0?feature=share

 

 

 

반응형

'MEGAWIN' 카테고리의 다른 글

MG82F6D PCA PWM 16bit  (0) 2022.11.30
MG82F6D Series PCA Timer 16bit  (0) 2022.11.29
MG82F6D Series INT nINTx Wake UP  (0) 2022.11.25
MG82F6D Series CMP  (0) 2022.11.24
MG82F6D Series TIM_T0T1_Mode 0  (0) 2022.11.23