해보기는 했어?

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

MEGAWIN

MG82F6D Series ADC with Interrupt - 4

롬돌이 2022. 11. 8. 14:39
반응형

 

Interrupt Timer 0 인터럽트를 활성화시킨다.

 

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

*Function:   void InitInterrupt(void)

*Description:          Initialize Interrupt

*Input:  

*Output:    

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

 

void InitInterrupt(void)

{

         INT_EnTIMER0();                // Enable TIMER0 interrupt.

}       

 

- Timer 0 인터럽트 활성화

#define INT_EnTIMER0()               ET0=1

IE(Interrupt Enable) 레지스터의 ET0 비트를 Set 시킨다.

 

Timer 0 Interrup handler(routine) èTimer 0 인터럽트 발생시 처리하는 루틴

 

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

*Function:   void INT_T0(void)

*Description:  T0  Interrupt handler

*Input:  

*Output:    

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

void INT_T0(void) interrupt INT_VECTOR_T0

{

         TH0=TIMER_12T_1ms_TH;

         TL0=TIMER_12T_1ms_TL;

         if(LedTime!=0) LedTime--;

}

- 1ms 타이머를 유지하기 위하여 TH0 TL0에 설정 값을 저장한다.

- Software Timer를 동작 시킨다.(LedTime 변수의 값이 0이 아니면 1 감소시킨다.)

 

 

ADC Interrupt Handler èADC가 종료되어 인터럽트가 발생할 경우 처리하는 루틴

 

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

*Function:   void INT_ADC(void) 

*Description:  ADC Interrupt handler

*Input:  

*Output:    

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

void INT_ADC(void)           interrupt INT_VECTOR_ADC

{

         WordTypeDef wAdcValue;

         LED_G_0=0;

    wAdcValue.B.BHigh=ADCDH;   // ADC결과 상위 바이트 저장

    wAdcValue.B.BLow=ADCDL;     // ADC 결과 하위 바이트 저장

         TestBuf[TestBufLen].W= wAdcValue.W;       // word size ADC resultTestBuf에 저장한다.

         TestBufLen++;                                    // 버퍼 길이를 1 증가시킨다.

         if(TestBufLen>=TEST_ADC_DATA_CNT)      // 버퍼의 데이터가 64개가 저장되면

         {

                  bAdcflag=TRUE;                        // bAdcflagTRUE를 저장하고

                  INT_DisADC();                           // ADC 인터럽트를 Disable 시킨다.

         }

         ADCON0 = ADCON0&(~ADCI);                                      // Clear flag

         LED_G_0=1;

}

ADC 인터럽트 루틴에서는 위의 주석문과 같이 64AD 변환 후 ADC 인터럽트를 Disable 시킨다. AD 변환된 데이터는 Main routine에서 시리얼로 전송한다. 전송이 완료되면 다시 ADC 인터럽트를 Enable 시킨다.

 

4. 프로그램 실행

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

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

\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\MG82F6D16_ADC_Int\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/VapfpKmVTrI

 

 

반응형

'MEGAWIN' 카테고리의 다른 글

MG82F6D Series CLK xtal  (0) 2022.11.10
MG82F6D Series GPIO P6  (0) 2022.11.09
MG82F6D Series ADC with Interrupt - 3  (0) 2022.11.08
MG82F6D Series ADC with Interrupt - 2  (0) 2022.11.08
MG82F6D Series ADC with Interrupt - 1  (0) 2022.11.08