해보기는 했어?

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

MEGAWIN

MG82F6D Series ADC ROLL

롬돌이 2022. 12. 7. 10:15
반응형

1. 프로그램 개요

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

P10에 연결된 회로의 Analog값을 측정하기 위하여 Polling 방식의 ADC를 구현한다. 64개의 측정된 값은 시리얼로 그 데이터를 전송된다.

시리얼 통신은 Timer 1Overflow를 이용한 방식으로 설정하고, Baud Rate9600이다.

 

 

2. 회로도

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

 

3. Code

main routine

void main()

{

    u8 i;

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

    printf("\nHello");                              // 프로그램 시작알림

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

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

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

 

    while(1)

    {

       DelayXms(500);                              // ADC 사이에 0.5초의 시간을 둔다

       LED_R = !LED_R;                            // 이 때 마다 LED Toggle 시킨다. 동작 확인용

 

        for(i=0;i<TEST_ADC_DATA_CNT;i++)

       {   

            LED_G_0=0;                               // ADC를 하나 받을 때마다 LEDON/OFF 시킨다.

           TestBuf[i].W=GetAdcValue();            // Polling 방식으로 하나의 AD 변환 데이터를 취득한다.

            LED_G_0=1;

        }

        printf("\nADC:");                           // ADC 데이터 표시

        for(i=0;i<TEST_ADC_DATA_CNT;i++)

       {   

           printf("%04X ",TestBuf[i].W);            // ADC 결과 값을 16진수로 표시한다.

       }

    }

}

 

 

 

⑵ 시스템 초기화 루틴

void InitSystem(void)
{
           InitPort();
           InitClock();
           InitUart0_T1();
           InitADC();
}
// 시스템 초기화 루틴
 
// 포트 초기화루틴
// 클럭 초기화 루틴
// Timer 1 Overflow를 이용한 UART0 초기화
// ADC 초기화

 

ADC 결과 값을 시리얼로 전송하기 위하여 UART0을 초기화하는 루틴이 추가되었음. UART0 Timer 1Overflow 기능을 이용하여 Baud Rate를 결정하는 방법을 사용하였음

 Megawin Clock Structure를 보면 많은 클럭 소스들이 있고, 다양한 방법으로 Clock Source를 설정할 수 있도록 되어 있다. 그 중 ADC를 위한 ClockCPUCLK를 설정하는 루틴을 추가하였다.

 

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

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

è (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”를 참조한다.

 

- 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으로 항상 유지시킨다.

 

- P10 핀을 아날로그 입력 전용 핀으로 설정한다.

#define PORT_SetP1AInputOnly(x)                                 P1M0=P1M0&(~(x));P1M1=P1M1|(x)

Port 1은 디지털 입/출력으로도 사용이 가능하나 아날로그 입력 핀의 기능도 할 수 있다. P1M0의 해당 비트는 0(clear), P1M1의 해당 비트는 1(set)로 설정하면 아날로그 입력핀으로 설정이 된다.(default)

 

 

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

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

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

*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.

         PORT_SetP1AInputOnly(BIT0);                         // Set P10 as Analog-Input-Only,For ADC input.

}

 

⑷ 클럭 초기화 루틴 è 시스템 클럭 및 내부 클럭을 설정한다.

프로그램의 루틴 자체는 복잡하게 많이 설정해 두었으나 그 구조는 아래와 같다.

MCU_SYSCLK의 값은 11059200, 12000000, 22118400, 24000000, 29491200, 32000000, 44236800, 48000000로 설정이 가능하며, 각각 프로그램 상단에

#define        MCU_SYSCLK          12000000

와 같이 선언해주었다. 그리고, 바로

#define        MCU_CPUCLK          (MCU_SYSCLK)

로 선언하여 System 클럭과 CPU 클럭을 동일하게 사용하기로 선언하였다. 물론 사용자의 선택에 따라 틀려질 수 있으므로 어플리케이션에 따라 선언하면 된다.

