AVR의 내장 장치들 중에서 타이머/카운터는 그 기능이 많고 설정이 복잡하므로 익히는데 노력이 필요한 것 같다. 타이머(timer)는 그 단어가 의미하듯이 시간에 관계되는 것으로 우리가 원하는 시간 간격으로 변하는 신호를 만들어 주거나 특정한 시간에 인터럽트를 발생해 주는 장치이다. 또한 카운터(counter)란 숫자를 세는 것을 의미하며 내/외부의 이벤트(event)나 펄스의 숫자 등을 세는 기능을 가지고 있다. 이러한 기능을 하는 AVR의 내장 장치를 타이머/카운터라고 하며 이후에는 이것을 줄여서 T/C로 표기한다.


 ATmega8(A)에는 세 개의 T/C가 내장되어 있으며 하나는 16비트 T/C이고 다른 두 개는 8비트로 동작한다. T/C의 가장 기본적인 동작은 펄스를 세는 것인데 이 때 이 수를 저장하는 레지스터의 크기에 따라 8비트와 16비트로 구분한다. 즉, 펄스를 255개(8비트의 최대값)까지 셀 수 있다면 8비트 카운터고 65,535(16비트의 최대값)개까지 셀 수 있다면 16비트 카운터이다. 내장된 세 개의 T/C는 0번, 1번, 2번 이렇게 번호가 매겨져 있는데 0번 T/C와 (T/C0) 2번 T/C가 (T/C2) 8비트 T/C이고 이 계수가 저장되는 레지스터가 TCNT0($32번지), TCNT2($24번지)이다. 1번 T/C는 (T/C1) 16비트 T/C이고 그 계수 값은 TCNT1H:TCNT1L 두 개의 레지스터에 걸쳐서 저장된다.


 T/C 기능을 사용하기 위해서는 클럭신호가 필요한데 이것을 입력클럭(CK)로 그대로 사용할 수도 있고 또는 CK를 프리스케일링(prescaling)하여 사용하거나(CK/8, CK/64, CK/256, Ck/1024 등) 외부 핀(TOSC1:0, T1:0)으로 들어오는 클럭 신호를 입력으로 사용할 수도 있다.


T/C0(8비트)

 전술한 바와 같이 ATmega8A는 8비트 T/C 두 개를 내장하고 있으며 각각 T/C0, T/C2으로 표기한다. 이번에는 그 중 기능이 제일 단순한 T/C0에 대해서 알아본다.


 T/C0는 시스템 클럭(CK), 프리스케일된 클럭(CK/n) 또는 외부핀(T0:6번 핀)으로부터 입력되는 클럭 신호들 중 하나를 선택하여 사용하게 된다. 선택된 클럭을 clkT0 라고 표기한다. [그림 1]의 제어 유닛(control unit)은 클럭 입력을 계수하여 TCNT0레지스터의 값을 하나씩 증가시킨다. 그리고 오버플로우 인터럽트가 설정되어 있다면 TCNT0가 $FF에서 $00으로 변하는 순간 인터럽트(TOV0)를 발생시키기도 한다.

[그림 1] T/C0의 기능별 블럭 다이어그램

T/C0에 관련된 I/O레지스터로는 다음과 같은 것들이 있으며, 다른 IOCR과 마찬가지로 그 기능을 나타내는 말의 줄임말로 이름을 붙였다.


  • TCNT0 : Timer/CouNTer 0

  • TCCR0 : Timer/Counter Control Register 0

  • TIMSK : Timer/counter Interrupt MaSK 0

  • TIFR : Timer/counter Interrupt Flag Register


[그림 2] T/C0와 관련된 핀들


위 그림은 T/C0와 관련된 핀(T0핀)을 표시한 것이다.



Posted by 살레시오
,