본문 바로가기

Hacked Brain/embeddedland.net

80c196kc - (6) 타이머

출처 :
임베디드 커뮤니티 [W.O.E]
cafe.naver.com/okh0217
6. 타이머

80c196kc는 16bit로 두 개의 타이머가 있는데 우선 용어 타이머 VS 카운터의 차이부텀 알아보자.

타이머 : 일정한 시간마다 증가

   카운터 : 신호가 들어오면 하나씩 증가시켜 나감


타이머 1 : 타이머 일정한 시간마다 증가

타이머 2 : 타이머 + 카운터


타이머1은 타이머로서의 순수한 기능으로 고속 입출력의 기준시간으로 사용되지만

타이머 2는 그것뿐만아니라 증가 or 감소 카운터,외부사건 캡쳐의 기준으로 사용되거나

외부카운터로 사용된다.


80c196kc의 타이머의 장점이라면  HSI및 HSO를 동작시키는데 기준시간이 되어 상당히 유용하게 이용할수 있어 좋다. 나중에 HSO 관련 프로그래밍을 짠다면 느낄것임.


◈Timer 1

타이머나 기타 시간에 관련된 마이크로컨트롤러 특성에 대해 알기전에 우선 state time이 무엇이며 이것의 계산방법을 알고 정확한 수치를 기억해두면 좋겠다.


인텔 80c196KC의 모든 것(ohm사 출판)이라는 책 설명에 의하면...

1state time은 CPU가 명령어를 수행하는 시간단위를 말한다.

CPU는 플립플롭의 집합체라고 말할수 있는데 FF에 하나의 클럭 파형이 들어오면 플립플롭의 상태가 변화하게 된다.

즉 명령어를 수행하면 CPU의 내부 상태가 순차적으로 바뀌게 되는 시간단위를 말하는 것이다.


수치적으로 말하면 1state time은 CPU에 연결한 클럭 2주기를 뜻하며 2×주기 = 2/20Mhz = 0.1us

가 된다.


타이머1은 8개의 상태시간(수정 발진기의 1/16주파수)마다 하나씩 증가하므로

0.1×8 즉 0.8us 마다 하나씩 증가한다.


◈타이머2

외부핀에 사건이 발생했을 때 그 시간을 타이머2에 기록하는 캡쳐기능에 사용된다.

  고속출력을 가능하게한후 값을 변화시키는 것은 문제를발생시킬수 있으므로 주의

클럭 신호원

 다음과 같이 두가지 신호에 의해 작동한다.


내부 클럭

외부클럭신호

모드

(IOC2.0이 결정)

 1: 클럭신호의 주파수는 Fosc/4

1state마다 한 클럭을 만듬.

0:Fosc/32

8state 마다 한 클럭을 만듬.  

T2CLK핀이나 HSI 핀 둘중의 하나로 클럭신호를 받는다.

보통 모드를 사용하는 것이 좋다. CAM상의 모든 내용을 읽는데 8state 시간이 걸리므로 타이머2가 만약 고속모드를 쓴다면 고속출력 사건을 빼먹을수도 있다.


타이머 관련 인터럽트    

1. T2CAPTURE P2.7이 0→1로 변할 때 입력이 최소 2state 시간동안 유지된다면 타이머2의 값이

   이 레지스터에 기록되고 타이머2캡쳐인터럽트를 발생시킨다.


2.타이머 2 오버플로우 인터럽트 (INT12 2038H)

  이것을 허용하는 경우엔 타이머 오버플로우 (INT00)는 금지되어  int_mask.0 = 0이 되어야함

  타이머2의 오버플로우에는 2가지가 있는데 이는 IOC2.5로 지정한다.


3. 타이머 1 혹은 타이머 2가 오버플로될 때 인터럽트가 발생한다.


☞오버플로란?

16비트 양의 정수에서는

   0000H = 0

    7FFFH = 32767

    8000H = 32768

    FFFFH = 65535

가 되므로 FFFFH ---> 0000H로 되는 것이 오버플로우이다.


그러나, 16비트 2의 보수에서는

    8000H = -32768

    FFFFH = -1

    0000H = 0

    0001H = +1

    7FFFH = +32767

7FFFH ---> 8000H로 되는 것이 오버플로우가 된다.


타이머 1과 타이머 2의 비교 .



◈계산 예제  

  내가 원하는 시간을 얻기위해 timer1 혹은 timer2라는 Special Function Register에 어떠한 값을 주어야하는지 계산방법을 알아보자.

【ex1】0.05초의 시간을 원한다면?( ffff->0000에서 overflow가 일어난다고 가정)

   0.8us× X = 50000us

∴X = 62500

16비트 타이머이므로 최대수는 2의 16승-62500 = 3036

timer1 = 3036 = 0BDCH 의 값을 주면 된다.


풀이하면 3036부터 시작해서 0.8us마다 1씩 증가해서 65535(FFFFh)까지 증가한다는소리다.

그리고 다음에 0이 될텐데 이때 오버플로 인터럽트를 발생시켜 어떻게 하든지 말든지는 사용자 맴..


【ex2】1초 만들기

65535×0.8us= 52428us =0.05초

20번 루프를 돌리면 1초가 만들어진다.

∴ timer1 = 0x00


【ex3】의미파악을 좀더 쉽게 하기위해 다음과 같이 - 를 이용해서 표기할 수도 있다.

 (ffff->0000h에서 오버 플로우일 때 )

timer1 = 0 - 12500;

12500번째 타이머가 증가하면 12500*0.8us = 10000 us = 10ms때   오버플로 발생.

◈예제 소스

☞주의 : timer1 은 wsr 15에서 write 된다. 설정하기전에 꼭 15로 바꿔주는 것을 잊지말아야함

/*t1.c :타이머 1을 이용한 led shift 프로그램*/

#pragma model(kc)

#include <80c196.h>


unsigned char led;

void INT00_timer_over(void)

{         

   disable();

   led =(led<<1)|0x01;                    /* 쉬프트되면 LSB가 0이 되므로 1과 OR*/

   if( (led & 0x10)==0)

          led = 0xfe;

   ioport1 = led;


   /* 오버플로가 되면 타이머값이 0이 되므로 다시 설정을 해줘야한다.  */

   wsr = 15;

   timer1 = 10 ;

   wsr = 0;

  

   enable();           

   return;

}

void main(void)

{

          ioc1 = 0x04;                     /* timer1 overflow enterrupt*/

          int_mask = 0x01;              /* timer overflow enable*/

         

          wsr = 15;

         timer1 = 10;            

          wsr = 0;


         led = 0x0fe;     

          ioport1 = led;


         enable();           

         while(1);

}