View Single Post
Old 11-01-2007, 12:18 AM   #2
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Trích:
Nguyên văn bởi riquelme View Post
1. void delayMS(unsigned int time){
while(time--){
TMR0 = 6;
T0IF = 0; // xoa co ngat
while(!T0IF);
};
}
Em muốn hỏi hàm này có phải không dùng ngắt Timer0 không?
Hàm này không phải là dùng ngắt. Timer0 luôn tự chạy khi bắt đầu cho IC chạy. Trong mỗi vòng lặp, đặt lại giá trị đầu cho Timer0, rùi xoá cờ ngắt, chờ khi nào có cờ ngắt xảy ra (tức là khi Timer0 tràn , TMR0 đến từ 0xFF xuống 0x00 -> giống 8051).

Timer1, Timer2 được coi như thiết bị ngoại vi (modul ngoài) nên nếu muốn cho chạy thì phải set bit cho nó chạy. (xem trong datasheet).

Timer0 luôn tự chạy.

Trích:
Nếu như bác Bắc nói là dùng delay, tuy nhiên theo em nghĩ delay thì phải viết là
void Delay(void)
{
unsigned int m,n;
for (n=65535;n>0;n--);
for (m=50;m>0;m--);
}
Sao bạn lại nghĩ là phải viết thế? Bạn hiểu gì về Delay ? Delay chính là khoảng thời gian lãng phí mà CPU chẳng làm gì cả, chỉ làm các việc linh tinh như chờ cờ ngắt set lên, chờ để tăng các biến như bạn.

Tại sao bạn biết hàm Delay của bạn trễ được bao nhiêu thời gian??
Trích:
Hơn nữa, ở đây có nói kiểm tra cờ ngắt của Timer0 như vậy là đã dùng ngắt rồi? Tại sao lại không có lệnh set các bit enable của các bit như TMR0IE, PEIE, GIE.
Bạn biết gì về ngắt? Mời bạn qua box "Cơ bản về vi điều khiển và ngắt" để xem về ngắt.

Dùng hay không dùng ngắt có liên quan gì đến việc can thiệp vào cờ ngắt? Trong main tự nhiên cho TOIF = 1; thì sao? Nó cũng là hàm ngắt à ?

Khi dùng hàm ngắt cho Timer0 thì không cần set bit PEIE vì Timer0 không được coi là ngoại vi. Chỉ cần set các cờ : GIE, TOIE.

Chúc bạn thành công.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn