MG82F6D Series PCA Capture Buf
1. 프로그램 개요
P22는 Green 0 LED, P24는 Red LED, P26은 Green 1 LED가 연결되어 있다.
캡쳐 모드 사용시 CAPNn, CAPPn 중 하나 또는 두 개가 모두 셋 되어 있어야 한다. 외부 핀인 CEX 에서 파형의 변화를 확인한다. PCA0 하드웨어에서 유의미한 변화가 감지되면 캡처 레지스터(CCAPnL, CCAPnH)로 PCA0 카운터 레지스터(CH, CL)의 값이 저장된다. CCFn과 ECCFn 비트가 모두 셋 되어 있으면 인터럽트가 발생한다.
폭이 좁은 신호에는 버퍼를이용한 캡쳐모드가 필요하다. 활성화가 되면 홀수 모듈의 캡쳐 데이터 레지스터(CCAPnH, CCAPnL, n=1, 3, 5)는 짝수 모듈의 캡쳐 데이터 레지스터들(채널 0, 2, 4)의 버퍼 레지스터로 사용된다. 모듈 0/2/4의 캡쳐 동작에는 영향을 주지 않는다. BME0는 0/1, BME2는 2/3, BME4는 모듈 4/5를 가능하게 한다.
* 예제 프로그램 원본에서는 CEX0을 P30으로 설정하도록 되어 있었으나 UART0과 충돌이 발생하여 동작하지 않아 P22를 CEX0로 설정하도록 수정하였다.
2. 회로도
3. Code
⑴ main routine
void main()
{
InitSystem(); // 시스템 초기화
printf("\nHello!!"); // 시리얼로 Hello!! 송신
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
INT_EnAll(); // 글로벌 인트럽트 인에이블
C0Capture.W=0; // 캡쳐 버퍼 클리어
while(1)
{
DelayXms(1000); // 1초 딜레이
LED_R=!LED_R; // LED_R 토글
bBusy=1; // 캡쳐 정지
if(C0Capture.W!=0) // 캡쳐 값이 0이 아니면
{
Freq.DW = (u32)(MCU_SYSCLK)/C0Capture.W; // 시스템클럭(12MHz)에서 캡쳐 값을 나누어줌
printf("\nC0 Freq:%ldHz",Freq.DW); // 시리얼로 캡져된 주파수 값을 전송함
}
bBusy=0; // 캡쳐 다시 시작
}
}
⑵ 시스템 초기화 루틴
/***********************************************************************************
*Function: void InitSystem(void)
*Description: Initialize MCU
*Input:
*Output:
*************************************************************************************/
void InitSystem(void)
{
InitClock();
InitPort();
InitPCA_Capture_Buffer();
InitUart0_T1();
InitInterrupt();
}
- 클럭 초기화(시스템 클럭 12MHz)
- 포트 설정 수행한다.
- PCA 캡쳐 모드를 버퍼모드로 초기화
- UART0 초기화
- 인터럽트 초기화
⑶ 클럭 초기화 루틴 è 시스템 클럭 및 내부 클럭을 설정한다.
프로그램의 루틴 자체는 복잡하게 많이 설정해 두었으나 그 구조는 아래와 같다.
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 Clock를 12MHz로 선언되어 있으면
#if (MCU_CPUCLK==MCU_SYSCLK) // CPU Clock가 System 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 clock는 System Clock와 같거나 1/2로 설정할
// 수 있다.
#endif
#endif
- CLK_SetCKCON0(IHRCO_12MHz|CPUCLK_SYSCLK_DIV_1|SYSCLK_MCKDO_DIV_1);
CKCON0 레지스터의 각 비트를 설정한다.
CKCON0.7 : AFS, Alternated Frequency Selection, 내부 클럭 IHRCO를 12MHz(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();
}
⑷ 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, P26은 LED 구동을 위하여 Push-Pull type로 설정한다.
PORT_SetP2OpenDrain(BIT2|BIT4|BIT6); // P22, P24, P26을 입력 핀으로 설정한다.
P22=1;
P24=1;
P26=1;
}
*** 사용된 매크로함수는 “API_Macro_MG82FG6D16.H”에서 찾아볼 수 있다.
\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\MG82F6D16_PCA_Capture_Buf\code\include
⑸ PCA 캡쳐 모드 초기화
/***********************************************************************************
*Function: void InitPCA_Capture_Buffer(void)
*Description: Initialize PCA for capture buffer
*Input:
*Output:
*************************************************************************************/
void InitPCA_Capture_Buffer(void)
{
PCA_SetCLOCK_SYSCLK(); // PCA clock: SysClk = 12MHz
PCA_CH0_SetMode_16BitCaptureFalling(); // set CH0 for 16bit capture falling edge
PCA_CH01_SetPWM_EnBufferMode(); // enable Buffer mode
PCA_SetCounter(0);
PCA_SetCounterReload(0);
//PCA_SetCEX0CEX2CEX4_P30P31P33(); // CEX0/CEX2/CEX4 pin:P30P31P33
PCA_SetCEX0CEX2CEX4_P22P24P26(); // CEX0/CEX2/CEX4 pin:P22P24P26
PCA_CH0_EnInterrupt(); // Enable CH0 interrupt
PCA_EnPCACounter(); // Enable PCA counter
}
- PCA 클럭을 시스템 클럭으로 설정
#define PCA_SetCLOCK_SYSCLK() CMOD=(CMOD&(~(CPS2|CPS1|CPS0)))|(CPS2|CPS0)
CMOD 레지스터의 CPS0, CPS2를 셋 시켜서 내부 클럭, 시스템 클럭을 PCA0 카운터의 클럭 소스로 사용하도록 한다.
그러므로, PCA0의 카운트는 (1/12MHz = 0.083us)마다 1 증가한다.
- 에지 설정
#define PCA_CH0_SetMode_16BitCaptureFalling() CCAPM0=CAPN0
CCAPM0의 CAPN0을 셋 시킴으로써 CEX0핀의 하강 에지에서 인식이 되도록 설정한다.
- 캡쳐 버퍼모드 설정
#define PCA_CH01_SetPWM_EnBufferMode() CMOD=CMOD|BME0
CMOD 레지스터의 BME0를 셋 시킴으로써 PCA0 모듈 0/1을 버퍼 모드로 사용하도록 설정한다.
- 카운터 클리어
PCA_SetCounter(0);
PCA_SetCounterReload(0);
#define PCA_SetCounter(x) CH=HIBYTE(x);CL=LOBYTE(x)
#define PCA_SetCounterReload(x) CHRL=HIBYTE(x);CLRL=LOBYTE(x)
PCA0 카운터의 값을 클리어 시켜주고, 리로드 카운터의 값도 클리어 시켜준다.
- CEX 핀 설정
#define PCA_SetCEX0CEX2CEX4_P30P31P33() SFRPI=2;AUXR5=AUXR5|(C0PS0);SFRPI=0
SFR 페이지 1에 위치한 AUXR5의 C0PS0를 셋 시킴으로써 CEX0, CEX2, CEX4를 P30, P31, P33으로 설정한다.
P30, P31은 시리얼포트로 사용중이므로 CEX0, CEX2, CEX4를 P22, P24, P26으로 변경하였다.
PCA_SetCEX0CEX2CEX4_P22P24P26(); // CEX0/CEX2/CEX4 pin:P22P24P26
- PCA 채널 0인터럽트 설정
#define PCA_CH0_EnInterrupt() CCAPM0=CCAPM0|ECCF0
CCAPM0레지스터의 ECCF0 비트를 셋 시킴으로써 PCA CH0의 인터럽트를 활성화 시킨다.
- PCA 카운터 동작
#define PCA_EnPCACounter() CR=1
CR 비트를 셋 시킴으로써 PCA 카운터를 동작 시킨다.
è (EN)MG82F6D16_Datasheet_V051.PDF의 16. Programmable Counter Array(PCA0)를 참조한다.
è (EN)MG82F6D17_Datasheet_V051.PDF의 17. Programmable Counter Array(PCA0)를 참조한다.
è (EN)MG82F6D64/32_Datasheet_V051.PDF의 17. Programmable Counter Array(PCA0)를 참조한다.
⑹ 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 Rate를 Timer 1을 이용해서 만든다.
#define UART0_SetBRGFromT1() SFRPI=1;T2MOD1=T2MOD1&(~TL2IS);SFRPI=0;RCLK_TF2L=0;TCLK_TL2IE=0
SFR PAGE 1에 위치한 T2MOD1 레지스터의 TL2IS 플래그를 클리어 시켜 T2CON의 5번, 4번 비트가 RCLK, TCLK 제어 비트로 동작 할 수 있도록 한다.
RCLK 비트를 0으로 만들어 Timer 1의 Overflow가 UART0의 수신 Clock으로 사용될 수 있도록 설정한다.
TCLK 비트를 0으로 만들어 Timer 1의 Overflow가 UART0의 송신 Clock으로 사용될 수 있도록 설정한다.
- Double Baud Rate 설정
#define UART0_SetT1BaudRateX2() PCON0=PCON0|(SMOD1);S0CFG=S0CFG&(~SMOD2)
PCON0 레지스터의 SMOD1 플래그를 셋 시켜 UART0 MODE 1, 2, 3의 Double Baud Rate를 Enable 시킨다.
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/T를 Clear 시킴으로써 Timer 1의 Clock 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.PDF의 17. Serial Port 0(UART0)를 참조한다.
è (EN)MG82F6D17_Datasheet_V051.PDF의 18. Serial Port 0(UART0)를 참조한다.
è (EN)MG82F6D64/32_Datasheet_V051.PDF의 18. Serial Port 0(UART0)를 참조한다.
⑺ 인터럽트 설정
/***********************************************************************************
*Function: void InitInterrupt(void)
*Description: Initialize Interrupt
*Input:
*Output:
*************************************************************************************/
void InitInterrupt(void)
{
INT_EnTIMER0(); // Enable TIMER0 interrupt
INT_EnTWI0(); // Enable TWI0 interrupt
}
- 타이머 0 인터럽트를 설정한다.
#define INT_EnTIMER0() ET0=1
- I2C 인터럽트를 설정한다.
#define INT_EnTWI0() EIE1=EIE1|ETWI0
- Global Interrupt Enable 비트 셋
#define INT_EnAll() EA=1 // Global enable
선언한 인터럽트들이 동작하려면 EA 비트를 셋 시켜야한다.
⑼ PCA CH0 Interrupt Service Routine
/***********************************************************************************
*Function: void INT_PCA(void)
*Description: PCA Interrupt handler
*Input:
*Output:
*************************************************************************************/
void INT_PCA(void) interrupt INT_VECTOR_PCA
{
if(CF) // PCA0 카운터의 Overflow 시 인터럽트 발생
{
CF=0; // CF 플래그를 클리어
LED_G_0=!LED_G_0; // LED_G 토글
}
if(CCF0) // PCA0 CH0 인터럽트 발생 시
{
CCF0=0; // CCF0 플래그 클리어
C0CaptureA.B.BLow=CCAP1L; // CCAP1L, CCAP1H의 값이 1차 캡쳐 된 것
C0CaptureA.B.BHigh=CCAP1H;
C0CaptureB.B.BLow=CCAP0L; // CCAP0L, CCAP0H의 값이 2차 캡쳐 된 것
C0CaptureB.B.BHigh=CCAP0H;
if(!bBusy) // 동작 시
{
if(C0CaptureB.W>=C0CaptureA.W) // 2차 캡쳐 값이 1차 보다 크면
{
C0Capture.W=C0CaptureB.W-C0CaptureA.W; // 2차 캡쳐에서 1차 캡쳐를 빼 주고
}
else // 1차 캡쳐 값이 더 크면, 2차는 PCA0가 Overflow 후의 값이므로
{ // 0xFFFF에서 1차 값을 빼 주고, 그 값에다가 2차 캡쳐 값을 더해 주면 차이 값을 계산할 수 있다.
C0Capture.W=(0xFFFF-C0CaptureA.W)+C0CaptureB.W;
}
}
LED_G_1=!LED_G_1; // LED_G_1을 토글 시킨다.
}
}
- 시스템 클럭을 이 때 계산된 차이 값으로 나누어 주면 분주된 주파수가 계산이 된다.
4. 프로그램 실행
*** Keil compiler가 인스톨되어 있어야함 ***
해당 Example 폴더를 찾아가 KeilPrj폴더를 Open 한다.
\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\ MG82F6D16_PCA_Capture_Buf\KeilPrj
해당 폴더의 Keil project 파일을 더블 클릭하여 실행시킨다.(MG82F6D16_DEMO.uvproj)
Rebuild 아이콘을 클릭하여 프로젝트를 컴파일 한다.
Demo Board에 USB Connector를 연결하여 전원을 인가하고, 전원 스위치를 ON시키고, OCD ICE를 연결한 상태에서 위 이미지의 Start/Stop Debug Session(Ctrl+F5) 버튼을 눌러 컴파일된 프로젝트의 디버그 데이터를 다운로드 시킨다.(컴파일 시 에러가 발생하지 않아야함)
다운로드 후 Run(F5) 버튼을 클릭하면 프로그램이 동작한다.
5. 동작 영상