Trích:
Nguyên văn bởi hongquyen
em có 1 vấn đề mong mọi nguời giải đáp giúp ạ (viết trên CCS-pic 887)
1. trong chương em muốn dùng ngắt #INT_RB vậy khi vào trình phục ngắt của ngắt này, thì có cách nào để phân biệt đuợc pin nào đã thay đổi mức logic không ạ, vì mỗi lần một trong 4 pin của portb thay đổi mức logic thì đều xảy ra ngắt ???
2. giả sử trong chuơng trình của em dùng pin 4 của port B và dùng ngắt #INT_RB. giả sử ban đầu pin 4 này có mức logic 0 vậy muốn tạo ra một ngắt thì pin 4 phải chuyển lên mức logic 1 , và khi muốn vào lại ngắt này thì bắt buộc pin 4 phải chuyển xuống mức logic 0 có đúng không ạ???.
em chưa rõ hai vấn đề này, mong mọi nguời giúp em với ạ
em cảm ơn.
|
1) khi đã khai báo ngắt RB thì 1 trong 4 chân RB4-Rb7 xuống mức 0(hoặc lên mức 1 , tui hay dùng tích cực mức 0 ) thì có ngắt . Vô trình ngắt , u kiểm tra từng chân
Code:
if(!RB4) {chống nảy , viết code........};
if(!RB5) {chống nảy , viết code........};
if(!RB6) {chống nảy , viết code........};
if(!RB7) {chống nảy , viết code........};
2) đúng roy , khi RB4 lên mức 1 --> có ngắt , u vô trình ngắt , dùng phần mềm để chờ cho RB4 về lại mức 0 . Cái ni dễ thui . vô trình ngắt u dùng
Code:
while(RB4) ; // chờ cho qua mức 1
viết code.....
Nhưng có 1 điều thực tế là , khi u nhấn nút , RB4 về mức 1 ngay , nhưng sau đó là lên mức 0 , roy lại về mức 1 , cứ lặp lại dao động như thế khoảng 10ms thì mới về mức 1 hẳn . Ng ta gọi đây là nảy phím khi nhấn . Khi thả phím ra cũng thế , cũng có dao động cơ . Do đó , ng ta cần thêm delay giữa mối lần nhấn nhả , để thoát qua dao động này . Cụ thể , như sau
Code:
if(RB4) {delay_ms(10);while(RB4);delay_ms(10); // chống nảy
..........viết code vô chỗ này............
};