Busan IT/AVR 컨트롤러

타이머(Timer)/카운터(Counter)의 CTC(Clear Timer of Compare Match Mode) 모드

newind2000 2015. 4. 22. 11:17

타이머(Timer)/카운터(Counter)CTC(Clear Timer of Compare Match Mode) 모드

 

학습목표 - CTC 모드를 활용한 인터럽트의 레지스터를 이해하고 설정할 수 있다.

 

타이머(Timer)/카운터(Counter)CTC(Clear Timer of Compare Match Mode) 모드

 

CTC모드의 차이점은 설정 값을 정해주어 0에서부터 지정된 설정 값까지 카운트를 하게 된다.

TCNTn의 값이 OCRnx의 값과 일치하면 그 다음 클록 사이클에서 0으로 클리어되고 인터럽트(Interrupt)가 요청되게 된다.

 

TCNTn의 값이 차례로 증가... 증가... 증가..

if(TCNTn==OCRnx)

인터럽트 발생;

 

/*** 포트 설정 ***/

 

OC0A가 토글되는 것을 표시하기 위해서 PORTB7번 핀을 열어준다.

 

DDRB = 0x80;

 

/*** 레지스터 설정 ***/

- TCCRnA에서 TCT모드를 설정하여 주어야 한다. OCnA OCnB를 다 차단하고 예제를 수행해 보자. COMA/B를 다 0으로 세팅하여 진행. 앞에 4는 카운터 값에 도달했을 때 비트를 반전시키겠다는 의미이다.

 

TCCR0A = 0x42;

- 분주비는 일반모드와 동일하게 1024. 앞에 8은 토글되는 값을 강제로 내보내겠다는 의미이다.

 

TCCR0B = 0x85;

 

- 타이머 마스트는 TIMSK0 = 0x02 compare match mode

TIMSK0 = 0x02;

 

- TCNT와 비교할 OCR0A의 값은 최대치인 0xFF

 

OCR0A = 0xFF;



 

/*** 코드 ***/

<main.c>


#include <atm2560.h>
#include "SMART.h"

unsigned char FND[10= {0x400x790x240x300x190x120x020x580x000x10};
volatile unsigned int uiCnt;
unsigned char ucCnt=0, ucCnt2=0;

int main(void)
{
  /*** 포트 설정 ***/

  DDRB = 0x80;
  DDRC = 0xFF;
  PORTC = 0xFF;

  /*** 타이머 카운터를 위한 설정 ***/

  SREG &= 0x7F;  //Global interrupt
  TIMSK0 = 0x02;  //Timer Compare Match
  TCCR0A = 0x42;  //Timer Mode : CTC모드
  TCCR0B = 0x85;  //분주비 1024
  TCNT0 = 0x00;  //Timer Counter 초기화
  OCR0A = 0xFF;  //
  SREG |= 0x80;  //Global Interrupt 
  
  while(1)
  {

    ;
          
  }
  
  return 0;
}

void __vector_21(void)
{    
    ++ucCnt;

    if(ucCnt==61)
    {
      PORTC=FND[ucCnt2%10];
      ++ucCnt2;
      ucCnt=0;
      if(ucCnt2==250)
        ucCnt2=0;
    }
}

 

 *** LED가 61번 깜빡이고 나서 숫자가 바뀐다. 육안으로는 확인가능했지만 촬영하니 깜빡임이 느껴지지 않았다.


반응형