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.================================================
#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