

(7번비트:강제출력비교, 활성화되면 출력비교일치 발생)
ex)
uint8_t count = TCNT0;
if(count==100)
TCCR0=0x80;


WGM의 각 모드에 맞는 COM테이블이 있다
(non-PWM(CTC모드), Fast PWM, Phase Correct PWM 모드의 테이블 있음)
각 테이블의 00은 노멀 모드

분주비를 설정한다

타이머/카운터를 통한 출력비교 인터럽트 또는 오버플로우 인터럽트를 통한 명령어를 사용하기 위해선 TIMSK의 0번 또는 1번 비트를 설정해야한다

출력비교 인터럽트 또는 오버플로우 인터럽트 발생시 자동 1로 활성화된다
이때 ISR을 사용하거나 수동으로 해당 비트에 1을 줘서 다시 초기화 해야한다 그렇지 않으면 다음 인터럽트는 무시되고 지나간다.
데이터시트 14.11 register description
타이머/카운터는 주어진 시간 간격을 측정하거나 외부 이벤트의 발생을 카운트하는 역할을 합니다. 주로 다음과 같은 용도로 사용됩니다:
시간 측정: 일정 시간 간격마다 작업을 수행하거나 정확한 시간 간격을 유지해야 하는 경우에 사용됩니다. 예를 들어, 정확한 주기적 작업이 필요한 제어 시스템이나 타이밍 관련 응용 프로그램에서 사용됩니다.
주기 생성: 일정한 주기를 생성하거나 특정 주기에 따라 작업을 수행해야 하는 경우에 사용됩니다. 주기 생성은 주로 주파수 변환, PWM (펄스 폭 변조) 신호 생성, 신호 샘플링 등의 작업에 사용됩니다.
외부 이벤트 카운팅: 외부 이벤트의 발생을 카운트하거나 측정하는 데 사용됩니다. 예를 들어, 외부 신호의 펄스를 세는 데 사용되어 전자 장치의 동작을 제어하거나 측정하는 데 사용될 수 있습니다.
이러한 기능을 통해 타이머/카운터는 다양한 응용 프로그램에서 시간 관련 작업을 수행하는 데 필수적인 요소가 됩니다.
(8비트;0~255범위;256번의 클럭을 셀수있다)
(1111 1111;255를 넘기면 오버플로우 인터럽트 발생->다시 0으로 초기화)
TCNT는 타이머/카운터 레지스터를 의미합니다. 이 레지스터는 타이머/카운터의 현재 값을 저장하는 역할을 합니다. ATmega128A에는 여러 개의 타이머/카운터가 있으며, 각 타이머/카운터에는 고유한 TCNT 레지스터가 있습니다.
구체적으로, ATmega128A에는 세 개의 주요 타이머/카운터가 있습니다:
TCNT0: 타이머/카운터 0의 레지스터
TCNT1: 타이머/카운터 1의 레지스터
TCNT2: 타이머/카운터 2의 레지스터
이 레지스터들은 8비트 또는 16비트 값(타이머에 따라 다름)을 가지며, 타이머/카운터가 카운팅할 때 해당 값이 증가하거나 감소합니다. 이 값은 주로 시간 간격 측정, 주기적인 인터럽트 발생, PWM 신호 생성 등 다양한 용도로 사용됩니다.
예를 들어, 타이머/카운터 0의 현재 값을 읽으려면 TCNT0 레지스터를 참조하면 됩니다. 타이머/카운터 1과 2의 경우도 각각 TCNT1, TCNT2 레지스터를 참조합니다.
TCCR0은 "Timer/Counter Control Register 0"의 약어로, 8비트 타이머/카운터 모듈의 동작을 제어하는 레지스터입니다. 이 레지스터는 타이머/카운터의 동작 모드, 클럭 소스 및 프리스케일러 분배 비율을 설정합니다.
TCCR0 레지스터는 일반적으로 다음과 같은 비트 필드로 구성됩니다:
WGM0[1:0]: Waveform Generation Mode (파형 생성 모드)를 설정하는 비트 필드입니다. 이 비트 필드는 타이머/카운터의 동작 모드를 선택합니다.
COM0[1:0]: Compare Output Mode (비교 출력 모드)를 설정하는 비트 필드입니다. 이 비트 필드는 타이머/카운터가 일치 이벤트에 대해 어떻게 반응하는지를 결정합니다.
CS0[2:0]: Clock Select (클럭 선택) 비트 필드는 타이머/카운터에 사용되는 클럭 소스를 선택합니다. 이 비트 필드는 타이머/카운터를 외부 클럭 신호나 내부 클럭 신호의 프리스케일러 분주 비율로 설정할 수 있습니다.
이러한 비트 필드는 타이머/카운터의 동작을 다양한 방식으로 구성할 수 있도록 합니다.

