아트메가/이론

아트메가128 타이머/카운터0 compare match interrupt사용하기

원원 2017. 9. 26. 20:43

안녕하세요. 오늘은 타이머/카운터0의 compare match interrupt에 대해 알아보겠습니다.





Compare match란?

이전 글에서 overflow에 대해 적었었는데 overflow란 TCNTn의 값이 255에서 다음 값으로 될 때 overflow가 발생하는 것이였습니다.

Compare match란 TCNTn의 값과 OCRn이라는 값이 같을 때 Compare match가 발생합니다.



- Output Compare Unit, Block Diagram


위의 사진에서 OCRn과 TCTNn가 같으면 OCFn이 set됩니다. OCFn은 TIMSK에 있는 플레그입니다. (overflow에서 TOVn같은 플래그)

그 다음 아래보면 Waveform Generator가 있는데 이건 파형OCxy에 파형이 나타나는 것입니다. 이 글에서는 파형까지는 안하고 OCFn이 set되면 인터럽트를 수행하는 것만 해볼 것입니다.



overflow글에서 0.016384초마다 오버플로우가 걸려서 이걸가지고 1초를 만들려고 했을때 약간의 오차가 있었습니다. 이번에는 compare match interrupt를 사용하여 overflow했을때보단 정확히 1초를 만들어 보겠습니다.

먼저 16Mhz이므로 1/16Mhz = 0.0000000625초 입니다.

분주비를 128쓴다고 하면 0.0000000625 * 128 = 0.000008입니다.

0.000008초마다 TCNTn의 값이 증가합니다. 

0.001초마다 compare match를 하려면 0.001 / 0.000008 = 125

TCNTn의 값이 0부터 124까지 되면 0.001초가 됩니다. 

그럼 TCNTn의 값이 124일때 compare match interrupt가 발생하면 되겠네요.

OCRn = 124가 되면 됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#define F_CPU 16000000UL
 
unsigned int time=0;
 
 
SIGNAL(SIG_OUTPUT_COMPARE0) //0.001초
{  
    if(time==1000)
    {
        PORTA=(~PORTA);
        time=0;
    }
    else
    {
        time++;
    }
}
 
 
int main(void)
{
 
   TCCR0= 0x0d;
   TIMSK = 0x02;
   OCR0 = 124;
   SREG=0x80;
   DDRA=0xff;
 
    while(1)
    { 
 
    }
}
 
cs



TCCR0비트중

모드가 CTC여야 합니다.


그 외에 레지스터설명은 overflow글에 있습니다.


다음에는 타이머/카운터0의 파형에 대해 알아보겠습니다.