1. Timer/ Conter 설정

Atmega 128의 경우 8bit timer/counter 2개와 16bit timer/counter 2개가 있다.

 

블록 다이어그램에서 주의깊게 봐야 하는 부분은  TCCRn, TCNTn, Prescaler, OCRn 이다.

 

Atmega의 system clock은 16MHz 속도이고 prescaler를 통해 설정한 값으로 devide되어 clock이 나가고 TCNT로 들어간다.

이 때 원하는 분주비를 설정하는 방법은, datasheet를 참고하여 Timer/Counter Register TCCRn에 분주비를 결정하는 비트(CS02, CS01, CS00)에 값(8분주의 경우 0 1 0)을 넣어주면 된다. 

 

또한 T/C overflow Interrupt  Enable을 1로 설정해줘야 한다.

 

2. Interrupt 실행 주기 

이제 몇 초 간격으로 타이머 인터럽트를 발생시킬지를 정해본다.

 

8bit counter 는 255이 지나고 256에서 overflow가 발생하게 된다. 이 때 TCNT 값을 바꿔주면, 지정된 TCNT 값부터 255까지 count하게 된다. 이를 이용해서 원하는 간격마다 인터럽트를 발생시킬 수 있다.

만약 128분주로 설정되어 있고, 1ms 마다 인터럽트를 발생시키고 싶다면

16MHz ÷ 128 = 125KHz = 8us 즉, 한 번 count 하는데 걸리는 시간이 8us이다.

1ms ÷ 8us = 125 이 때 내가 원하는 주기에서 8us를 나눠주면, 원하는 주기를 만들기 위해 몇 번 count되어야 하는지 구할 수 있다. 

125번 count 하기 위해서는 (256 - 125) - 1 = 130, 즉 130부터 255까지 count하도록 TCNTn = 130으로 정해주면 된다.

void TIM0_init()
{
	TCCR0 |= (1 << CS02) | (0 << CS01) | (1 << CS00); // prescaling / 128
	TIMSK |= (1 << TOIE0);
	TCNT0 = 130;
}

순서대로, prescaling 값을 지정하고, overflow Interrupt Enable을 켜주고, 1ms 주기를 위해 TCNT = 130으로 지정하고 있다.

 

 

또 다른 방식으로는, top을 255에서 다른 숫자로 설정하여 0부터 해당값까지 count한 후 overflow가 발생하게 하는 것도 가능하다. 

바로 OCRn 을 이용하는 것인데, CTC Mode에서 TCNT와 OCR의 값을 compare하다가 두 값이 같으면 counter가 0으로 clear 된다. 따라서 OCR값을 원하는 top value로 지정해주면, 0부터 top value까지 count하게 만들 수 있다.

 

CTC mode 사용을 위해선 WGM에 값을 입력해줘야 한다.

 

void TIM2_init()
{
	TCCR2 |= (0 << CS22) | (1 << CS21) | (1 << CS20); // prescaling / 64
	TCCR2 |= (1 << WGM21) | (0 << WGM20); //CTC mode
	TIMSK |= (1 << OCIE2);
	OCR2 = 250 - 1;  //1ms period 
}

순서대로, TIMER2 에 대해서 prescaling 값을 지정하고, CTC mode 사용을 지정해주고, Timer/Counter0 Output

Compare Match Interrupt Enable 을 1로 지정하고 있으며 1ms 주기를 위한 top value를 정해준다.

 

이 때 한가지 유의할 점은, TIMER 마다 mode setting이나 분주비 setting 값 등이 다르므로 datasheet에서 정확히 구분하여 값을 입력해주어야 한다는 점이다.

 

 

'[Harman교육] 임베디드SW' 카테고리의 다른 글

[23.02.27] TimeClock_StopWatch_OOP  (0) 2023.03.09
[23.02.24] LCD, TimeClock  (1) 2023.03.09
[23.02.23] StopWatch  (0) 2023.03.08
[23.02.21] FND 7_segments  (0) 2023.03.08
[23.02.20] LED Standlight  (0) 2023.03.07

+ Recent posts