[Atmega128] 4. 타이머 인터럽트 (clk/Timer mode/OC 단자 출력)

2019. 8. 3. 18:37개발 관련 학습정리/AVR(atmega128) Register 분석

반응형

이번에 알아볼 것은,

분주 설정하기 , 타이머 모드, OC 단자 출력을 하는 방법이다.

 

 

 

 

 

 

분주 설정하기

 

 

CS00.. 02는 TCCR0 레지스터 안에 포함되어있는 비트들로, 이를 통하여 분주를 설정할 수 있다.

분주로 주기를 만들려면 몇 개의 과정이 필요하다.

 

 

 

 


※ 8 분주로 가정하고 과정을 설명하겠습니다.

1. 기본 16 Mhz이므로 8 분주로 쪼개면 2 Mhz가 된다.

2. 2 Mhz는 0.5us마다 진동하는 것을 표현하는 단위이다.

이렇게 되면, 0.5us마다 TCNT의 값이 증가하게 되는 것이다.

3. TCNT는 255가 넘으면 인터럽트를 발생시키기 때문에 0.5*256 = 128 -> 128us마다 인터럽트 발생

이런 식으로, 8... 1024분 주의 주기를 알 수 있다.


 

 

 

 

 

Timer Mode

 

WGMn도 마찬가지로 TCCR에 있는 비트로 모드를 설정하는 데 사용된다.

총 4개의 모드가 있으며, 4개 모두에 대해 알아보도록 하자.

 

 

 

 

 

1. Normal mode

추가적인 게 없는 기본 모드로, 할 수 있는 거로는 TCNT의 초기값을 설정하여 주기를 바꿀 수 있다는 점이다.

 

 

 

 

2. CTC mode

 

매우 복잡해보이는 그림이다.

 

위의 파형을 보면 OCR값에 따라 크기가 달라지는 것을 알 수 있다.

OCR을 이용해 출력 비교 인터럽트를 발생시키고 0으로 세트 한다.

그러므로 OCR을 설정할 경우, 오버플로 인터럽트를 이용할 수 없게 된다.

 

 

 

 

 

 

 

3. Fast PWM mode

 

좀 더 복잡해 보이는 그림이다.

위의 그림을 보면 CTC모드와 달라진 점이 있다.

OCR과 비교하여 출력 비교 인터럽트를 발생시키고, 0으로 세트되지 않는다는 점이다.

그러므로, OCR기점에서 출력비교 인터럽트를 발생시키고 오버플로 인터럽트까지 발생해야 0으로 떨어진다.

이 모드를 사용하여 좀 더 자유자재로 파형을 만들어 낼 수 있다.

 

 

 

 

 

 

 

 

4. Phase Correct PWM mode

 

?

 

그림을 보자마자 다른 점이 확 눈에 띄는데,

바로 오버플로 인터럽트 이후 0으로 세트 되는 것이 아니라 다시 255부터 0까지 카운트한다는 점이다.

Fast PWM과 같이 OCR도 같이 사용 가능하며 신기한 점은 상승할 때와 감소할 때

출력 비교가 총 2번 이루어진다는 점이다.

 

 

 

이렇게 4가지 모드를 알아보았다.

마지막으로 알아볼 것은 OC단자 출력이다.

 

 

 

 

 

 

 

OC 단자 출력

TCCR의 COMn비트를 이용하여 조절하며,

PWM 모드가 아닐 경우 3가지, PWM모드 일때 3가지 총 6가지 경우가 있다.

 

 

1. PWM이 아닐경우

 

non-PWM일때

 

00일 때 : OC단자를 차단하여 평소와 같은 핀으로 사용한다.

01 : 출력 비교에 의해 OC출력을 토글 시킨다.

10 : 출력 비교에 의해 OC출력을 클리어.

11 : 출력비교에 의해 OC출력을 세트.

 

 

 

 

 

 

2. PWM일 경우

 

PWM 일때

 

00일 때 : OC단자를 차단하여 평소와 같은 핀으로 사용한다.

 

01 : 보류

 

10 : 출력 비교에 의해 OC출력을 클리어하고,

Fast PWM - TOP신호를 받아 1로 세트

Phase Correct PWM - 상승 출력 비교 때 클리어, 감소 출력 비교 때 1로 세트.

 

11: 출력 비교에 의해 OC출력을 세트 하고,

Fast PWM - TOP신호를 받아 클리어

Phase Correct PWM - 상승출력 비교때 1로 세트, 감소출력비교때 클리어.

 

 

 

 

 

 

 

예제 코드를 통해 알아보자.

 

void setup() {
  //Past PWM모드 기준의 코드
  
  DDRB=0x0F;
  
  TCCR0 = 0x2C; //past PWM, 64clk -> 4us당 1카운트

  TCNT0=56; //56~255 200count -> 800us 주기마다 ovf 인터럽트
  
  OCR0=155; // 56~155 100count -> 시작후 400us때 출력비교 인터럽트
  
  TIMSK0=0x03; //Past PWM이므로 ovf, 출력비교 둘다 enable

}

SIGNAL(TIMER0_OVF_vect) 
{
	//ovf인터럽트때 발생하는 함수
}

SIGNAL(TIMER0_COMPA_vect) 
{
	//출력비교 인터럽트때 발생하는 함수
}

 

 

TCNT가 56에서 시작해서 155에서 출력비교 인터럽트를 발생시키고,

255에서 오버플로 인터럽트를 발생시키고 0으로 세트 한다.

 

 

 

 

 

 

 

 

 

[복두출판사]AVR ATmega128 프로그래밍 응용실습:ED-4513 마이크로프로세서 콤보 IT를 이용한, 복두출판사
반응형