2008/06/23 17:25

[AVR] 타이머 인터럽트

/* 이글은 걍 개인적으로 공부하면서 한번더 이해하기 위해 쓴글이니 설명이 난해하다고 뭐라하지마세요 ㅜ.ㅜ */

타이머는 avr 칩 내부에서 동작하는 넘이다. 그래서 i/o 포트와는 관련이 없음

Atmega128 에는 타이머가 총 4개가 존재한다.

타이머0 ,타이머1, 타이머2, 타이머3

이렇게 있는데, 타이머0, 타이머2는 8비트짜리고 타이머1, 타이머3은 16비트 짜리다.

여기서 비트가 의미하는건 최대 카운트 수이다.

8비트는 256까지 나타낼수 있으므로

타이머가 256까지 카운트를 세었을때 "타이머 오버플로우 인터럽트"가 발생하는것이고

16비트는  65536 까지 나타낼수 있으므로

타이머가 65536 까지 카운트를 세었을때 "타이머 오버플로우 인터럽트"가 발생하는 것이다.

타이머 인터럽트를 사용하기전에 설정해야할 레지스터들이 몇개있다

1. TCCR (Timer/Counter Control Register)
   카운터가 발생하는주기(프리스케일러 라고함) 를 설정할 뿐만 아니라 카운터의 전반적인것에 대해서 설정할 수 있다. 자세하게 들어가면 골치아프므로(나도 자세히는모름) 가장 많이쓰이는 프리스케일러 설정만 살펴보자

타이머1 에 대한 Control TCCR은 3개나 존재하더라..
TCCR1A, TCCR1B, TCCR1C (A,B,C 를 접미어로 붙여서 구분하는듯)

/* Timer1의 Compare 인터럽트 설정하는 레지스터인데 지금하는건
Timer Overflow 관련부분이니까 패스. 즉 0x00 으로 셋팅함으로써 사용안함을 명시. */
TCCR1A = 0x00;

/*
TCCR1B 하위 3비트(0비트, 1비트, 2비트)에서 프리스케일러를 설정한다.
1을 왼쪽으로 3번 비트연산한다는뜻. (CS12가 3을 나타내는듯함)
데이타시트 찾아보니까 100(2) 은 64 clk 를 나타내네. 즉 64 클록당 카운트 한개 증가시킨다는 소리.
64클록마다 카운트 한개씩 증가시켜서 타이머카운트 레지스터(TCNT1)값이 65536이 되었을때 인터럽트
발생함. 대략 몇 ms 걸릴까? 계산하기 귀찮다 -_-;
*/
TCCR1B = 1 << CS12;

/*
  이 레지스터도 0x00으로 셋팅해서 사용안함을 명시.
*/
TCCR1C = 0x00;

타이머1의 전반적인 설정을 끝냈으니

이제 타이머1 인터럽트를 인에이블(사용가능하게) 설정해야한다.

이것을 담당하는 레지스터는 TIMSK(Timer Interrupt Mask) 이다.

TIMSK = 1 << TOIE1;

이렇게 해주면 타이머1의 "타이머 오버플로우 인터럽트"가 인에이블 상태로된다.

참고로 TOIE는 Timer Overflow Interrupt Enable 의 약자이다.
이 TOIE1 비트는 TIMSK 레지스터의 하위 3번째 비트(비트번호 2)에 위치하고있다. 그래서
1 << TOIE1 하면 0000 0100; 이라는 결과값이 나와서 TIMSK 레지스터의 TOIE1 비트에 1이 셋팅되는듯.

TIMSK 는 총 8비트로 이루어져있는데 OCIEx(Output Compare Interrupt Enable) 와 TOIEx  로구성되어있다. 컴페어 인터럽트는 아직 안써봤으므로 언급하지않겠다...

이제 TIMSK 까지 설정했으면 타이머 인터럽트를 동작시키기위한 셋팅은 거의 끝났다고 볼수있다

그러나 한가지 더 해줘야할것이 있다!

바로 SREG(맞나?) 라는 상태레지스터의 8번쨰비트인 I-플래그 를 1로 셋팅해줘야한다.
sei() 라는 함수를 호출해주면 내부적으로 셋팅이된다.

cli(); // 전역 I-플래그를 클리어한다. 0 으로 셋팅하는듯
sei(); //전역 I-플래그를 셋한다. 1로 셋팅하는듯

자 이제 여기까지했으면 타이머 인터럽트가 동작하기 위한 모든준비가 끝난것이다!

코드까지 쓰려고했지만...-_- 글이너무 길어질것 같아서 오늘은 여기까지..




 

이올린에 북마크하기(0) 이올린에 추천하기(0)
Trackback 0 Comment 0