View Single Post
Old 18-04-2009, 11:43 AM   #1
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
Giúp em về timer0 với.

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
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn