앞선 포스팅을 통하여, TImer가 어떤것인지, 어떠한 모드가 있는지, 어떠한 종류가 있는지
간단하게나마 이해하셧을 거라고 생각합니다.
이제는 Timer Register를 셋팅하는 방법에 대해 포스팅합니다.

계속됫던 포스팅들을 살펴보면, MCU와 관련된 c코드에서는 거의 레지스터의 설정이 끝이라는 걸 느끼실 수 있을 겁니다.
그만큼, 해당하는 모듈의 Register에 관한 충분한 이해가 필요하다고 생각이 듭니다.
즉, 그만큼 이 포스팅도 중요한 포스팅이라는 거겠죠+_+ 이히히히히히히히 (갑자기 왜이래;;;)

정말.. 제가쓰는 포스팅들이 저 말고 다른사람들에게 도움이 되긴할까요? ㅠㅠㅠ

어찟됬든
첫 포스팅에서 설명한 코드에서, 레지스터 설정부분의 코드 입니다.
 

// 타이머를 초기화 하는 부분

// 0.1초를 정확히 맞추는데 8bit로는 .. 몇번 돌았는가도 연산을 해야할 것이라고 생각해서

// 16bit 카운터를 사용하기로 함

 

// 0.1초로 정확히 맞추기 위해서는;

              //16000000/256/6250 = 10Hz

              // OCR0 값이 8비트는 256 까지 되고

              //OCR1A 16비트는 65535까지 되는데;;

              // 6250을 포함하기에는 8bit는 너무 크다-_-;

 

              TCCR1A = 0x00;

              TCCR1B = 0x0C;

              TCCR1C = 0x00;

              OCR1A = 6249;

              TCNT1 = 0x0000;

 

// LED를 켜기위해서 사용되는 16bit 카운터, 이것은 8bit로 사용되도 무방하나,

// 한번더 공부를 해본다는 의미에서…;; (뭐 얼마나된다고;;) 16bit 카운트를 사용함

              TCCR3A = 0x00;

              TCCR3B = 0x0C;

              TCCR3C = 0x00;

              OCR3A = 250;

              TCNT3 = 0x0000;


나름 주석을 달아 놓았는데, 이해가 되시는지 잘 모르겠네요..
심화 설명 들어갑니다.


코드에서 Timer1의 레지스터 설정을 다음과 같이 했습니다.

무엇을 의미하고, 어떻게 셋팅한 것일까요? 코드 위주로 설명하다보면 충분히 응용하실 수 있을 거라 생각합니다.

TCCR1A = 0x00;

TCCR1B = 0x0C;

TCCR1C = 0x00;

 

Timer/Counter Control Register

- 초기값: TCCR1A = TCCR1B = 0  모두 0으로 setting 됩니다..
- Timer를 컨트롤 하는데는 여러지 요소가 필요하지만 하나의 레지스터는 8bit밖에 되지않아서
 다음과 같이 A와 B로 쪼개서 Timer를 컨트롤 합니다. 각각 레지스터의 bit가 의미하는 내용은 다음과 같습니다.

- TCCR1A (Timer/Counter Control Register A)

Bit

7

COM1A1

compare output mode 1A

6

COM1A0

5

COM1B1

compare output mode 1B

4

COM1B0

3

2

1

PWM11

PWM mode select

0

PWM00

: 여기에서는 CTC모드를 사용하므로 따로 설정해줄 부분이 없습니다.


- TCCR1B (Timer/Counter Control Register B)


Bit

7

ICNC1

Input Capture 1 Noise Canceler

6

ICNC0

5

4

3

CTC1

Clear T/C1 on Compare Match

2

CS12

Clock Select

1

CS11

0

CS10

: 여기에서는 CTC모드를 사용하므로 3번째 bit 1  setting 해줍니다.

 


  분주는 256분주를 사용하기에 100으로 setting 합니다. 0000 1100 -> 0x0C setting

(8bit와는 다른 방식으로 prescaler를 설정한다)

 

 OCR1A는 Precsaler 즉, 앞 포스팅에서 말씀드린 설정값입니다.

CTC모드이기 때문에, 여기서 설정해준 값에 도달하면 interrupt가 발생합니다.
interrupt가 뭔지 모르시면 다음 포스팅을 기대해봅니다.

OCR1A = 6249;

 

16000000/256/6250 = 10Hz 이기 때문에

6250 count할 때마다 compare Interrupt를 발생시키기 위하여 6249라는 값을 설정합니다.

(0~6249 -> 6250번의 카운트) 

 

TCNT1 = 0x0000;

flag는 그냥 초기화를 합니다.;;;

마찬가지로 LED를 켜기위한 셋팅입니다.
위에서 충분히 설명하였으므로, 연습정도로 해석해보시면 좋을 것 같습니다.

TCCR3A = 0x00;

TCCR3B = 0x0C;

TCCR3C = 0x00;

OCR3A = 250;

TCNT3 = 0x0000;

, 여기서는 250번카운트 할때마다 Interrupt를 걸어줍니다.
250번이면 8bit counter를 사용하여도 무방하였으나, 그냥 16bit카운터를 사용해 봤습니다.

 

여기까지는 타이머 셋팅에 관한 내용이였습니다.
그러나, 타이머만 셋팅하면 끝일까요??
그러면 마치 일어날 시간을 체크해두고, 자명종이 울리지 않도록 하는것과 무엇이 다르죠?
즉,, 왜 시간을 체크해놨나요? 어짜피 자명종도 안울리는데,,,,,

TImer와 관련된 인터럽트는 다음 포스팅에서 설명하도록 하겠습니다.
Polling과 Interrupt와의 차이를 비교하면서요 ^^!!
그것도 기대..좀해주세요 ㅠㅠ!!


p.s 누가 보고잇나요?!
    도움이 되고 있나요?!

저작자 표시
신고
Posted by 천재소녀*

블로그 이미지
꿈꾸는아이, ㅋ Tasha의 완전범죄 구상소
천재소녀*

공지사항

Yesterday23
Today8
Total156,845

달력

 « |  » 2017.11
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

최근에 받은 트랙백

글 보관함