2014년 6월 4일 수요일

11. AVR(atmega)와 Proteus VSM의 만남 - 타이머/카운터 1초 만들기(1부)

지난 글에서 AVR을 너무 급한 마음에 소개하려고 PWM을 먼저 설명한 것이 좀 후회되네요.
차근 차근 하나씩 쉽게 했어야 했는데...

그래서, AVR에서 제공하는 Timer/Counter 기능들을 하나씩 소개하려고 합니다.
그 중에서도, Timer0의 Normal Mode를 소개하려고 합니다. 그리고, 그것을 이용하여 1초마다 오버플로우 인터럽트가 발생하면 여기저기 쓸만하겠죠?

참고로, AVR에서 지원하는 타이머/카운터 기능은 아래와 같습니다.


위 표를 보시면, 기본적으로 4가지가 있다는 것을 알 수 있죠.(Mode=0,1,2,3)
그리고 아래 두개의 모드(Mode 5, 7)은  모드1, 3번과 거의 같습니다. 다른 점은 TOP값과 Max값이 조금 다르죠. 하지만 모드 1, 3번의 동작만 안다면  이해하는데는 문제 없습니다.

그럼, 오늘은 Timer0의 Normal Mode를 이용하여 1초를 만들어 보겠습니다.

오버플로우(Overflow)란 말을 들어보셨나요? 최소한 물놀이장(워터파크)에 가보셨다면 파라오의 머리통에서 쏟아져 내리는 물세례를 맞아보아다면 오버플로우가 뭔지 온몸으로 느끼실 겁니다. 아래 그림 한번 보시죠!!

어떤가요? 온몸으로 오버플로우(Overflow = OVF)가 뭔지 느껴지시죠? 맞습니다. 디지털의 세계에서도 원리는 정말로 똑같습니다. 파라오 머리의 물통에 물이 점점 차오르고 거의 마지막에 이르면 물통은 확 뒤집히면서 물을 쏟아내죠. 그리고 다시 처음부터 물을 채우기 시작합니다. 우리는 그 아래에서 물통에 물이 다시 차오르기를 기다리고 물이 내려올때 쯤에는 나름대로 뭔가 할일을 준비하여 진행하죠. 두근거리는 마음을 다독인다던가, 아니면 물 쏟아질때쯤 무서워 딴데로 내빼던가. 아무튼, 파라오 물통의 물이 쏟아지는 그 시점이 바로 오버플로우(Overflow)입니다.

그럼, AVR에서는 어떤가 보겠습니다. 위 8비트의 TCNT0에서 보듯이 물통에 숫자 1이 꽉 차있죠. 그리고, 마지막 물(오른쪽 끝의 1)이 차오르면 TOV(Timer Overflow) Flag가 1로 되면서 오버플로우가 발생하는 겁니다. 물론, 물통속의 8개의 1은 모두 0으로 초기화 되는 것이구요. 나는 단지 TOV Flag만 감시하면 TCNT0의 물통속에 물이 쏟아져 내리고 나서 초기화 되었구나! 라고 생각만 하는 되는거죠. 어떤가요, 쉽지 않나요? 바로 TOV Flag가 Set(1)되는 시점에 Overflow Interrupt가 발생하는 것이고, 그 시점에 내가 이미 코딩해놓은 ISR(Timer0_OVF_vect) { ... } 코드가 실행되는 것입니다.

다음 글에  계속...

끝.

댓글 없음:

댓글 쓰기