해보기는 했어?

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

MEGAWIN

MG82F6D Series RTC Timer

롬돌이 2022. 12. 1. 09:56
반응형

1. 프로그램 개요

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

IC 내부에 내장된 RTC를 테스트 한다.

 

 

2. 회로도

                         

 

 

 

 

3. Code

main routine

void main()

{

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

         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(100);                         // 100ms 딜레이

        LED_G_0=!LED_G_0;                    // LED_G_0 토글

    }

}

⑵ 시스템 초기화 루틴

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

*Function:   void InitSystem(void)

*Description:           Initialize MCU

*Input:  

*Output:    

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

void InitSystem(void)

{

           InitPort();                  // 포트 설정

           InitRTC();                  // RTC 설정

           InitInterrupt();             // Initialize Interrupt

           INT_EnAll();                // Enable global interrupt

}

- 포트 설정을 수행한다.

- 시스템 클럭은 defaultIHRCO 12MHz로 설정된다.

- RTC 설정

- 인터럽트 동작 설정

- 인터럽트 전체 동작 설정

 

 

Port 초기화

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

*Function:   void InitPort(void)

*Description:            Initialize IO Port

*Input:  

*Output:    

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

void InitPort(void)

{

           EnP44P45GPIO();

è P44, P45GPIO로 사용하도록 설정함

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

è P22, P24, P26LED 구동을 위하여 Push-Pull type로 설정한다.

           PORT_SetP4OpenDrainPu(BIT4|BIT5);

è P44, P45 Pull-Up을 가진 Open Drain 모드로 설정한다.

}

 

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

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

 

RTC 초기화 루틴

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

*Function:   void InitRTC(void)

*Description:   Initialize RTC

*                    RTC Clock source: ILRCO 32KHz

*                    RTC Clock prescale: 32

*                    RTC Reload Value: (64-10)=54

*                    RTC Overflow freq: 32K/32/10 ~= 100Hz

*Input:  

*Output:    

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

void InitRTC(void)

{        

           RTC_SetClock_ILRCO();                   // RTC Clock source: ILRCO 32KHz

           RTC_SetClock_Div_32();                    // RTC Clock prescale: 32

           RTC_SetReload(64-10);                    // RTC Reload Value: (64-10)=54

           RTC_SetCounter(64-10);

           RTC_EnRTCO_OutP45();                   // Enable RTC output on P45

           RTC_ClearRTCF();                           // clear RTCF

           RTC_Enable();                      // Enable RTC

}

- RTC 클럭을 ILRCO로 설정

#define RTC_SetClock_ILRCO()

           ISPCR=0x80;IFADRH=0x0;IFADRL=CKCON4_P;IFMT=ISP_READ_P;SCMD=0x46;SCMD=0xB9;_nop_();

IFD=(IFD&(0x1F))|(RCSS0_P);IFADRH=0x0;IFADRL=CKCON4_P;IFMT=ISP_WRITE_P;SCMD=0x46;SCMD=0xB9;_nop_();

IFMT=0;ISPCR=0x0

Page P에 있는 CKCON4 Bit7~5를 이용해서 다양한 클럭 소스원 중 ILRCO로 설정하돌록 한다.

 

- RTC Clock Prescale32로 설정한다. RTCCS.3~0 1010으로 설정

#define RTC_SetClock_Div_32()

           RTCTM=(RTCTM&(0x3F))|(BIT7);

ISPCR=0x80;IFADRH=0x0;IFADRL=CKCON4_P;IFMT=ISP_READ_P;SCMD=0x46;SCMD=0xB9;_nop_();

IFD=(IFD&(0xFC))|(BIT1);IFADRH=0x0;IFADRL=CKCON4_P;IFMT=ISP_WRITE_P;SCMD=0x46;SCMD=0xB9; _nop_();

IFMT=0;ISPCR=0x0

RTCM 7번비트와 6번 비트가 RTCCS.1, RTCCS.0이다. 따라서 RTCTM 7, 6번 비트를 클리어 시키고, 7번 비트를 셋 시킨다.

