View Single Post
Old 18-03-2009, 04:42 AM   #22
lexuantien
Đệ tử 2 túi
 
Tham gia ngày: Feb 2009
Nơi Cư Ngụ: Qui Nhon - Binh Dinh
Bài gửi: 37
:
Send a message via Yahoo to lexuantien
Smile

Trích:
Nguyên văn bởi lequocbao View Post
Tại sao mình phải set_timer1(15536); tới 02 lần luôn vậy bạn?
Còn nữa ,nếu mình muốn dừng ngắt thì phải dùng khai báo:
disable_interrupt(global); phải không?nếu đúng thì mình phải đặt khai báo đó ở chổ nào?
Mình cũng từng viết chương trình điều khiển led giống vậy , mình trả lời bạn trong giới hạn hiểu biết của mình thôi:

1. Vì sao phải set_timer1(15536); tới 02 lần ?
set_timer1(15536); trong hàm void main(void) là để tính thời gian bắt đầu đếm của Timer0 . Còn set_timer1(15536); trong hàm void interrupt_timer0() thì sau khi tính giá trị xong thì nó sẽ gán giá trị của set_timer1(15536); vào hàm này.
2. Khai báo disable_interrupt(global); được hiểu là cấm ngắt . Còn đặt ở đâu thì bạn tham khỏa trong đoạn Code sau:
Code:
#include <16F877A.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 = 500000us = 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); // so 2 la o cho T_dinhthi=2*(256-6)*1us = 500 us
   enable_interrupts(global);
   set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
   a = 0x01;
   disable_interrupts(global);
   while(true)
   {
      PORTB = a;
   }
}
lexuantien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn