PDA

View Full Version : Hỏi về ngắt INT0


npbaoduy
17-03-2009, 10:15 PM
em có viết 1 đoạn chương trình như sau
void main()
{
x=1;
set_TRIS_A(1);
EXT_INT_EDGE(0,L_TO_H);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while (x==1)
{
output_toggle(PIN_E0);
delay_ms(100);
output_toggle(PIN_E1);
delay_ms(100);
output_toggle(PIN_E2);
delay_ms(100);
}
#INT_EXT
void ngat()
{
x=0;
}

Không hiểu sao, khi em test thử, chỉ khi chân INT0 lên mức cao thì vòng lặp mới dừng lại (các LED nối ở porte ko chớp) khi chân INT0 về mức thấp, vòng lặp vẫn tiếp tục (LED chớp( trở lại), tức là x vẫn bằng 1?
Ai biết xin chỉ giúp, em xin cám ơn nhiều.

mtuankct
17-03-2009, 10:34 PM
Hình như bạn viết thiếu dấu } của hàm main
còn lỗi theo mình là do sau vòng while(x==1) bạn không có bất kỳ lệnh nào tiếp nên vđk sẽ reset và chạy lại từ đầu, cần đặt một vòng while(1); vào cuối chuơng trình main để tránh hiện tượng này

npbaoduy
17-03-2009, 10:47 PM
cám ơn bạn, mình sẽ thử lại
Cũng như trên, mình viết thêm
void ngat()
{
if (PIN_a0==1)
x=0;
}
CCS luôn warning là: Condition always FALSE
Ý mình muốn là khi ngắt sẽ kiểm tra PIN A0, xem PIN này mức cao hay thấp để thực hiện lệnh gì đó, vậy có ai có gợi ý giúp mình ko?

namqn
17-03-2009, 11:08 PM
cám ơn bạn, mình sẽ thử lại
Cũng như trên, mình viết thêm
void ngat()
{
if (PIN_a0==1)
x=0;
}
CCS luôn warning là: Condition always FALSE
Ý mình muốn là khi ngắt sẽ kiểm tra PIN A0, xem PIN này mức cao hay thấp để thực hiện lệnh gì đó, vậy có ai có gợi ý giúp mình ko?
Theo tôi, CCS C hiểu là bạn lấy giá trị địa chỉ của PIN_a0 để so sánh với 1, dẫn đến kết quả luôn luôn là false. Cách đọc giá trị của ngõ vào I/O có trong tài liệu hướng dẫn của CCS C (hàm input()), có cả ví dụ, tại sao bạn không đọc tài liệu hướng dẫn?

Thân,

npbaoduy
17-03-2009, 11:13 PM
cám ơn anh namqn, tại em cũng mới dùng CCS, chưa biết hàm INPUT này, em sẽ nghiên cứu kỹ lại.