마하전자기술연구소 LOGO

제품검색 고객센터053-604-2355
기술자료실

Home > 기술자료실 기술자료실

제 목 8) 타이머 1의 사용법
첨부파일


타이머 1의 사용법

【개요】

 타이머 1은, 밋드렌지시리즈 중(안)에서도 고기능의 PIC에 내장되고 있는 기능으로,
타이머 0으로 같은 기능을 가지고 있습니다만, 큰 특징은 카운터가 16비트 카운터와
되어 있는 곳(중)입니다.
 또, 타이머 1은 기본적인 사용법 이외에, capther 기능이나 콤퍼레이터 기능과
편성하는 것으로, 시간 측정이나, 프로그램에 영향을 받지 않는 일정한 인터벌의
반복 등, 한층 더 고기능의 사용법을 할 수 있습니다.
본 페이지에서는 타이머 1의 기본적인 사용법을 설명하고 있습니다만, 한층 더 고기능의 사용
(분)편은, CCP의 페이지로 설명하고 있기 때문에 참조해 주세요.


【타이머 1의 기능】

실제의 타이머 1의 내부 구성은 밑그림과 같이 되어 있어, 동작의 흐름은 다음과 같이
됩니다.
 우선, 입력으로서 외부 입력, 내장 시계, 전용 발진 회로의 3 종류가 사네, 있지 않고
인지를 지정해 사용합니다. 내장 시계의 입력때는 시스템 클록의 것1/4의
주파수가 되고 있습니다. 전용 발진 회로는 시스템 클록의 LP모드와 같은 구성과
되어 있어 200 KHz 이하의 크리스탈 발진 회로용이 되고 있습니다. 이것은, 시계용
(으)로서 타이머 1을 사용할 때에 편리하게, 32 KHz의 발진 회로가 상정되고 있는 듯
입니다. 외부 입력때는, T1CKI 핀의 입력 펄스의 카운트를 하게 됩니다.
 그리고 다음에 전용의 3비트의 프리스케이라를 통한 뒤, 내장 시계와의 동기 회로
(을)를 통해, 16비트의 TMR1 레지스터로 카운트 합니다.
 TMR1 레지스터는 8비트씩의 TMR1H와 TMR1L의 2개의 레지스터가 되고 있어,
프로그램으로 읽고 쓰기를 자유롭게 할 수 있습니다. TMR1도 카운트가 오버플로우 했을 때
TMR1IF 플래그가 On가 되어 새치기를 발생합니다.
이러한 타이머 1의 동작의 방법을 지정하는 것은, 타이머 1 전용의 제어용 레지스터로
있는 「T1CON 레지스터」(으)로 실시합니다.





【레지스터의 사용법】

 타이머 1의 내부의 설정 전환은 T1CON 레지스터로 설정하는 것으로 가능해집니다
하지만, 이 T1CON 레지스터의 자세한 것은 밑그림과 같이 되어 있습니다.




타이머 1의 입력원으로서는, 타이머 0으로 같은 내장 시계인가, 전용 발진 회로에 의한다
타이머 모드와 외부 입력에 의한 카운터 모드의 3 종류가 있습니다.
그 지정 방법은 T1CON 레지스터 중(안)에서 아래 표와 같이 해 실시합니다.

입력 종별

T1OSCEN

^T1SYNC

TMR1CS

내장 시계

0

0

0

전용 발진 회로

1

0

1

외부 입력(비동기)

0

1

1

외부 입력(동기)

0

0

1


(1) 외부 입력 카운터 모드
  카운터 모드때로는, 내장 시계에 동기를 잡을 수가 있게 되어
  내려 이 동기를 잡아 두면(자), TMR1의 읽기 한중간에 카운터가 카운트
  업 동작을 하는 것을 피할 수 있기 (위해)때문에 정확한 값을 읽어내는 것이 가능해져
  .
  보통은 동기 시키도록(듯이) 합니다만, 반대로, 클락보다 높은 주파수때에는
  동기가 정확하게는 잡히지 않게 되기 때문에, 그러한 경우에는 동기를 하지 않게
  (으)로 하면, 외부 입력 신호가 그대로 카운터의 입력이 됩니다.

  타이머 1은 16비트 카운터이기 (위해)때문에, 카운트 시키면서 카운터치를 읽어
  붐비는데는, TMR1H와 TMR1L를 나누어 따로 따로 읽어들이는 동작이 필요합니다.
  이렇게 하면(자) 문제가 일어나는 일이 있습니다. 즉 읽어들여 안에 카운트업 동작
  (을)를 해 버리는 것이 있을 수 있는으로부터입니다.
  이것을 피하기 (위해)때문에 다음과 같은 순서를 밟아 읽어들일 필요가 있습니다.

   우선 상위의 TMR1H를 읽어들여 레지스터에 보존합니다.
   다음에 하위의 TMR1L를 읽어들여 보존합니다.
   그리고 한번 더 상위를 읽어들여 전의 것과 같은지 어떤지를 확인합니다.
   같고 정상적이어서 완료입니다만, 차이가 났을 때에는, 재차 읽기를 해 더
   합니다.

