|
Tài trợ cho PIC Vietnam |
Những câu hỏi thường gặp Những lỗi cơ bản thường gặp khi làm việc với PIC hoặc những vấn đề cơ bản nhất thường được hỏi trong những năm qua |
|
Ðiều Chỉnh | Xếp Bài |
20-06-2012, 06:55 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Mar 2012
Bài gửi: 19
: |
Xin hỏi về cờ ngắt trong interrupt
Mình có 3 đoạn code CCS cho PIC6F877A trong ,ví dụ sau:
Đoạn code thứ 1: #int_RB void ngat_RB() { if((RBIF)&&(RBIE)) { //Kiem tra sw1 { if(RB4==0) { led=0b00000001; //led1 sang speed=250; } } //Kiem tra sw2 . . . //Kiem tra sw4 } RBIF=0; //Xoa co ngat RB } } Đoạn code thứ 2: #int_ext void ngat_RB0() { int i; if(i<9) { portd=digital[i]; ++i; } if(i==9) { i=0; } } Đoạn code thứ 3: #INT_RB void RB_handler() { int8 i, digit; char key; key = kbd_getc(); if (digit_key_pressed(key)) { digit = char_to_digit(key); for (i = 0; i < 200; i++) // repeat the display for human eyes display(digit); } } Câu hỏi của mình là: 1. Ở ví dụ 1 và 3, code 1 thì mình phải kiểm tra cờ ngắt RB, và kết thúc phải set lại cờ ngắt của B, nhưng trong đoạn code 3 mình lại ko thấy thực hiện điều này.Và ở đoạn code 1 nếu mình ko set và ko xóa cờ ngắt ( tức xóa mấy cái kiểm tra cờ ngắt , set cờ ngắt đi) thì trong giả lập thấy vẫn chạy bình thường.Không biết là có cần thiết phải set và xóa cờ ngắt ko hay CCS đã làm điều này cho mình rồi? 2.Trong đoạn code 2 mình muốn sửa thành RB0 nhấn thì tăng i, RB1 nhấn thì giảm i,nhưng khi dùng #int_ext thì chỉ dùng được RB0 , không dùng được RB1. Còn nếu dùng như #int_RB thì chỉ dùng RB4-RB7, nhưng bất cứ thay đổi nào của 4 port này đều làm chạy ngắt, thành ra kết quả mình nhất 1 cái là nó tăng, thả button ra nó tăng tiếp.Có cách nào xử lí được chỗ này ko ( mình thử dùng cái ext_int_edge mà ko thấy có tác dụng). Cảm ơn |
|
|