View Single Post
Old 16-05-2011, 11:39 PM   #17
alycuong
Đệ tử 1 túi
 
Tham gia ngày: Apr 2010
Bài gửi: 16
:
Trích:
Nguyên văn bởi LeDuc View Post
Theo mình để dễ dàng thì bạn nên hiểu như thế này , timer 1 la timer 16 bit nghia la no co thể đếm từ 0 đến 65535 . Khi đếm hết nó sẽ quay lại từ đầu là 0 , và lúc đó sẽ xảy ra ngắt .
vd : giả sử cứ 1us timer đế lên 1 , vậy thì khi timer 1 tràn no sẽ đếm được 65535 um =65,535ms=0,065535 s .
Vậy để xác định thời gian ngắt thì chỉ việc xác định timer đếm bao nhiêu thôi đúng ko?
Bây giờ là cách xác định đây .
Thời gian đếm lên của timer phụ thuộc vào chu kỳ lệnh của vi điều khiển . chu kỳ lệnh bằng bao nhiêu thì thời gian định thời của timer củng như vậy . Nếu thạch anh 4M thì chu kỳ lệnh của VDK =1um .
Bậy giờ muốn 1s thì timer ngắt , nghia la sau 10^6 um . timer 1 phải ngắt , nhưng timer1 thì ko thể đếm đến 10^6. vậy ta phai sử dung chế độ prescale 1:8 . nghia la cứ 8 chu kỳ lệnh timer1 mới đếm lên 1 .. ==> 8*65535 = 524280 us .
Code:
#int timer1
  void ngat_timer1()
  {
      set_timer1(24280);   // mặc định giá trị ban đầu cho timer la 24280 . 
      dem++;                 //  timer 1 tràn sau ==> 500 000 us = 0.5s
      if(dem==2)            //  2* 500 000 =1s
          {
            ...................//  thực hiện hành động ;
             dem=0;
           }
   }
void main 
 setup_timer1(T1_INTERNAL|T1_DIV_BY_8); // cho timer 1 chay ở chế độ timer.Bột chia 8
 set_timer1(24280) ;                              // mặc định số đếm ban đầu cho timer1 la 24280.
 enable_interrupts(int_timer1);               // cho phép ngắt timer 1 
 enable_interrupts(global);                   //  cho phép ngắt toàn cục
 while(true)
 {
   .............
  }
Em thấy chỗ set giá trị cho timer1 sai thì phải, chổ này theo e tính toán thì phải là: set_timer1(3035);

(65535 - 3035)*1us*8 = 500000us
alycuong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn