AVR의 타이머/카운터가 가진 특징
- 타이머/카운터가 4개이며, 관련된 레지스터가 40여 개 정도가 있다. (AVR에서 제일 많다.)
- 인터럽트 또한 각각 타이머/카운터마다 다르며, 그 종류 (오버플로우, 아웃풋 컴페어) 등 또한 많다.
- 시스템의 클럭의 계산 및 분주 비의 개념을 정확하게 알고 있어야 한다.
- 타이머/카운터는 인터럽트에 시간이 더해진 형태라고 보시면 됩니다.
- 타이머가 일정 주기로 신호를 주면 카운터가 그것을 셈 하여서 (8비트의 경우) 256 (최댓값)을 넘어가면 넘침 (오버플로우) 가 발생하게 되는데, 이 때 인터럽트가 발생되어 원하는 명령을 처리하는 방식입니다!
참조 : Timer/Counter
Atmega128은 8비트(Timer/Counter 0,2), 16비트(Timer/Counter 1,3) Timer/Counter 2개를 제공합니다
- Timer/Counter는 기본적으로 입력 펄스를 센다. 펄스를 세기 위해서는 입력 펄스가 존재해야하는데 이는 마이크로컨트롤러의 시스템 클록이나 외부에서 주어지는 클록 중에서 선택하여 사용할 수 있다.
- 기본적으로 8비트 Timer/Counter는 0~255까지 셀 수 있다. Atmega128의 내부 클록은 16MHz속도로 동작ㅇ하므로 0에서 다시 0으로 돌아오기까지의 시간, 즉 256번 카운트하는 시간은 256/16M = 0.016ms에 지나지 않습니다. 8비트 카운터로는 0.016ms보다 긴 시간을 측정할 수 없으므로 분주기(Prescaler)를 사용하요 사용된 클록에 비해 주기가 긴 클록을 생성하여 긴 시간을 측정할 수 있습니다.
- 카운터로 센 펄스의 수는 TCNTn 레지스터에 저장됩니다. 펄스의 개수가 셀수 있는 최댓값을 넘어가면 오버플로가 발생합니다. 이 때 오버플로가 발생하는 시간은 Clock과 분주비(Prescaler)로 결정할 수 있습니다. 보다 정확한 시간을 측정하려면 Compare Match Interrupt를 사용하여 정확한 시간을 측정할 수 있습니다.
- Compare Match Interrupt(비교일치 인터럽트)는
TCNTn레지스터에 저장된 현재까지의 펄스 개수가 미리 설정된 값과 동일 할 때 발생합니다. "미리 설정된 값"은OCRn이라는 OutPut Compare Register에 저장됩니다. Compare Match Interrupt와는 별도로 OutPut Compare가 발생하면OCn핀을 통해 지정된 파형을 출력합니다. Timer/Counter의 세부 동작들 즉! 어떤모드로 동작하고 몇 비트로 Timer/Counter를 사용할 것이고, 어떤 클록을 선택할 것인지TCCRn레지스터로 정할 수 있다.TCCRn
- TCCRn 레지스터로 사용가능한 여러가지모드
- 위 표들의 정보로 설계하고자하는 Timer/Counter를
TCCRn레지스터로 설정할 수 있다. 먼저 알아 볼 것은 OverFlow Interrupt이다.



TCCrn 의 CS0n비트들로 우리는 클록을 선택할 수 있었다. 이를 활용해 TiMSK와TIFR레지스터로 인터럽트(2가지 Compare Match interrupt, OverFlow interrupt)를 활성화 시킬 수 있다.TIMSK레지스터 중 Timer/Counter 0번 과 관련 있는 비트는 OCEI0와 TOIE0이다 OCEI0비트는 Compare Match interrupt활성화를 위해 사용하고 TOIE0 비트는 OverFlow interrupt 활성화를 위해 사용된다.TIFR 레지스터의 해당 비트가 먼저 세트된다. TIFR레지스터는 해당 비트가 세트 되었을 때 TIMSK레지스터의 해당 비트 역시 세트된 상태라면 실제로 Interrupt가 발생한다.
OCR0(OutPut Compare Register)에 값을 설정해줘야한다.
OCR0에 249라는 값을 설정하여 TCNT0레지스터의 값과 비교하여 TIFR 레지스터의 2번째 비트를 활용해 OCR0 레지스터와 일치하는지 비교하는 코드입니다. 기본적으로 CTC모드 를 사용하고 있습니다. CTC모드일 경우 TOP값은 OCR0 이므로 일치하지 않을경우 while문에 갇히게 되고 일치하면 TIFR레지스터의 OCF0비트가 세트되면서 OC0핀의 상태가 토글 됩니다. 즉 타이머값과 OCR0값이 일치하면 OC0핀의 상태가 토글되는 PWM신호를 생성합니다.위의 코드는 CTC모드를 사용해 파형을 생성했습니다. 몇개의 파형 생성 모드가 있는지 알아봅시다.

WGM0n 비트 설정으로 파형 생성모드를 결정할 수 있습니다.TCNT0 레지스터값을 0으로 설정해줘야 하지만 CTC모드일 때는 자동으로 0으로 설정된다.
1<<COM00를 하여 OC0핀의 상태를 반전시켰다. 즉, Compare Match가 발생하면 OC0핀이 반전된다는 의미이다.
TCNT0레지스터를 초기화 시켜줍니다. 그리고 직접 출력핀(PORTD5)를 반전시켜주고 있습니다. TCNT0 = 6인 이유는 분주비를 계산하였을때 나온 값과 TCNT0의 값을 더해서 오버플로우가 발생할 때 TIFR레지스터의 TOV0를 세트시켜 출력핀의 파형을 반전시키기 위함입니다.#ASSR레지스터는 비동기상태의 동작을 사용할 경우 사용되는 레지스터이다.(다음에 공부하여 정리하겠습니다.)