ATmega128 Timer/Counter

JS·2023년 2월 22일
0

ATmega128

목록 보기
4/9

Timer/Counter

Timer: Clk 속도가 일정한 속도로 일정한 시간 간격으로 들어옴
Counter: Clk가 레지스트로 들어올 때마다 Count

MCU내부의 주변장치
-> 주변장치란 CPU를 제외한 기능장치들 ex: Timer, Gpio,Uart
-> MCU란 CPU에 주변 기능장치들을 내부에 삽입한 칩

ATmega128의 timer counter는 8bit counter가 2개, 16bit가 2개로 이루어져 있다.
TIMER/COUNTER 0, 2 = 8bit
TIMER/COUNTER 1, 3 = 16bit

8bit Timer/Counter TCNT, OCR 레지스터의 저장공간이 8bit라는 의미
16bit Timer/Counter TCNT, OCR 레지스터의 저장공간이 16bit라는 의미

->TCNT에 일정한 클럭이 들어오는 경우, Timer라고 함
->TCNT에 일정하지 않은 클럭이 들어오는 경우, Counter라고 함

Timer/Counter를 이용하여 Timer Counter Interrupt를 사용
-> 메인이 너무길면 동작속도에 문제가 발생 -> interrupt를 사용하여 main에 관계없이 주기적으로 동작시키자

다음은 8 bit Timer/Counter 모식도이다.

Timer/Counter
-> 클락이 들어오면 +1
-> 16MHz는 62.5nSec마다 클럭이 발생
-> Prescaler를 1024로 설정하면 16000000/1024의 역수인 64μSec마다 클럭이 timer로 들어옴

Prescaler
-> Timer Counrter 앞에 있는 scaler
-> Prescaler이 8일 경우,클럭이 8개가 들어갔을 때, 1개만 출력한다는 의미
-> 시스템 클럭(16MHz)가 들어감, 외부클럭도 인가 가능
-> 16MHz로 들어오는 클럭을 조정 -> 설정된 값만큼 클럭을 축소

Overflow Interrupt

-> Overflow가 발생했을 때, interrupt를 걸어줄 수 있다.
-> Overlow가 발생했을 때, 주기를 아는 것이 중요하다.
-> 8bit timer를 이용하면서 오버플로우가 발생할 경우, 인터럽트 리퀘스트 발생시킴
->Prescaler를 128로 설정하면 16000000/128 = 125000의 역수인 8μSec마다 클럭이 들어옴.
-> 8μSec 8bit timer를 +1함
->255에서 256으로 넘어갈 때, overflow 발생
->이럴 경우, 8bit timer의 경우, 8*256만큼 곱한 2.048mSec마다 overflow가 발생
(※0에서 범위를 초과하는 것은 Umderflow)

Iterrupt
-> main을 진행하다 Iterrupt 조건을 충족하면ISR(Interrupt Service Routin)의 위치로 가서 ISR을 처리
-> Interrupt는 설정해놓은 Interrupt조건에 충족했을 때 해당 위치로 이동해서 ISR을 진행시키는 행위(※ timer Counrter 자체는 Interrupt가 아님)

TCCR(타이머 카운터 컨트롤 레지스터): 타이머 카운터를 설정하는 역할
-> Timer/Counter마다 한개 씩 존재(총 4개)
TCCR을 조절하면 Prescaler가 동작하면서 바로 클럭이 나옴
-> 즉, TCNT는 TCCR이 설정되자 마자 count

-> 빨간 하이라이트가 Prescaler를 담당하는 레지스터

-> Prescaler 설정값(CSB)
-> ex: 000일 경우, 클럭이 들어와도 통과시키지 않음
001일 경우, Prescaling 없이 그대로 클럭통과
010일 경우,
-> 어떤 용도로 사용할지 인터럽트 사용설정을 해주어야함 =>TIMSK로 설정

0,1은 8bit인 0번 TCNT, 2~5는 16bit인 1번 TCNT, 6,7은 8bit인 2번 TCNT의 인터럽트를 설정
->TIMSK의 0번 bit = 오버플로우시에 인터럽트가 발생하도록 하는 bit

이후, Global Interuupt enalbe을 해주어야함
-> sei()를 선언함

CTC Mode

CTC Mode는 비교기를 이용하여 Interrupt를 제어하는 것이 CTC Mode이다.
OCRn이 Ocn과 같아지면 Interrupt를 수행하도록 해보자

이번에는 Timer/Counter2를 이용해서 구현해보자

8bit 비교기를 통해서 TCNT2와 OCR2를 비교한다
만약 TCNT2와 OCR2가 같아지면 Interrupt를 걸겠다.
OCR값을 정하고, OCR값과 TCNT의 값이 같아 졌을 때, 0으로 초기화 하는 것을 CTC Mode라고 한다.
※주의해야 할점은 TCNT0와 TCNT2의 CSB가 다르기 때문에 DataSheet를 잘 확인해봐야 한다.

위의 그림의 경우,16MHz의 클락이 들어올 때, 1ms마다 Overflow Interrupt가 발생하도록 Timer/Counter2를 조절해준 것이다.
-> 16MHz가 발생했을 때, 64로 설정된 Prescaler를 사용할 때 1ms의 간격으로 Interrupt를 조절해보자
16000000/64 = 250000Hz -> 1/250000 = 4μS -> 250*4μS = 1mS

따라서 250까지만 clk를 count한 후 overflow하면 정확히 1ms마다 count가 가능하다

0개의 댓글