저번 글에서는 8비트 Timer/Counter 관련해서 공부를 했습니다. 이제는 16비트 Timer/Counter와 지난 글에서 제대로 다루지 못한 파형생성(PWM)관련한 실습과 이론을 정리해보겠습니다.
TCCR레지스터 역시 3개가 존재한다. 이외에도 ICP(input Capture Pin, n = 1,3)핀을 통해 특정 사건이 발생하는 경우 TCNTn레지스터의 값을 저장하기 위한 ICRn레지스터가 존재한다.Timer/Counter의 펄스는
TCNTn(n=1,3)레지스터에 기록됩니다. 16비트 Timer/Counter를 사용하므로TCNTn(n=1,3)레지스터 역시 16비트여야 하지만, ATmega128은 8비트 cpu를 제공하므로 2개의 8비트 레지스터를 묶어서TCNTn(n=1,3)레지스터 라는 이름으로 사용합니다.TCNTn(n=1,3)는 상위 바이트TCNTnH와 하위 바이트TCNTnL레지스터로 구성됩니다. 아래는TCNTn(n=1,3)레지스터의 구조입니다.
- 16비트 Timer/Counter의 동작을 제어하기위한
TCCR 레지스터3가지의 역할입니다.
※ 사용할 모드와 분주비는 데이터시트를 확인하여 내가 사용할 모드의 비트 세팅을 해야합니다!


main.c

결과

fast PWM 모드를 사용하기위해 main.c에서 TCCR1A,TCCR1B에 비트 세팅을 해주었습니다.(아래 사진참조)!
그리고 COM1A1 비트 설정은 비교 결과에 따른 출력 핀(OC1A)의 동작을 결정합니다. 여기서는 COM1A1을 설정함으로써 비교 일치 시 OC1A 핀이 클리어되고, 타이머가 BOTTOM에 도달했을 때 세트되는(non-inverting mode) 동작을 선택하고 있습니다.
ICR1 = 2499; 이를 통해 Timer/Counter의 TOP값을 정해주고 타이머가 0에서 2499까지 카운트하도록 합니다.
OCR1A = 625; 비교 일치 값을 설정하여 타이머가 625에 도달할 때 특정 동작(예: 핀 상태 변경)을 수행하도록 합니다
PWM 주파수는 다음과 같습니다. clock주파수 = 16Mhz, 분주비 = 64, TOP = 2499로 설정하여 100Hz의 주파수가 출력되게 설정을했고, 비교 일치 값을 625로 설정하여 듀티 사이클 값을 25%(625/2500)설정하여 결과와 같이 듀티사이클이 25%도달(Bottom에 도달하면)하면 OC1A 상태를 set시키고 TOP에 도달하면 clear시키는 과정을 반복하는 실습을 진행했습니다.
8비트 타이머/카운터와 16비트 타이머/카운터의 차이점은 여러 가지가 있지만, 주요 차이점 중 하나는 타이머의 TOP 값을 설정할 수 있는지 여부입니다.
- 8비트 타이머/카운터:
1. 8비트 타이머/카운터는 기본적으로 0에서 255(0xFF)까지 카운트할 수 있습니다.
2. 일부 모드에서는 TOP 값을 변경할 수 있지만, 주로 고정된 값(예: 255)입니다.
3. 비교 일치 레지스터(OCR)를 사용하여 비교 일치 값을 설정합니다.- 16비트 타이머/카운터:
1. 16비트 타이머/카운터는 0에서 65535(0xFFFF)까지 카운트할 수 있습니다.
2. ICR 레지스터를 사용하여 TOP 값을 유연하게 설정할 수 있습니다. 이를 통해 PWM 주기와 같은 타이밍을 더 정밀하게 제어할 수 있습니다.
3. 비교 일치 레지스터(OCR)를 사용하여 비교 일치 값을 설정합니다.
따라서, 타이머의 TOP 값을 설정할 수 있는지 여부는 8비트와 16비트 타이머/카운터의 주요 차이점 중 하나입니다. 16비트 타이머는 더 높은 해상도와 더 많은 기능을 제공하여 복잡한 타이밍 작업에 유용합니다