|
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 |
|
26-05-2013, 02:22 AM | #1 |
Nhập môn đệ tử
Tham gia ngày: Jan 2012
Bài gửi: 1
: |
Help!!!!! giúp mình với
Mình làm mạch có một nút nhấn. Sử dụng ngắt ngoài RB4-RB7.
Vấn đề của mình ở đây là không sử dụng được biến toàn cục. Mình muốn ấn nút nhất 4 lần thì led thay đổi trạng thái. Nhưng biến toàn cục sau khi được tăng ở hàm ngắt, khi thoát ra khỏi hàm này nó trở về giá trị ban đầu. Đây là code của mình, mọi người xem và sửa sai dùm. Cảm ơn rất nhiều! #include "C:\Users\Admin.Admin-PC\Documents\main.h" #USE delay (clock=20000000) #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT int8 mode; #INT_RB void RB_isr (void) { mode=mode+1; } Void main () { set_tris_c (0x00); enable_interrupts(INT_RB); enable_interrupts(GLOBAL); ext_int_edge(H_TO_L); while (true) { if (mode==4) { output_low (pin_c0); } } } |
02-06-2013, 11:03 PM | #2 |
Nhập môn đệ tử
Tham gia ngày: May 2012
Bài gửi: 4
: |
Hình như ngắt ngoài của bạn không hoạt động thì phải:
#INT_RB void RB_isr (void) { RBIF=1; if(RBIE && RBIF) { ifIF (rb7==0) { mode +=1; } } } |
02-06-2013, 11:12 PM | #3 |
Đệ tử 1 túi
Tham gia ngày: Nov 2011
Bài gửi: 13
: |
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL); ext_int_edge(H_TO_L); câu lệnh này nghĩa là gì vậy a ơi |
03-06-2013, 05:11 PM | #4 |
Nhập môn đệ tử
Tham gia ngày: Jan 2011
Bài gửi: 3
: |
trước hết bạn biết rằng ngắt rb là ngắt khi có thay đổi ở b4..b7 vậy khi bạn ấn nút sẽ có ngắt và bạn nhả nút cũng tạo thay đổi so với thời điểm trước đó nên cũng ngắt .
thứ 2 trong while của bạn chẳng có lệnh nào để nhìn thấy mode bằng bao nhiêu. tôi thử VD sau: nút bấm vào b4, trở kéo lên. xuat ra port gia tri mode để test nhé #include <16f877a.h> #device *=16 #use delay(clock=20000000) #fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, NOPUT int8 mode; #int_rb void interrupts_rb() { //toi lam nut nhan o b4 if(!input(pin_b4))mode++; } void main() { set_tris_b(0xff); set_tris_c(0x00); set_tris_d(0x00); enable_interrupts(global); enable_interrupts(int_rb); while(1) { if(mode==4)output_high(pin_c0);else output_low(pin_c0); output_d(mode); } } |
|
|