Page P CKCON4레지스터의 값을 읽고, RTCCS.3, RTCCS.21, 0번 비트를 클리어 시키고, RTCCS.3을 셋 시킨다.

그렇게 되면 Prescale32로 설정할 수 있다.

 

- 재적재 값 및 RTC 카운트 값 저장

#define RTC_SetReload(x)               RTCCR=(RTCCR&(0xC0))|(x)

#define RTC_SetCounter(x)             RTCTM=(RTCTM&(0xC0))|(x)

RTC 카운트는 최대 64회이다. 앞선 클럭 설정에서 32kHzILRCO로 설정되었고 Prescaler32로 설정되어 RTC 카운트에 입력되는 클럭은 1kHz 1ms주기가 된다.

재적재 값과 카운트 값을 (64-10)으로 한 것은 10m 마다 Overflow를 만들어주기 위해서이다.

 

 

- RTCKO 포트 지정

#define RTC_EnRTCO_OutP45()                            RTCCR=RTCCR|RTCO

RTCKOP45를 사용한다.

Overflow 마다 P45의 논리가 토글 된다.(LED 시그널과 동일한 신호 발생)

 

- RTC 플래그 클리어

#define RTC_ClearRTCF()                                     PCON1=RTCF

플래그를 클리어 시켜 초기 동작을 확실시 시킨다.

 

- RTC 카운터의 동작을 시작한다.

#define RTC_Enable()                                RTCCR=RTCCR|RTCE

 

 

⑹ 인터럽트 초기화

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

*Function:   void InitInterrupt(void)

*Description:           Initialize Interrupt

*Input:  

*Output:    

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

void InitInterrupt(void)

{

           INT_EnSF_RTC();                                                             // Enable RTC interrupt, must enble SF interrupt

           INT_EnSF();                                                                    // Enable SF interrupt

}

 

- RTCF 인터럽트 활성화

#define INT_EnSF_RTC()                  SFIE=SFIE|RTCFIE

SFIE(시스템 플래그 인터럽트 인에이블 레지스터)RTCFIE를 셋 시켜서 RTCF 인터럽트를 활성화 시킨다. RTCF CPUidle 또는 Power down 모드일 경우 wake up 시킬 수 있다.

 

- 확장 인터럽트 인에이블

#define INT_EnSF()                         EIE1=EIE1|ESF

EIE1(확장된 인터럽트 인에이블 1 레지스터)ESF를 셋 시켜서 다양한 시스템 플래그들에 대한 인터럽트를 준비한다.

 

 

Enable Global Interrupt

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

사용자가 설정한 시스템 인터럽트를 Enable 시킨다.

 

 

⑻ 인터럽트 루틴

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

*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            // SF 시스템 플래그에 대한 인터럽트 서비스 루틴

{

           if((PCON1&WDTF)!=0)           // 와치도그 타이머 인터러트 시

           {

                     PCON1=WDTF;          // 와치도그 플래그클리어

           }

           if((PCON1&BOF0)!=0) // BOD 0 인터럽트

           {

                     PCON1=BOF0; // BOD 0 인터럽트 플래그 클리어

           }

           if((PCON1&BOF1)!=0) // BOD 1 인터럽트

           {

                     PCON1=BOF1; // BOD 1 인터럽트 플래그 클리어

           }

           if((PCON1&RTCF)!=0) // RTC 인터럽트

           {

                     PCON1=RTCF; // RTC 인터럽트 플래그 클리어

                     LED_R=!LED_R;          // LED_R 토글

           }

}

4. 프로그램 실행

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

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

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

 

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

 

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

 

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

 

 

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

5. 동작 영상

 

https://youtu.be/-xyVtxQbb1M

 

반응형

'MEGAWIN' 카테고리의 다른 글

MG82F6D Series UART0 TX RX 485  (0) 2022.12.05
MG82F6D Series UART0 TX RX INT  (0) 2022.12.02
MG82F6D PCA PWM 16bit  (0) 2022.11.30
MG82F6D Series PCA Timer 16bit  (0) 2022.11.29
MG82F6D Series BOD  (0) 2022.11.28