#if (MCU_SYSCLK==12000000)                        // System Clock12MHz로 선언되어 있으면

#if (MCU_CPUCLK==MCU_SYSCLK)                    // CPU ClockSystem Clock와 동일하면

         // SysClk=12MHz CpuClk=12MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_1|SYSCLK_MCKDO_DIV_1);         // 이와 같이 설정하고

        

#else

         // SysClk=12MHz CpuClk=6MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_2|SYSCLK_MCKDO_DIV_1);         // CPU clockSystem Clock와 같거나 1/2로 설정할

// 수 있다.

#endif

#endif

- CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_1|SYSCLK_MCKDO_DIV_1);

CKCON0 레지스터의 각 비트를 설정한다.

CKCON0.7 : AFS, Alternated Frequency Selection, 내부 클럭 IHRCO12MHz(AFS = 0), 또는 11.059MHz(AFS = 1)로 설정함

CKCON0.3 : CCKS, CPU Clock Select, 0:CPU CLOCK = System Clock, 1:CPU CLOCK = System Clock/2

CKCON0.0 ~ 2 : Programable System Clock Select. SYSCLK_MCKDO_DIV_1(System Clock = Master Clock Divider Output)

 

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

*Function:   void InitClock(void)

*Description: 

*                                  Initialize clock

*Input:  

*Output:    

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

void InitClock(void)

{

#if (MCU_SYSCLK==11059200)

#if (MCU_CPUCLK==MCU_SYSCLK)

         // SysClk=11.0592MHz CpuClk=11.0592MHz

         CLK_SetCKCON0(IHRCO_110592MHz|CPUCLK_SYSCLK_DIV_1|SYSCLK_MCKDO_DIV_1);

        

#else

         // SysClk=11.0592MHz CpuClk=5.5296MHz

         CLK_SetCKCON0(IHRCO_110592MHz|CPUCLK_SYSCLK_DIV_2|SYSCLK_MCKDO_DIV_1);

#endif

#endif

 

#if (MCU_SYSCLK==12000000)

#if (MCU_CPUCLK==MCU_SYSCLK)

         // SysClk=12MHz CpuClk=12MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_1|SYSCLK_MCKDO_DIV_1);

        

#else

         // SysClk=12MHz CpuClk=6MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_2|SYSCLK_MCKDO_DIV_1);

#endif

#endif

 

#if (MCU_SYSCLK==22118400)

#if (MCU_CPUCLK==MCU_SYSCLK)

         // SysClk=22.1184MHz CpuClk=22.1184MHz

CLK_SetCKCON0(IHRCO_110592MHz|CPUCLK_SYSCLK_DIV_1

                                |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx4, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X4|OSCIn_IHRCO);

#else

         // SysClk=22.1184MHz CpuClk=11.0592MHz

         CLK_SetCKCON0(IHRCO_110592MHz|CPUCLK_SYSCLK_DIV_2

                                           |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx4, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X4|OSCIn_IHRCO);

#endif

#endif

 

#if (MCU_SYSCLK==24000000)

#if (MCU_CPUCLK==MCU_SYSCLK)

         // SysClk=24MHz CpuClk=24MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_1

                                           |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx4, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X4|OSCIn_IHRCO);

#else

         // SysClk=24MHz CpuClk=12MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_2

                                               |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx4, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X4|OSCIn_IHRCO);

#endif

#endif

 

#if (MCU_SYSCLK==29491200)

#if (MCU_CPUCLK==MCU_SYSCLK)

         // Cpuclk high speed

         CLK_SetCpuCLK_HighSpeed();

         // SysClk=29.491200MHz CpuClk=29.491200MHz

         CLK_SetCKCON0(IHRCO_110592MHz|CPUCLK_SYSCLK_DIV_1

                                            |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx5.33, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X533|OSCIn_IHRCO);

#else

         // SysClk=29.491200MHz CpuClk=14.7456MHz

         CLK_SetCKCON0(IHRCO_110592MHz|CPUCLK_SYSCLK_DIV_2

                                           |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx5.33, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X533|OSCIn_IHRCO);

#endif

#endif

 

#if (MCU_SYSCLK==32000000)

#if (MCU_CPUCLK==MCU_SYSCLK)

         // Cpuclk high speed

         CLK_SetCpuCLK_HighSpeed();

         // SysClk=32MHz CpuClk=32MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_1

                                          |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx5.33, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X533|OSCIn_IHRCO);

#else

         // SysClk=32MHz CpuClk=16MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_2

                                          |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx5.33, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X533|OSCIn_IHRCO);

#endif

#endif

 

#if (MCU_SYSCLK==44236800)

         // SysClk=44.2368MHz CpuClk=22.1184MHz

         CLK_SetCKCON0(IHRCO_110592MHz|CPUCLK_SYSCLK_DIV_1

                                            |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx8, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X8|OSCIn_IHRCO);

#endif

 

#if (MCU_SYSCLK==48000000)

         // SysClk=48MHz CpuClk=24MHz

         CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_2

                                            |SYSCLK_MCKDO_DIV_1|ENABLE_CKM|CKM_OSCIN_DIV_2);

         DelayXus(100);

         // IHRCO, MCK=CKMIx8, OSCin=IHRCO

         CLK_SetCKCON2(ENABLE_IHRCO|MCK_CKMI_X8|OSCIn_IHRCO);

#endif

 

         // P60 Output MCK/4

         //CLK_P60OC_MCKDiv4();

}

 

 

UART0초기화 èTimer 1 Overflow를 이용한 Baud Rate 설정

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

*Function:   void InitUart0_T1(void)

*Description:          Initialize Uart0, The source of baud rate was T1

*Input:  

*Output:    

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

void InitUart0_T1(void)

{

         UART0_SetMode8bitUARTVar();                       // UART0 Mode: 8-bit, Variable B.R.

         UART0_EnReception();                                            // Enable reception

         UART0_SetBRGFromT1();                                // B.R. source:T1

         UART0_SetT1BaudRateX2();                            // B.R. x2

 

         TM_SetT1Mode_2_8BIT_AUTORELOAD();

         TM_SetT1Clock_SYSCLK();

         TM_SetT1Gate_Disable();

 

    // Sets B.R. value

         TM_SetT1HighByte(T1_BRGRL_9600_2X_12000000_1T);

         TM_SetT1LowByte(T1_BRGRL_9600_2X_12000000_1T);

 

         TM_EnableT1();

}

 

- UART0 MODE 설정

#define UART0_SetMode8bitUARTVar()                       S0CFG=S0CFG&(~SM30);SM00_FE=0;SM10=1

S0CFG 레지스터의 SM30bit, S0CON 레지스터의 SM00/FE, SM10 비트의 조합으로 여러가지 시리얼 포트 동작 모드를 설정할 수 있다. 그 중 본 예제는 8-bit UART, Variable Baud Rate 특성인 MODE 1을 사용한다.

 

- UART0 Receive Enable

#define UART0_EnReception()                                           REN0=1

UART0이 시리얼 통신으로 데이터를 받아들일 수 있도록 설정한다. S0CON 레지스터의 REN0를 셋(=1) 시킨다.

- UART0 Baud RateTimer 1을 이용해서 만든다.

#define UART0_SetBRGFromT1()                                        SFRPI=1;T2MOD1=T2MOD1&(~TL2IS);SFRPI=0;RCLK_TF2L=0;TCLK_TL2IE=0

SFR PAGE 1에 위치한 T2MOD1 레지스터의 TL2IS 플래그를 클리어 시켜 T2CON5, 4번 비트가 RCLK, TCLK 제어 비트로 동작 할 수 있도록 한다.

RCLK 비트를 0으로 만들어 Timer 1 Overflow UART0의 수신 Clock으로 사용될 수 있도록 설정한다.

TCLK 비트를 0으로 만들어 Timer 1OverflowUART0의 송신 Clock으로 사용될 수 있도록 설정한다.

 

- Double Baud Rate 설정

#define UART0_SetT1BaudRateX2()                            PCON0=PCON0|(SMOD1);S0CFG=S0CFG&(~SMOD2)

PCON0 레지스터의 SMOD1 플래그를 셋 시켜 UART0 MODE 1, 2, 3Double Baud RateEnable 시킨다.

S0CFG 레지스터의 SMOD2 플래그를 클리어 시켜 USRT0 Extra Double Baud Rate Disable 시킨다.

 

- Timer 1을 모드 2 8-bit Auto Reload 모드로 설정.

#define TM_SetT1Mode_2_8BIT_AUTORELOAD()            TMOD=(TMOD&(~(T1M0|T1M1)))|(T1M1)

타이머 1을 모드 2로 설정한다.(T1M0 = 0, T1M1 = 1) 8-bit 타이머로 자동 재적재 기능(Automatic Reload)으로 동작한다.

 

- Timer 1의 클럭 설정

#define TM_SetT1Clock_SYSCLK()                                       AUXR2=(AUXR2|(T1X12));TMOD=(TMOD&(~T1C_T))

AUXR2 레지스터의 T1X12를 셋, TMOD 레지스터의 T1C/TClear 시킴으로써 Timer 1Clock Source SYSCLK로 설정한다.

- Gate Disable(타이머클럭선택, 타이머 트리거 방법 선택)

#define TM_SetT1Gate_Disable()                                        TMOD=TMOD&(~T1GATE)

TMOD레지스터의 T1GATE 비트는 TIMER 1의 클럭 소스를 결정하는 곳과 TIMER 1의 트리거 방법을 설정하는 곳에 사용된다. T1GATE Clear 시킴으로써 TIMER 1 클럭 소스를 System Clock or (System Clock/12) 중 하나로 선택할 수 있고, 클럭이 타이머에 입력되는 것(트리거시그널)을 제어하는 것을 TR1비트로 설정할 수도 있다.

 

- 타이머 1의 상/하위 레지스터의 값을 저장

TM_SetT1HighByte(T1_BRGRL_9600_2X_12000000_1T);

TM_SetT1LowByte(T1_BRGRL_9600_2X_12000000_1T);

타이머 1 UP Counter로 동작하고 0xFF에서 0x00으로 바뀔 때 Overflow 이벤트가 발생한다.

자동 재적재 기능을 갖는 Mode 2 8-bit timer로 설정하였기 때문에 실제 동작하는 카운터는 TL1레지스터이고, TH1은 재적재할 카운터 값을 저장한다. TL1레지스터의 값이 0xFF에서 0x00으로 변하면서 Overflow 이벤트가 발생하면 TH1에 저장되어 있는 데이터가 자동으로 TL1에 재적재 된다.

12MHz 클럭을 사용하고, T1X12=1, SMOD2=0, SMOD1 = 1으로 설정하였으므로 재적재 될 값은 178(0xB2)이다.(데이터시트상의 표 참조)

 

- 타이머 1 Enable(시작)

TM_EnableT1();

마지막으로 TR1 비트를 셋 시켜 타이머 1을 동작 시킨다.

 

è (EN)MG82F6D16_Datasheet_V051.PDF17. Serial Port 0(UART0)를 참조한다.

è (EN)MG82F6D17_Datasheet_V051.PDF18. Serial Port 0(UART0)를 참조한다.

è (EN)MG82F6D64/32_Datasheet_V051.PDF18. Serial Port 0(UART0)를 참조한다.

 

ADC 초기화 è AIN0을 통해 아날로그 값을 입력 받는다.

 

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

*Function:   void InitADC(void)

*Description:          Initialize ADC

*Input:  

*Output:    

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

void InitADC(void)

{

         ADC_Enable();                           // Enable ADC

         ADC_SetClock_SYSCLK ();     // ADC Clock=SYSCLK,sps= 12M/24=500k

         ADC_SetMode_SetADCS ();  // ADC Trigger mode: set ADCS

         ADC_SetRightJustified();               / ADC Data Right-Justified

 

}

 

- ADC를 동작하도록 설정

#define ADC_Enable()                                                     ADCON0=ADCON0|(ADCEN)

ADCON0 레지스터의 ADCEN을 셋 시킨다.

 

- 클럭 설정

#define ADC_SetClock_SYSCLK()                               ADCFG0=ADCFG0&(~(ADCKS0|ADCKS1|ADCKS2))

ADC의 클럭은 System Clock/1, /2, /4, /8, /16, /32 분주해서 사용할 수 있도록 선택 가능하다. 본 예제에서는 System Clock ADC Clock으로 이용한다. 그 외 UART0Baud Rate Generator Overflow, Timer 2Overflow를 사용할 수도 있다.

 

- ADCS 비트를 셋 모드로 설정

#define ADC_SetMode_SetADCS()                             ADCFG0=ADCFG0&(~(ADTM0|ADTM1))

AD 변환의 시작 시그널은 ADCFG0 레지스터의 ADTM1, ADTM0 비트의 조합으로 4가지를 선택할 수 있다.

ADCS 비트를 셋 시키기, Timer 0 Overflow, Free Running, UART0Baud Rate Generator Overflow 로 설정이 가능하며 본 예제에서는 ADCS 비트를 셋 시키기로 설정한다.

 

- 결과 데이터의 정렬

#define ADC_SetRightJustified()                                ADCFG0=ADCFG0|(ADRJ)

ADC 결과 데이터는 ADCDH, ADCDL 레지스터에 저장된다. 10 bit 결과값이므로 왼쪽 또는 오른쪽으로 몰아서 저장할 수 있다. ADCFG0 레지스터의 ADRJ 비트를 Clear 시키면 Left adjust, ADCDH에 먼저 상위 8비트를 채우고, ADCDL7, 6번 비트에 나머지 하위 2 비트를 저장한다. ADRJ 비트를 Set 시키면 Right adjust, 상위 2비트를 ADCDH0, 1번 비트에 저장하고, 하위 8비트를 ADCDL 레지스터에 저장한다.

 

è (EN)MG82F6D16_Datasheet_V051.PDF25. 10-Bit ADC를 참조한다.

è (EN)MG82F6D17_Datasheet_V051.PDF26. 12-Bit ADC를 참조한다.

è (EN)MG82F6D64/32_Datasheet_V051.PDF29. 12-Bit ADC를 참조한다.

 

 

ADC 결과값 읽기

 

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

*Function:   u16 GetAdcValue()

*Description:          read ADC result of the current channel

*Input:  

*Output:               u16 :ADC Value

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

u16 GetAdcValue()

{

    WordTypeDef wAdcValue;                   // ADC 결과값 저장을 위한 변수 선언

    ADCON0 = ADCON0|ADCS;                 // set ADCS for Start ADC

    while((ADCON0&ADCI)==0);                // wait ADC complete

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

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

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

    return wAdcValue.W&0x03FF;               // AD 결과값 반환

}

 

 

 

4. 프로그램 실행

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

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

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

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

 

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

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

 

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

5. 동작 영상

https://www.youtube.com/shorts/0UT_klVAXj4

 

 

반응형

'MEGAWIN' 카테고리의 다른 글

MG82F6D Series I2C Slave Int  (0) 2022.12.09
MG82F6D시리즈 GPIO MODE  (0) 2022.12.08
MG82F6D Series I2C Master  (0) 2022.12.06
MG82F6D Series UART0 TX RX 485  (0) 2022.12.05
MG82F6D Series UART0 TX RX INT  (0) 2022.12.02