(2) 내장 시계 모드
  타이머 1은 프리스케이라도 맞추면(자) 전부 19비트의 카운터가 되기 때문에,
  내장 시계가 20 MHz때라도, 최장 약 105 msec라고 하는 긴 인터벌 타이머
  (을)를 만들 수가 있습니다.

(3) 전용 발진 회로 모드
  타이머 1에 붙어 있는 전용 발진 회로는, 시스템 클록 발진 회로의 LP모드와
  같은 회로가 되어 있어, 최고 200 kHz까지의 크리스탈 발진 회로용이 되고 있습니다.
  이것은, 시계용의 32 kHz의 크리스탈 발진 회로를 상정한 것으로, 실제의 예로서
  32.768 kHz의 크리스탈을 사용했을 때의, 타이머 1에 세트 하는 값과 오버플로우
  새치기 발생까지의 시간을 일람표로 하면(자) 아래 표와 같이 되어, 취급하기 쉬운 값의
  인터벌을 할 수 있게 되어 있습니다.
  단, 이 때의 프리스케이라의 값은 1으로, TMR1L는 0인 채입니다.

TMR1의 값

오버플로우까지의 시간

8000H

1sec

C000H

0.5sec

E000H

0.25sec

F000H

0.125sec


【C언어에 의한 사용법】

CCS C컴파일러로 타이머 1을 사용하기 위해서(때문에)는, 전용의 편성 함수를 사용합니다.
이 함수를 사용하는 것으로, 새치기도 용이하게 취급할 수가 있습니다.
타이머 1용의 편성 함수로서는 아래 표가 준비되어 있습니다

편성 함수 서식

내용

SETUP_TIMER_1(mode) 타이머 1의 초기설정을 실시한다.
복수의 설정은 OR로 실시한다.

mode의 값은 아래와 같이를 사용한다.
 T1_DISABLED 타이머 1을 사용하지 않는다
 T1_INTERNAL 내장 시계 모드 지정
 T1_EXTERNAL 외부 입력, 비동기 모드 지정
 T1_EXTERNAL_SYNC 외부 입력 동기 모드 지정
 T1_CLK_OUT 내장 발진 회로를 사용하는 지정
 T1_DIV_BY_1 프리스케이르치 1
 T1_DIV_BY_2  〃     2
 T1_DIV? BY_4  〃     4
 T1_DIV_BY_8  〃     8

예 setup_timer_1(T1_DISABLED);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_8)
GET_TIMER1( ) 현재의 TMR1의 내용을 돌려준다.
16비트이므로 long 변수로 취급할 필요가 있다.

예 while (get_timer1( ) ! = 0) 
SET_TIMER1(value) TMR1 레지스터에 value의 값을 세트 한다

예 if(get_timer1( )=1000)
set_timer1(0);


【프로그램예】

실제로 타이머 1을 사용한 프로그램예를 소개합니다.
아래와 같이는 타이머 1을 PIC16F877를 전용 발진 회로로 동작시켜, 1초 마다 발광 다이오드를
점멸시키는 프로그램입니다.
main 중(안)에서 동시에 프로그램 타이머의 delay_ms함수를 사용해, 역시 1초 주기에
다른 발광 다이오드의 점멸도 하고 있습니다.

이 때의 회로도는 밑그림과 같이 되어 있습니다. 전용 발진 회로에는, 32.768 kHz의 시계
용무의 수정진동자를 사용해 발진 회로를 구성해 있습니다.
타이머로 점멸시키는 것은 LED1의 발광 다이오드로, 메인 루틴 중(안)에서, 프로그램
타이머를 사용해 점멸시키고 있는 것이, LED2의 발광 다이오드입니다.





≪프로그램 리스트≫ 아래와 같이에는 한자 스페이스를 포함하고 있습니다.
 
//////////////////////////////////////////////
// Timer1 of 16F877 test program.
// Use 32.768kHz crystal and set 1sec period.
// Each interval interrupt, LED is controled.
//////////////////////////////////////////////
#include <16f877.h>
#use delay(CLOCK=10000000)     //10MHz

#int_timer1            //타이머 1 새치기 처리
intval() {
 int flag1;
 set_timer1(0x8000);       //1 sec에 재세트
 if(flag1 == 0) {
   output_high(PIN_B7);     //LED off
   flag1 = 1;
 }
 else {
   output_low(PIN_B7);     //LED on
   flag1 = 0;
 }
}
main() {
 int flag;
 set_tris_b(0);         //all output
 output_high(PIN_B7);      //LED off

 setup_timer_1(T1_EXTERNAL_SYNC | T1_CLK_OUT | T1_DIV_BY_1);
 set_timer1(0x8000);      //initial set
 enable_interrupts(INT_TIMER1);
 enable_interrupts(GLOBAL);

 while(1) {
   if(flag == 0) {       //key input
    output_high(PIN_B6);   //LED2 on
    flag = 1;
   }
   else {
    output_low(PIN_B6);    //LED2 off
    flag = 0;
   }
   delay_ms(1000);
 }
}


목록보기

www.1chip.com, www.1chip.co.kr
www.micom114.com
자료실바로가기

대구광역시 북구 산격2동 1629 산업용재관 10동 13호 (2층) / Tel. 053-604-2355 / Fax. 053-383-2354 / E-mail. maha@paran.com