해보기는 했어?

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

MEGAWIN

MG82F6D Series ADC with Interrupt - 3

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

 

⑸ 타이머 0 초기화 루틴 è타이머 0 초기화 루틴

 

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

*Function:   void InitTimer0(void)

*Description:  Initialize Timer0

*Input:  

*Output:    

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

void InitTimer0(void)

{

         TM_SetT0Mode_1_16BIT_TIMER();                     // TIMER0 Mode 1: 16-bit timer

         TM_SetT0Clock_SYSCLKDiv12();                        // TIMER0 Clock source: SYSCLK/12

         TM_SetT0Gate_Disable();                                // Disable Gate of T0

 

         TM_SetT0LowByte(TIMER_12T_1ms_TL);              // Set TL0 value for 1ms

         TM_SetT0HighByte(TIMER_12T_1ms_TH);            // Set TH0 value for 1ms

 

         TM_EnableT0();                                           // Enable TIMER0

}

 

 

- 타이머 0의 모드를 1로 설정한다.

#define TM_SetT0Mode_1_16BIT_TIMER()                    TMOD=(TMOD&(~(T0M0|T0M1)))|(T0M0)

TMOD T0M0, T0M1을 클리어 시키고 T0M0를 셋(1) 시킨다.

- 타이머0의 클럭 소스를 (시스템 클럭/12)로 설정한다.

#define TM_SetT0Clock_SYSCLKDiv12()         AUXR3=(AUXR3&(~T0XL));AUXR2=(AUXR2&(~T0X12));TMOD=(TMOD&(~T0C_T))

AUXR3T0XL 비트를 클리어시키고, AUXR2T0X12비트를 클리어 시키고, TMOD T0C_T를 클리어 시킨다. 이렇게 설정하면 타이머 0의 클럭 소스를 (SYSCLK/12)로 설정할 수 있다.

EN)MG82F6D16_Datasheet_V051.PDF106page를 참조한다.

EN)MG82F6D17_Datasheet_V051.PDF111page를 참조한다.

EN)MG82F6D64/32_Datasheet_V051.PDF139page를 참조한다.

 

 

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_SetChannel_AIN0();              // Set Channel 0

         ADC_SetClock_SYSCLKDiv32();       // ADC Clock = SYSCLK,sps=12M/32/24=15.625K

         ADC_SetMode_FreeRunning();       // ADC Trigger mode: Free running

         ADC_SetRightJustified();               / ADC Data Right-Justified

 

}

 

- ADC를 동작하도록 설정

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

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

 

- 채널 설정

#define ADC_SetChannel_AIN0()                               ADCON0=(ADCON0&(~(CHS3|CHS2|CHS1|CHS0)))

ADCON0 레지스터의 CHS0 ~ CHS3 비트를 이용해서 AD 변환의 입력으로 사용할 Source를 설정한다. 본 예제에서는 AIN0을 선택하였다.

 

- 클럭 설정

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

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

 

- Free running 모드로 설정

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

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

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

 

- 결과 데이터의 정렬

#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를 참조한다.

 

 

반응형

'MEGAWIN' 카테고리의 다른 글

MG82F6D Series GPIO P6  (0) 2022.11.09
MG82F6D Series ADC with Interrupt - 4  (0) 2022.11.08
MG82F6D Series ADC with Interrupt - 2  (0) 2022.11.08
MG82F6D Series ADC with Interrupt - 1  (0) 2022.11.08
MG32F02A072 SPI  (0) 2022.10.27