Waveform Generation Mode(파형 생성 모드)는 타이머/카운터가 어떻게 동작하고 어떤 신호를 생성하는지를 결정하는 설정입니다. 이 모드는 타이머/카운터가 주기적인 신호를 생성하거나 특정 이벤트에 따라 동작하는 방식을 정의합니다.
주로 사용되는 Waveform Generation Mode에는 Normal mode, CTC(Compare Match) mode, Fast PWM mode, Phase Correct PWM mode 등이 있습니다. 각 모드는 다양한 애플리케이션에 맞게 타이머/카운터의 동작을 조절합니다.
Normal mode: 타이머/카운터는 오버플로우마다 일정한 주기로 카운트를 증가시키며, 오버플로우 이벤트에 대한 인터럽트를 사용할 수 있습니다.
CTC mode: 타이머/카운터는 Compare Match 레지스터(OCR0 등)의 값과 일치할 때마다 카운트를 리셋하고, 해당 이벤트에 대한 인터럽트를 사용할 수 있습니다.
Fast PWM mode: 타이머/카운터는 TOP 값에 도달하면 카운트를 리셋하고, 다시 0부터 시작하여 주기적인 PWM 파형을 생성합니다.
Phase Correct PWM mode: Fast PWM mode와 유사하지만, 이 모드에서는 카운터가 TOP 값에 도달할 때마다 카운트 방향을 바꿔주어 대칭된 PWM 파형을 생성합니다.
각 Waveform Generation Mode는 다양한 애플리케이션에 맞게 시간적인 요구사항이나 PWM 신호의 형태에 따라 선택됩니다.

Compare Output Mode(비교 출력 모드)는 타이머/카운터가 일치(compare) 이벤트에 대해 어떻게 반응할지를 결정하는 설정입니다. 이 모드는 타이머/카운터의 출력 핀에 대한 동작을 제어하며, 일치 이벤트가 발생했을 때 출력을 어떻게 변경할지를 정의합니다.
보통 Compare Output Mode는 타이머/카운터가 일치 이벤트를 감지했을 때 해당 출력 핀을 설정하거나 클리어하도록 설정됩니다. 이를 통해 PWM(펄스 폭 변조) 신호 생성 또는 다양한 신호 처리 작업에 활용될 수 있습니다.
대표적인 Compare Output Mode에는 다음과 같은 것들이 있습니다:
Normal port operation: 일치 이벤트에 대한 출력 동작이 수행되지 않습니다. 이 모드는 타이머/카운터가 사용되지 않을 때 출력 핀이 일반적인 입출력 동작을 수행할 때 사용됩니다.
Toggle output on compare match: 일치 이벤트가 발생할 때 출력을 토글합니다. 이 모드는 주기적인 신호를 생성할 때 사용될 수 있습니다.
Clear output on compare match: 일치 이벤트가 발생할 때 출력을 클리어합니다. 주로 PWM 신호를 생성하는 데 사용됩니다.
Set output on compare match: 일치 이벤트가 발생할 때 출력을 설정합니다. 주로 PWM 신호를 생성하는 데 사용됩니다.
이러한 Compare Output Mode는 타이머/카운터의 출력을 다양한 방식으로 제어하고 다양한 응용 프로그램에서 유용하게 활용됩니다.

