View Single Post
Old 21-05-2008, 11:06 AM   #2
LeDuc
Đệ tử 6 túi
 
LeDuc's Avatar
 
Tham gia ngày: Mar 2007
Bài gửi: 150
:
Trích:
Nguyên văn bởi mr_riverrain View Post
Em đã bới tung cả diễn đàn(chủ yểu là ở "Cơ bản về vi điều khiển và PIC" và " Các ngôn ngữ lập trình khác ") lên để tìm xem có nói về ngắt timer mà sao khó quá. Có chỗ mấy anh hỏi thì lại không có ai trả lời. Đề bài của em là trong CCS C dùng Timer1 tạo ra một thời gian là 1 giây.
Ví dụ:
Code:
#Int_TIMER1
void Time()
{
   bien++;
    if (bien>=40)
      {    Count=get_timer1();
            set_timer1(0);
            St=1;
            bien=0;
       }
}
Em muốn hỏi cách tính làm sao tính ra chính sác 1 giây (tại sao lại là số 40 kia ). Hầu hết các bài hướng dẫn đều hướng dẫn cách tính bằng ASM theo từng lênh.
Có ai có thể hướng dẫn em cách tính không ạ?
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)
 {
   .............
  }
__________________
_________________________________________________
Le Trung Duc
Industry Research & Application Center
NTT Institute of Hi_technolog
ltduc@ntt.edu.vn
leduc_cktd@yahoo.com.vn
http://www.nttc.edu.vn
CNC DIY : http://quangcaosanpham.com/shop/driverservo
0909300332
LeDuc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn