2011/03/22

仕事ーTIMER0/1/2

Hỏi về timer0,1,2 của pic16f877A?
Timer 2 có 2 thanh ghi là PR2 và TMR2.
Khi chức năng timer của Timer2 được kích hoạt thì thanh ghi TMR2 sẽ đếm từ 0 cho đến khi "khớp" với giá trị đặt trước trong thanh ghi PR2 thì tràn. Lúc này nếu cho phép ngắt timer2 thì sẽ xảy ra 1 ngắt.

Hoạt động của timer2 còn liên quan đến prescaler và postscaler. Để cho bạn hiểu 1 cách đơn giản nhất thì có thể nói prescaler và postscaler là 1 hệ số nhân. timer 2 sẽ ngắt sau 1 khoảng thời gian = PR2*prescaler*postscaler. Ví dụ: PR2 = 124 (dec); prescaler = 10 (dec); postscaler = 16 (dec) thì timer2 sẽ tràn sau 1 khoảng thời gian là 124*10*16 = 19840 us (micro second)
================================================
setup_TIMER_2(mode, period, postscale);
set_TIMER2(value);         // xác định giá trị ban đầu (8bit) cho Timer2
get_TIMER2();               // trả về số nguyên  8bit

period là số nguyên từ 0-255, xác định giá trị xung reset
postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt.

================================================
ngắt 1s

#include <16F877A.h>
#device 18F4680*=16 ADC=10
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(c)
#byte portc=0x07


int16 count;
int8 a;


//Chuong trinh ngat TMR0
#int_timer0
void timer0() {
    set_timer0(56); // T = 2*(256 - 56)*1us = 400us (nếu dùng thạch anh 20M thi thay 1us thành 0,2us)
    ++count;
    if(count == 2500) 
{ // 2500*400us = 1000000us = 1sb 
        count=0;
        rotate_left(&a,1);
    }
}


//Chuong trinh dich led
void main() { 

    set_tris_c(0);
    enable_interrupts(int_timer0);
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
    enable_interrupts(global);

    a = 0x01;
    while(true) {
    
    portc = a;
    }
}

================================================
#INCLUDE<16F877A.H>
#INCLUDE<DEF_16F877A.H>
#USE DELAY(CLOCK=4000000)
#INT8  H;
#INT_TIMER1
VOID NGAT_TIMER1()
{
   SET_TIMER1(15536);
   H++;
   IF(H==20)  //20*50000us = 1000000us = 1s
   {
      lệnh;
      H=0;
   }
}
void main()
{
   SETUP_TIMER_1(T1_INTERNAL);
   ENABLE_INTERRUPTS(GLOBAL);
   ENABLE_INTERRUPTS(INT_TIMER1);
   SET_TIMER1(15536);       //T_dinhthoi = (65536-15536)*1us = 50000us
   while(1)
   {
    lệnh;
    }
}

No comments:

Post a Comment