프리스케일 이란 ?
ATmega128
2008/12/26 17:09
http://blog.naver.com/lvtlvt/80060403085
시피유의 클럭은 1초동안 시피유가 진동하는 속도를 나타내며 시피유가 진동한 수를 카운터 하게되면 시간을 구할수 있다.
시피유의 클럭을 기준으로 타이머 / 카운터가 동작 하게 되는데 클럭을 그대로 카운터 하게되면 너무 많은 일을 처리하게 된다.
클럭이 7372800Hz 라고 하면 7372800의 수를 카운터 하면 1초가 되는 것이다. 하지만 아트메가의 카운터는 8비트 카운터라 그수를 다 카운터 할수가 없다. 16비트 카운터가 있지만 그역시 그수를 감당할 수가 없다. 그래서 시피유는 내부적으로 클럭을 단위로 묶어 묶음 단위로 카운터를 하게 되는데
그 묶음의 단위를 프리스케일(분주비) 라한다.
클럭이 7372800 이라고 가정하고 프리스케일이 1024라면 시피유는 내부적으로 1024번의 진동마다 1번씩 카운터를 증가시키게 되는 것이다.
카운터가 7200번 카운터가 되면 1초의 시간이 흐른것이 된다. 8비트 카운터에서 7200을 카운터하기 힘들어 보통은 1000으로 나눈 밀리세컨 단위로
카운터를 사용한다.
프리스케일의 설정은 TCCR0레지스터의 하위 3비트를 통해서 설정 가능하며 내부적으로 카운터 되는 값은 TCNT0레지스터에 들어 있다.
타이머 / 카운터 사용에 관련된 레지스터로는 TCCR0 ,TCNT0 , OCR0 , TIMSK , TIFR , ASSR 가 있다.
TCCR0 레지스터의 CS02 , CS01 , CS00 비트를 설정해서 타이머/카운터0 의 프리스케일을 설정 할 수 있다.
설정된 프리스케일을 단위로 시피유 내부적으로 TCNT0 레지스터의 값을 증가 시키게 된다. 이 레지스터는 읽기와 쓰기가 가능해 적절하게 값을 변경해 타이머 /카운터를 사용 할 수 있다.
TIMSK 레지스터를 통해 타이머/카운터 사용시 발생하게되는 인터럽트의 종류를 설정 하게 된다.
설정 가능한 방식은 오버플로우 방식과 비교방식 2가지가 있다.
비교 방식을 설정시에는 TCNT0의 값과 비교할 값을 OCR0레지스터를 통해 설정해 주어야 한다. 두값을 비교해 값이 같을 때 인터럽트가 발생하게 되며 해당 인터럽트 서비스 루틴으로 이동하게 된다. SIGNAL(SIG_OUTPUT_COMPARE0) 가 백터 테이블의 주소를의미한다. (해더파일에 정의)
오버플로우 방식을 설정시에는 TCNT0 레지스터의 값이 타이머에 의해 증가하다 255를 넘은 값이 생기게 되면 오버플로어 인터럽트가 발생하게 되며 해당 인터럽트 서비스 루틴으로 이동하게 된다. SIGNAL(SIG_OVERFLOW0) 가 백터 테이블의 주소를 의미 한다. (해더파일에 정의)
TCNT0의 값을 250부터 타이머/카운터를 시작 했다면 6번째 카운터에서 인터럽트가 발생하게 되는것이다.
타이머 / 카운터의 설정 순서 요약
- TCCR0레지서터의 하위 3비트를 이용해서 프리스케일을 설정한다.
- TIMSK레지스터를 통해 비교/오버플로우 방식을 설정한다.
- 비교방식 일 경우 TCNT0레지스터와 비교할 값을 OCR0레지스터에 설정 한다.
- 오버플로우방식일 경우 TCNT0레지스터에 카운터의 초기값을 설정한다.
- sei() 함수를 통해 인터럽트를 허용 ( 비교,오버플로우 방식을 통해 발생되는 인터럽트를 사용가능하게 한다.)
WRITTEN BY
- RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.