embeded/80512008. 12. 18. 00:04
TIMER/COUNTER는 숫자가 클럭 마다 1씩 증가 한다.
8051의 경우에는 입력 클럭을 1/12 로 분기 해서 사용하므로
11.0592Mhz로 할 경우에 1초당 921,600 연산이 가능하다.
(반대로 이야기 하자면 921,600 카운트가 진행되면 1초라는 의미이지만,
16bit 카운터로는 65536이 한계이므로 0.07초 70ms가 측정 가능한 최고 시간이다)

일단 타이머와 카운터는 인터럽트나 이런것의 영향 없이 독립적으로 증가 하므로,
정확하게 시간을 측정할 수 있는데

내가 원하는 시간을 재기 위해서 어떻게 카운터를 설정하냐는 것이 문제였다.
(물론 알고 나니 그럴 고민 조차 의미가 없었지만 ㄱ-)

prescaler를 설정해서 1clock에 증가하는 숫자가 1이 아니어서 원하는 횟수를 돌고(원하는 시간후에)
timer/counter overflow interrupt를 발생시키는 것으로 알고 있었는데..

8051에는 일단 timer/counter에 대한 prescaler가 존재 하지 않는다.
(prescaler를 잘못 이해 한것인지는 모르겠지만..)

즉, 원하는 시간을 클럭으로 계산후에
Timer/counter의 초기 값을 설정해주고, 그 값이 overflow 되기를 기다리면 되는 것 이었다.

예를 들어 1ms 를 원한다면
1초 = 1000ms 이므로
대략 921.6 clock 후에는 overflow가 되도록 설정을 해야 하고
256을 넘어 서므로 16bit 카운터로 설정하여
16bit 카운터의 최대 값에서 원하는 시간을 뺀
"65536 - 921 = 64615 = 0xFC67" 을 타이머에 설정을 해주면
원하는 시간인 1ms 후에 overflow가 발생하게 된다.

그리고 overflow 이후에는 0으로 리셋되므로
overflow ISR(Interrupt Service Routine)에는 매번 타이머/카운터를  설정을 해주어야
주기적으로 시간을 측정할 수 있게 된다.

'embeded > 8051' 카테고리의 다른 글

keil compiler - memory type (code,xdata,idata)  (0) 2009.04.14
Keil compiler - Error : Segment too large  (0) 2009.04.13
Keil evaluation Limitation  (0) 2008.12.07
KEIL Cx51 - Warning L5: CODE SPACE MEMORY OVERLAP  (0) 2008.12.01
8051에 관하여  (0) 2008.11.28
Posted by 구차니