본문 바로가기
공부,일/atmega328P

atmega 328p PWM & timer counter (2) 구조 및 레지스터

by fromnothing1 2021. 7. 27.

atmega 328 의 경우 8bit 2 개 16bit 1개의 카운터를 가진다.  이 카운터에 대해 공부해보자 

카운터 클럭 다이아그램

카운터/타이머의 인터럽트 

간단하게 카운터/ 타이머는 클럭의 숫자를 세는 일은 한다. 아두이노는 이러한 카운터/타이머를 이용해서 pwm 을 생성하기도 하고 , 우리는 이를 이용해서 다양한 기능을 구현 할 수 도 있다. 

 

위의 다이아 그램을 보면 clk(Tn) 클럭이 들어가는 것을 알 수 있다. 이렇게 들어온 클럭을 TCNTn 에서 카운트 한다 .( 8bit 인경우 0 ~ 255 를 왔다리 갔다리 한다. ) 

 

아두이노는 2가지 종류의 인터럽트를 사용해서 카운터/타이머를 사용하는데 

 

첫번째는 Timer/Counter overflow인터럽트 이다. 

 

: TCNTn  에  계속 클럭수를 카운트 하다보면  결국 레지스터가 가득차는데(255) 이때 timeroverflow 인터럽트가 발생하고  우리는 이를 이용해서 여러가지 기능을 구현할 수 있다. 

 

2번재는 Timer/Counter compare match  인터럽트 이다. 

 

타이머 1개당 OCRnA,OCRnB  2개의 레지스터가 존재하는데 아두이노는 이 레지스터의 값과 TCNTn  의 값을 비교해서 인터럽트를 발생 시키는데 이를  Timer/Counter compare match  인터럽트라고 한다. 

 

timer 관련 이터럽트 

 

카운터/타이머의 레지스터

timer 0  의 레지스터를 보도록하자 (다른 카운터 레지스터 사용법은 비슷하기 때문에 datasheet 참고바람)

 

 

 

COMOA(0,1) : 카운터 모드에 따른 출력 파형을 결정한다. 

WGM0(2~0) : 카운터 모드를 결정 (모드에 대한 자세한 설명은 뒤에서 하겠다.) 

 

CS0(2~0) : 분주비 설정 

FOC0A,B : non PWM 모드에서 동작하며 , 1로 설정하는 즉시 강제로  OCn 단자에 출력비교 매치가 된것 과 같은 출력을 내보낸다.  특수한 상황이 아니면 0 이라고 생각하면 된다. 

 

클럭 카운트 된 값을 기록하는 레지스터이다. 

8bit 임으로 1~ 255의 값을 가진다. 

 

 

비교 값 레지스터 

Timer/Counter compare match 인터럽트를 위해서 사용되는 레지스터로 

위의 TCNTO 의 값이 OCR0x 레지스터의 값과 같으면 인터럽트가 발생한다 .

인터럽트 마스크 레지스터 

TOIE0   : Timer/Counter overflow 인터럽트가 발생 가능하도록 한다. 

OCIE0x : x Timer/Counter compare match 인터럽트가 발생 가능하도록 한다. 

OCF0x : Timer/Counter compare match 인터럽트가 발생하면 1로 set , 인터럽트가 처리되기 시작하면 다시 0 으로 돌아간다. 

TOV0: Timer/Counter overflow 가 발생하면 1 로 set ,인터럽트가 처리되기 시작하면 다시 0 으로 돌아간다. 

 

댓글