Clock Select(클럭 선택)는 타이머/카운터가 사용하는 클럭 소스를 선택하는 설정입니다. 타이머/카운터는 클럭 신호에 의해 카운트되며, 클럭 소스를 선택함으로써 카운터의 동작 속도를 조절할 수 있습니다.
일반적으로 클럭 소스는 다음과 같은 것들이 있습니다:
내부 클럭 (Internal Clock): 마이크로컨트롤러의 내부 클럭에 의해 타이머/카운터가 카운트됩니다. 내부 클럭은 마이크로컨트롤러의 주파수 및 프로세서 속도에 따라 결정됩니다.
외부 클럭 (External Clock): 외부 신호를 사용하여 타이머/카운터를 클럭합니다. 외부 클럭은 마이크로컨트롤러 외부에서 제공되는 외부 소스에서 파생됩니다.
프리스케일러 분주기 (Prescaler Divider): 클럭 소스의 주파수를 줄이는 역할을 합니다. 이를 통해 클럭 소스의 주기를 늘리거나 타이머/카운터의 카운트 속도를 낮출 수 있습니다. 분주기 값은 일반적으로 1, 8, 64, 256, 1024 등의 값을 선택할 수 있습니다.
클럭 선택은 타이머/카운터의 동작 속도와 정확도를 조절하는 데 중요한 역할을 합니다. 주어진 응용 프로그램의 요구사항에 따라 적절한 클럭 소스를 선택하여 타이머/카운터의 동작을 조절할 수 있습니다.


foc:목표 탑값 fclk:시스템클락
TIFR은 "Timer/Counter Interrupt Flag Register"의 약어로, 타이머/카운터의 인터럽트 플래그가 저장되는 레지스터입니다. 이 레지스터에는 타이머/카운터의 각 인터럽트에 대한 플래그 비트가 포함되어 있습니다. 이 플래그들은 해당 인터럽트가 발생했는지 여부를 나타냅니다.
보통 TIFR 레지스터는 다음과 같은 플래그 비트들로 구성됩니다:
TOV0: Timer/Counter0 Overflow Flag (타이머/카운터0 오버플로우 플래그)
OCF0: Output Compare Flag (출력 비교 플래그)
TOV0 플래그는 타이머/카운터0의 오버플로우 이벤트가 발생했을 때 설정됩니다. 즉, TCNT0 레지스터가 최대값에서 0으로 재설정될 때 이 플래그가 설정됩니다.
OCF0 플래그는 출력 비교 이벤트가 발생했을 때 설정됩니다. 이는 일반적으로 Compare Match 모드에서 사용되며, TCNT0 레지스터와 OCR0 레지스터의 값이 일치할 때마다 설정됩니다.
TIFR 레지스터의 플래그들은 해당 인터럽트에 대한 인터럽트 서비스 루틴(ISR)에서 읽혀지고, 이를 통해 어떤 인터럽트가 발생했는지 확인할 수 있습니다. 일반적으로 이 플래그들은 소프트웨어에서 직접 클리어되어야 합니다.

OCF0는 "Output Compare Flag"의 약어로, 타이머/카운터의 출력 비교 이벤트가 발생했음을 나타내는 플래그입니다. 이 플래그는 주로 타이머/카운터가 Compare Match 모드에서 작동할 때 사용됩니다.
타이머/카운터가 Compare Match 모드로 설정되면, TCNT0 레지스터의 값과 Output Compare Register (OCR0) 레지스터의 값이 일치할 때 OCF0 플래그가 설정됩니다. 이 일치 이벤트는 주로 PWM (펄스 폭 변조) 신호를 생성하거나 정확한 타이밍 제어를 위해 사용됩니다.
OCF0 플래그는 일치 이벤트를 감지하고, 이에 대한 작업을 수행하거나 인터럽트를 발생시키는 데 사용될 수 있습니다. 일반적으로 이 플래그는 소프트웨어에서 직접 클리어되어야 하며, 이를 통해 새로운 일치 이벤트를 감지할 수 있습니다.
OCF0 비트가 설정되면 비교 일치 이벤트가 발생했음을 나타냅니다. 이 플래그는 일반적으로 인터럽트 서비스 중에 해당 인터럽트 처리 벡터(ISR)가 실행될 때 하드웨어에 의해 클리어될 수 있습니다. 또한 OCF0 플래그는 해당 플래그 자체에 논리 1을 쓰는 것으로 클리어될 수도 있습니다.


16비트 타이머/카운터는 탑값 조절가능 원하는 주파수 만들기 좋음