|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
13-08-2011, 03:53 AM | #1 |
Đệ tử 1 túi
Tham gia ngày: Aug 2011
Bài gửi: 24
: |
vidu ve ngat ngoai
các bác ơi. em có sửa lại code 1 ví dụ đơn giản về ngắt ngoài . sau khi suẳ chuơng trình cứ báo lỗi mà em k biết lỗi đó do đâu.
nhờ các bác testgiups em với. em cảm ơn #include <16f877a.h> #include <def_877a.h> #device *=16 #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT //#define led PIN_D1 //#use fast_io(b) //#use fast_io(d) boolean i = 1; #int_ext void ext_int_isr() { if(i == 1) { //output_high(led); potrd =255; i = 0; } else { //output_low(led); portd=0; i = 1; } } void main() { // set_tris_b(0x01); //set_tris_d(0x00); TRISB =0x00; TRISd =0x00; portd=0x00; port_b_pullups(true); enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai enable_interrupts(global); // Cho phep ngat toan cuc while(1); } |
13-08-2011, 09:39 AM | #2 |
Đệ tử 1 túi
Tham gia ngày: Aug 2009
Bài gửi: 18
: |
Chào bạn.
Bạn đang dùng chức năng ngắt trên chân RB0?(ngắt ngoài). Không rõ bạn nhận được lỗi như thế nào từ trình biên dịch CCS? Bạn khai báo biến i là biến kiểu boolean, tức là chỉ có hai giá trị 0, 1. Nhưng mình không thấy bạn tham chiếu giá trị i này vào đâu cả, cho nên có lẽ câu lệnh kiểm tra (i==1) không có ý nghĩa là chương trình đã vào hàm xử lý ngắt. Bạn lại định nghĩa các chân portB là ngõ ra??, theo mình các chân này phải là đầu vào số, như vậy bạn mới có thể đọc và kiểm tra được mức logic trên các chân này chứ. Thông cảm nếu nói sai! Thân. thay đổi nội dung bởi: goldstar09, 13-08-2011 lúc 10:05 AM. |
13-08-2011, 11:32 AM | #3 |
Đệ tử 1 túi
Tham gia ngày: Aug 2011
Bài gửi: 24
: |
vâng ! em đang dùng chức năng ngắt trên chân RB0?(ngắt ngoài)
code của em la : #include <16f877a.h> #include <def_877a.h> #device *=16 #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT //#define led PIN_D1 boolean i = 1; #int_ext void ext_int_isr() { if(i == 1) { potrd =255; i = 0; } else { portd=0; i = 1; } } void main() { TRISB =0xff; TRISd =0x00; port_b_pullups(true); enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai enable_interrupts(global); // Cho phep ngat toan cuc while(1); } trình dịch cứ báo lỗi ở phần TRISTD VÀ TRISTB mặc dù em đã khai báo thư viện #include <def_877a.h> rồi .lỗi như trong file ảnh em gửi ấy. các bác suẳ lỗi giúp em với. em cảm ơn các bác nhiều |
14-08-2011, 04:27 PM | #4 |
Đệ tử 4 túi
|
Bạn đã add file def_877a.h vào mục device của PIC chưa?Mấy lỗi này theo mình nghĩ là toàn do thư viện thôi hà !!! bạn thử sửa bỏ 2 dòng :
TRISB =0xff; TRISd =0x00; Thay vào đó là dùng 2 lệnh: set_tris_b(0xff); set_tris_d(0x00);
__________________
My blog: http://autumnneverreturn.blogspot.com/ Đối thủ khó chiến thắng nhất là bản thân !!! |
14-08-2011, 04:48 PM | #5 | |
Đệ tử 1 túi
Tham gia ngày: Mar 2010
Bài gửi: 12
: |
Trích:
bạn thử bỏ dòng này đi xem #include <def_877a.h> và mình không hiểu cách viết này có đúng không bạn enable_interrupts(INT_EXT_H2L); sau while(1) hình như không có dấu chấm. bạn kiểm tra lại nha chúc thành công |
|
17-08-2011, 11:29 AM | #6 |
Đệ tử 1 túi
Tham gia ngày: Aug 2011
Bài gửi: 24
: |
các bác ơi, sửa giúp em đoạn code này với . code chạy rồi nhưng khi nạp vào mạch mô phỏng thì k thấy chạy các bác ah
em dùng ngắt ngoài trên chân RB1 nối với phím bấm và 1led nối với RD1 khi chạy mô phỏng thì bật lên cái led sáng ngay.ấn phím thì k thấy led tắt. mặc dù em ấn phím có thấy sự thay đổi trạng thái trên chân RB1 các bác xem giúp em với #include <16f877a.h> #use delay(clock = 20Mhz) //#device *=16 #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT #use fast_io (b) #use fast_io (D) boolean i = 1; #int_ext void ext_int_isr(){ if(i == 1){ i=input(PIN_b1); output_high(pin_d1); i = 0; } else{ output_low(pin_d1); i = 1; } } void main(){ set_tris_b(0xff); set_tris_D(0x00); port_b_pullups(true); enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai enable_interrupts(global); // Cho phep ngat toan cuc while(1); } thank các bác nhiều |
20-08-2011, 04:43 PM | #7 |
Đệ tử 7 túi
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: TP HCM
Bài gửi: 190
: |
Thấy lạ lạ!!!!!!!!. Lúc đầu i=1 thì thực hiện lệnh if và led sáng, rồi cho i=0, vòng chương trình tiếp theo thực hiện lệnh else và tắt led, và set i=1, lặp lại mãi như vậy. Theo tui nghĩ led sẽ chớp tắt liên tục tốc độ quá nhanh và bạn thấy led luôn sáng!!!!!!!!.
Thử sửa: #include <16f877a.h> #use delay(clock = 20Mhz) //#device *=16 #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT #use fast_io (b) #use fast_io (D) boolean i = 1; #int_ext void ext_int_isr(){ i=input(PIN_b1); if(i == 1){ output_high(pin_d1); } else{ output_low(pin_d1); } } void main(){ set_tris_b(0xff); set_tris_D(0x00); port_b_pullups(true); enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai enable_interrupts(global); // Cho phep ngat toan cuc while(1); } Tui thì khai báo nút nhấn trong chương trình chính luôn, và việc nhấn phím thì rất đơn giản. Chúc vui!!!!!!!! |
|
|