마하전자기술연구소 LOGO

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

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

제 목 5. 타이머 1의 사용법
첨부파일


PIC16F87x의 타이머 1의 사용법

【개요】

PIC16F877의 타이머 1의 사용법의 설명입니다. 32.768 kHz의 수정진동자를
사용한 외부 발진 회로 모드에서의 사용법을 예에, CCS사의 C컴파일러로
움직이는 방법입니다.
CCS사 C컴파일러의 헤더 파일에 잘못이 있어,새치기가 들어가지 않는다
의를 수정했습니다.

【타이머 1의 기능】

 타이머 1은, 조금 고기능의 밋드렌지시리즈의 PIC에 내장되고 있다
기능으로, 타이머 0으로 같은 기능을 가지고 있습니다만, 큰 특징은 카운터가
16비트 카운터가 되고 있는 곳(중)입니다.
 또, 타이머 1은 단독의 사용법 이외에, capther 기능이나 콤퍼레이터 기능
(와)과 편성하는 것으로, 시간 측정이나, 프로그램에 영향을 받지 않는 일정한 인터
발의 반복 등, 한층 더 고기능의 사용법을 할 수 있습니다.

실제의 타이머 1의 내부 구성은 밑그림과 같이 되어 있습니다.
이 타이머 1의 동작을 결정하는 것은, 타이머 1 전용의 제어용 레지스터이다
T1CON 레지스터로 실시합니다.
 타이머 1의 동작은, 입력은 외부 입력, 내장 시계, 전용 발진 회로의 3개의
안의 어느쪽이든을 변환이라고 사용합니다.
내장 시계때는 클락의 것1/4의 주파수가 되고 있습니다.
그리고 그 후에 전용의 3비트의 프리스케이라를 통한 뒤, 내장 시계와의
동기 회로를 통해, 16비트의 TMR1 레지스터로 카운트 합니다.
TMR1 레지스터는 8비트씩의 TMR1H와 TMR1L의 2개의 레지스터가 되고 있어,
프로그램으로 읽고 쓰기를 자유롭게 할 수 있습니다. TMR1도 카운트가 오버플로우
했을 때 TMR1IF 플래그가 On가 되어 새치기를 발생합니다.





【레지스터의 상세 내용】

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




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

입력 종별

T1OSCEN

TMR1CS

^T1SYNC

내장 시계

0

0

0

전용 발진 회로

1

1

0

외부 입력(비동기)

0

1

1

외부 입력(동기)

0

1

0



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

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

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

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

③ 전용 발진 회로 모드
  타이머 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);

【헤더 파일의 수정】

CCS사 C컴파일러의 PIC16F87x용의 헤더 파일에 잘못이 있어, 주변 새치기의
허가가 되지 않고, 타이머 1의 새치기를 받아들일 수 없습니다.
거기서 아래와 같이 부분을 수정합니다.

≪오리지날≫(잘못되어 있다)
#undef GLOBAL
#define GLOBAL      0x0B80  // Used for ENABLE/DISABLE INTERRUPTS
#define INT_EEPROM   0x0B40  // Used for ENABLE/DISABLE INTERRUPTS

≪수정 후≫
(2행 삭제)
#define INT_EEPROM   0x8D10  // Used for ENABLE/DISABLE INTERRUPTS


【프로그램예】

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

이 때의 회로도는 밑그림과 같이 되어 있습니다.





≪프로그램 리스트≫ 아래와 같이에는 한자 스페이스를 포함하고 있습니다.
 
//////////////////////////////////////////////
// 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
intval() {
 int flag1;
 set_timer1(0x8000);       //1sec
 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