View Single Post
Old 21-04-2009, 09:53 PM   #4
mabubeo22
Nhập môn đệ tử
 
Tham gia ngày: Mar 2009
Bài gửi: 3
:
Trích:
Nguyên văn bởi thaithien View Post
Em sử dụng code của anh nhh,với mục đích là "led ở chân RB0 sáng, sau 1s sẽ dịch sang trái, nghĩa là led 1 trên chân RB1 sáng , lần lượt như vậy cho các led trên portB và lặp lại mãi mãi."
Đây là đoạn code:
Code:
#include <16F887.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
   set_timer0(6);
   ++count;
   if(count == 2000)   // 2000*500us = 1000000us = 1s
      {
         count=0;
         rotate_left(&a,1);
      }
}
//Chuong trinh chinh
void main(void)
{
   set_tris_b(0);
   enable_interrupts(int_timer0);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); 
   enable_interrupts(global);
   set_timer0(6);// T_dinhthi =delay= 2*(256 - 6)*1us = 500us
//INitTIMER0=6;prescaler=2(do RTCC_div_2
   a = 0x01;
   
   while(true)
   {
      PORTB = a;
   }
}
Nhưng khi mô phỏng thì thấy thời gian không đúng.Chậm hơn 1s nhiều mặc dù đã set tần số của MPlab =tần số khai báo trong chương trình.
Trong chương trình đã tính đựoc thời gian định thì =500us.Cái này có ý nghĩa như thế nào vậy?
TRong chương trình ngắt của timer0 cũng lại gặp dòng lệnh này nữa.DÒng lệnh trong chương trình ngắt này có ý nghĩa gì không?Có bắt buộc là set_timer0(6); giống như trong chuơng trình main()?
Đang rất rối,hy vọng được giúp đỡ.Rất cảm ơn.HIc


theo ý kiến của mình thì bạn nên sửa đoạn if (count==2000) thay bằng if (count>=2000)
lý do là ban đầu chưa khởi tạo count=0 vì vậy trong quá trình hoạt động rất có thể count đã >2000 (ví dụ 2001), như vậy với int16 count thì count bạn cứ chạy tiếp tới hơn 65 nghìn rồi mới quay lại

như vậy khả năng gây trễ do cái này
mabubeo22 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn