Atmega128의 타이머/카운터 및 관련 레지스터
ATmega 128의 타이머/카운터는 타이머/카운터0, 타이머/카운터1, 타이머/카운터2, 타이머/카운터3으로 총 4개가 있다.
이 타이머/카운터는 비트수에 따라서 분류하는것이 일반적이다. 8비트는 타이머/카운터0, 타이머/카운터2 이고
16비트는 타이머/카운터1, 타이머/카운터3 이다.
8비트 타이머와 16비트 타이머의 큰 차이점은 8비트 타이머는 0xFF까지 셀 수 있고, 16비트 타이머는 0xFFFF까지 셀 수 있기 때문에 계수의 범위가 늘어나고 저주파 발생이 가능하다는 점이 있다.
그 중에서 8비트 타이머/카운터0과 타이머/카운터2의 차이점은 외부클럭 입력을 받아들인다는 점에서 차이가 있다.
타이머/카운터 관련 레지스터
1. 타이머/카운터 제어 레지스터(Timer/Counter Control Register) : TCCRn (n=0,2)
FOCn | WGMn0 | COMn1 | COMn0 | WGMn1 | CSn2 | CSn1 |
CSn0 |
FOCn : Force Output Compare
이 비트에 1을 쓰면 파형 생성 유닛에 즉각적인 비교일치를 전달한다.
WGMn1:0 : 파형 생성 모드를 결정하는 비트. Normal, PWM, Phase Correct, CTC, Fast PWM의 모드를 조정할 수 있다.
COMn1:0 : 비교일치 출력 모드로서 출력핀 OCn의 동작을 제어한다. 이 비트들 중 하나 이상의 비트가 set 되면 공유하는 범용 I/O핀의 기능을 대신한다. 이 때 OCn핀을 사용하기 위해서 공유 범용 I/O 핀의 방향을 출력으로 설정해야 한다.
CSn2:0 : 클록 선정 비트.
위의 표와 같이 프리스케일링(분주비 설정)을 할 수 있다.
2. 타이머/카운터 레지스터(Timer Counter Register) : TCNTn (n=0,2)
TCNT7 |
TCNT6 |
TCNT5 |
TCNT4 |
TCNT3 |
TCNT2 |
TCNT1 |
TCNT0 |
타이머/카운터 레지스터로 실제로 시스템 내부 클럭수에 따라서 카운팅 하는 레지스터이다.
비트를 적절하게 설정해서 시작 카운팅 숫자를 지정해줄 수 있다. 8비트 타이머/카운터 에서는 0~255까지의 숫자 범위 안에서
시작 카운팅 숫자를 지정할 수 있다. 예를 들어 TCNT0=0x06 이라고 레지스터 값을 지정해주면 6부터 카운팅이 시작된다.
3. 출력 비교 레지스터(Output Compare Register) : OCRn (n=0,2)
OCR7 |
OCR6 |
OCR5 |
OCR4 |
OCR3 |
OCR2 |
OCR1 |
OCR0 |
타이머/카운터 레지스터 TCNT 값과 비교해서 OC2 단자에 출력을 발생하기 위한 8비트 값을 저장하는 레지스터이다.
OCR 레지스터에서 주의할 점은 이중 버퍼 구조로 되어 있어서 사용자가 동작 중에 값을 수정한다 하더라도 바로 바뀌지 않고
TOP혹은 BOTTOM에 도달했을 때 변경된다. 따라서 Glitch가 발생하지 않는다. 그런데 항상 그런것은 아니다. PWM모드가 아닌 일반 CTC 모드에서는 이중 버퍼링 구조로 작동하지 않으므로 글리치가 발생할 수도 있다.
4. 타이머/카운터 인터럽트 플래그 레지스터(Timer/Counter Interrupt Flag Register) : TIFR
OCF2 |
TOV2 |
ICF1 |
OCF1A |
OCF1B |
TOV1 |
OCF0 |
TOV0 |
OCFn : 출력 비교 플래그. 타이머값 TNCTn과 비교 레지스터 값 OCRn이 같을 때 플래그 OCFn이 SET된다. 이 플래그는 해당 인터럽트 서비스루틴이 수행되면 자동으로 CLEAR된다.
TOVn : 타이머값 TCNTn에 오버플로우가 발생하면 플래그 TOVn이 SET된다. 이 플래그는 해당 인터럽트 서비스루틴이 수행되면 자동으로 CLEAR된다.
5. 타이머/카운터 인터럽트 마스크 레지스터(Timer/Counter Interrupt Mask Register) : TIMSK
OCIE2 |
TOIE2 |
TICIE1 |
OCIE1A |
OCIE1B |
TOIE1 |
OCIE0 |
TOIE0 |
OCIEn : 출력 비교일치 인터럽트 허용. (Output Compare Match Interrupt Enable)
OCIEn 비트와 SREG의 1비트가 SET 되면 출력 비교일치 인터럽트를 사용할 수 있게 된다.
TOIEn : 타이머 오버플로 인터럽트 허용 (Timer/Counter Overflow Interrupt Enable)
TOIEn 비트와 SREG의 1비트가 SET 되면 타이머 오버플로 인터럽트를 사용할 수 있게 된다.
6. 비동기 상태 레지스터(Asynchronous Status Register) : ASSR (타이머/카운터 0 에만 존재)
- |
- |
- |
- |
AS0 |
TCN0UB |
OCR0UB |
TCR0UB |
외부 클럭에 의하여 비동기 모드로 동작하는 경우에 관련된 기능을 수행한다.
7. 특수기능 IO 레지스터(Special Function IO Register) : SFIOR
TSM |
- |
- |
- |
ACME |
PUD |
PSR0 |
PSR321 |
이외에도 SREG(AVR Status REGister)가 있는데 최상위 bit(I bit)을 SET 시키면 모든 인터럽트를 허용하게 된다.