8051
AVR
EZLab
PIC
80C196KC
DSP
ARM
VHDL
마이크로마우스
로봇축구
Battle 로봇
로봇대회
휴먼로봇
Embeded Linux
HW/SW 강좌
RTOS
 
 

2. TIMER0, TIMER1 다루기

 

■ TIMER0 모듈

    (1) Theory

      1) address : 01H
      2) 역할 : 타이머 / 카운터로 사용

        ①타이머

          :PIC 클럭을 로 분주한 값과 prescaler 설정 값을 곱해서 사용. 대부분 정확한 시간을 만들기 위해 또는 OS를 내장하는데 있어 Timer tic으로 쓰기 위해 많이 사용된다.

        ②공식

          TIMER0 = { (Fosc/4) *frescaler + 2 }에 한번씩 TMR0가 증가한다. 그리고 TIMER0가 FFh → 00h가 되면 인터럽트가 발생한다.

                             

       ③사용법

        TMR0 값이 위의 공식에 의해서 증가하다가 OVERFLOW 즉, FFh → 00h로 되는 순간 인터럽트가 발생하여 인터럽트 서비스 루틴을 수행한다. ④의 예제를 참고하기 바란다.

         

      ⑤카운터

        PIC 동작 클럭이 아닌 RTCC핀에서 들어오는 클럭과 내부 클럭을 동기시켜 사용하기 때문에 약간의 에러가 발생한다.

      ④예제 : 무한루프를 돌면서 클럭 만들기

                  실제 활용할 수 있는 예제는 아니고 이런 식으로 사용한다는 것을 보여준 예제입니다.

 

#include <H_16C74B.h>
#use Delay(Clock=4000000)

 

long cnt;

 

/////////////////////////////////////////////////////////////

////             interrupt service function                  ////

/////////////////////////////////////////////////////////////

#int_srv
void tmr0_sr(void) {
        if( cnt==10000 ) {
                output_high( pin_b0 ); delay_us(200)
                cnt = 0;
        }
        else {
                cnt++;
        }
        set_timer0(153);
}

/////////////////////////////////////////////////////////////

 

void main(void)
{
        set_timer0(153);
        setup_counters( RTCC_INTERNAL, RTCC_DIV_128 );
        enable_interrupts( RTCC_ZERO ); enable_interrupts( GLOBAL );

        while(1) {
                output_low( pin_b0 );
        }
}

 

 

 

■ TIMER1 모듈

    (1) Theory

      1) address : 01H

      2) 역할 : 타이머로 사용( 16 bit )

        ①타이머

          PIC 클럭을 로 분주한 값과 prescaler 설정 값을 곱해서 사용. 대부분 시간 지연하여 정확한 시간을 만들기 위해 또는 OS를 내장하는데 있어 Timer tic으로 쓰기 위해 많이 사용된다.

        ②공식

          TIMER1 = { (Fosc/4) * frescaler }이다. 인터럽트 발생 시점은 TIMER1이 FFFF( hex 값 ) → 0000( hex 값 )으로 변할 때이다.

  

      ③사용법

        TMR0 값이 위의 공식에 의해서 증가하다가 OVERFLOW 즉, FFh → 00h로 되는 순간 인터럽트가 발생하여 인터럽트 서비스 루틴을 수행한다. ④의 예제를 참고하기 바란다.

      ④예제 : 전압 Display 하기

 

#include "H_16C73B.h"

#include "H_V_DSP.h"

#use delay(clock=4000000)

#include "F_4TADC.c"

#include "F_7SEG.c"

 

#define         GAIN    139

 

long tmr1_cnt;

 

/////////////////////////////////////////////////////////////

////             interrupt service function                  ////

/////////////////////////////////////////////////////////////

#INT_TIMER1
void INT_TMR1_SVR(void)
{
        // TIMER 1 STOP
        TMR1IF = 0; TMR1ON = 0;       // 제가 만든 H_16c74B.h" 파일 땜에 가능함

        tmr1_cnt++;
        // 2초에 한번씩 V값을 갱신
        if( tmr1_cnt==40 ) {
                V = ( (float) adc_value/255 )*GAIN;  // V, I, adc_value는 H_V_DSP.h내에 정의됨.
                I = V;
                tmr1_cnt=0;
        }
        // TIMER 1 START
        set_timer1(5536); // 50 [ms] 마다 interrupt 발생
        TMR1ON = 1;      // 제가 만든 H_16c74B.h" 파일 땜에 가능함
}

/////////////////////////////////////////////////////////////

 

void main(void)
{
        ////////////////////////////////////////////////////
        ///         timer1 interrupt setting                 ///
        ////////////////////////////////////////////////////
        setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
        enable_interrupts(INT_TIMER1);
        set_timer1(5536);
        enable_interrupts(global);

 

        while(1) {

                // aver_adc_4time()함수는 인크루드된 F_4TADC.c 파일에 있음.
                adc_value = aver_adc_4time();   

                // get_value(), display() 함수는 인크루드된 F_7SEG.c 파일에 있음.
                get_value(I);
                display();
        }

 

 

위의 예제는 제가 전압 값을 Display 하기 위해 만든 소스입니다. 직접 컴파일하면 에러가 많이 나겠죠~ 왜나구요! 인크루드 파일이 없기 때문입니다. 적당한 예제 같아서 올려 놓았습니다. 참고만 하시기 바랍니다. 다음 강좌에는 인터럽트를 셋팅 하였을 때 인터럽트 서비스 루틴을 어떻게 만드는지에 대해 강의하겠습니다.

* 새로나온 함수

    set_timer0(), setup_counter(), enable_interrupts(), setup_timer_1(), set_timer1() 함수나 앞으로 나오게 될 함수의 자세한 사용법은 게시판에 공개한 매뉴얼 중 Built-In Functions Command Summary 부분에 자세히 설명되어 있습니다. 참고하시기 바랍니다. 만일 잘 모르시는 내용이 있으시면 게시판에 질문 내용을 올려 주시기 바랍니다.





상호 : (주) 로보블럭 사업자등록번호:214-86-56219 통신판매업신고19-2544 대표: 신대섭 전화:(02)2679-8556 Fax :(02)2679-8557
본사 : 경기도 부천시 원미구 약대동 부천 테크노파크 401동 502호     서울사무소 : 서울시 영등포구 문래동 4가 8-1 4층
Copyright(C) 2004, (주) 로보블럭 시스템즈 All Rights Reserved E-Mail : WebMaster