|
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 |
|
24-11-2008, 10:12 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Jul 2008
Bài gửi: 17
: |
giup em ve ngat 16F887 với???
chào các bác! em có chút rắc rối như sau:
em sử dụng 2 ngắt của 16f887 là ngắt ngoài(trên rb0), và một ngắt on_change(rb5 chẳng hạn) .em sử dụng 2 phím bấm nối tới 2 chân này. mục đích của em là: ấn button1 thì thực hiện chuong_trinh1 ấn button2 thì thực hiện void chuong_trinh2() nhưng khi lắp mạch test thì kết quả luôn như sau: đầu tiên , hiện dòng chữ " hello" trong main(),5 giây sau thì chương trình TỰ ĐỘNG nhảy vào ngắt luôn (thực hiện chương _trinh1) mà em chưa hề ấn phím(tất nhiên ấn phím 2 cũng ko tác dụng).em ko hiểu tại sao nữa.đây là code: Code:
#include <16f887.h> #include <def_877a.h> #device *=16 ADC=10 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #include <lcd_lib_4bit.c> void chuong_trinh1(); void chuong_trinh2(); #int_RB void RB_isr(void) { chuong_trinh1(); } #int_EXT void EXT_isr(void) { chuong_trinh2(); } void chuong_trinh1() { lcd_init(); lcd_putcmd(0x01);//xoa man hinh lcd_putcmd(0x80); lcd_putchar("chaocacban"); delay_ms(5000); } void chuong_trinh2() { lcd_init(); lcd_putcmd(0x01);//xoa man hinh lcd_putcmd(0xc0); lcd_putchar("mynamehung"); delay_ms(5000); } void main() { trisb=0xff; enable_interrupts(INT_RB); enable_interrupts(INT_EXT); ext_int_edge( H_TO_L ); enable_interrupts(GLOBAL); lcd_init(); lcd_putcmd(0x01);//xoa man hinh lcd_putcmd(0x80); lcd_putchar("hello"); delay_ms(5000); while(1); } ah,còn một vấn đề nữa là muốn thoát khỏi ngắt thì làm thế nào ạ(ví dụ đang làm ctrinh thu nhất em muốn thực hiện chuong trình 2 ngay sau động tác bấm phím chẳng hạn) thay đổi nội dung bởi: namqn, 24-11-2008 lúc 11:15 PM. |
24-11-2008, 11:19 PM | #2 |
Trưởng lão PIC bang
|
Phím nối vào RB5 có bị kẹt không? Các chân điều khiển LCD của bạn nối vào đâu? Có thể có nhiễu đến các chân có tính năng interrupt-on-change của PORTB dẫn đến ngắt. Bạn nên cho biết sơ đồ nguyên lý của mạch thử nghiệm mà bạn đang dùng.
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
25-11-2008, 11:11 AM | #3 |
Đệ tử 1 túi
Tham gia ngày: Jul 2008
Bài gửi: 17
: |
ko phải thế đâu bác ah.em đã dùng 2 mạch để test liền mà đều chung một kết quả,nó cứ tự nhảy vào ngắt thôi.có thể phần mạch làm phím bấm của em chống nhiễu ko tốt lắm nhưng em nghĩ đó ko phải lí do chính gây hiện tượng trên.em đã tháo hết phần phím bấm ra khỏi mạch nhưng nó vẫn chạy như vây.trước em làm với ngắt của 877a thì okie,nhưng sang 16f887 thì die.hixhix.bác xem lại chương trình của em xem có sai chỗ nào ko?
cám ơn các bác nhé |
25-11-2008, 04:05 PM | #4 |
PIC Bang chủ
|
Bạn đọc thêm về cách xử lý I/O này, bởi vì vấn đề có thể đến từ phần cứng của bạn nếu bạn thiết kế không chuẩn. Bạn để chân sw trôi nổi hay thế nào?
Bạn nên post thiết kế của bạn lên đây để cùng tham khảo. Bạn có mặc tụ điện kèm theo không? Về chương trình của bạn, về cơ bản đối với PIC16F887 thì cần các phần khởi tạo portB là digital nữa, vì portB của 887 có chức năng Analog. Ngoài vấn đề này, kỹ thuật Shadow Register là một kỹ thuật cần thiết cho việc xử lý I/O đối với các dòng PIC Midrange trở xuống (PIC16F trở xuống). Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
25-11-2008, 11:10 PM | #5 |
Đệ tử 1 túi
Tham gia ngày: Jul 2008
Bài gửi: 17
: |
cám ơn bác falleaf nhiều.em sẽ nghiên cứu phần này.kiến thức của e còn nhiều thiếu sót lắm mong các bác chỉ giáo thật nhiệt tình.hihi.em sẽ xem lại các gợi ý của bác.hi vọng sẽ có kết quả sớm.
ah nhân tiện bác cho em hỏi: kĩ thuật Shadow Register thực chất là tn ạ(em sẽ đọc tài liệu bác gửi để hiểu hơn) |
26-11-2008, 07:54 AM | #6 |
PIC Bang chủ
|
Đại ý của nó là bởi khi ghi và khi đọc, mặc dù giá trị mong muốn là giá trị logic 0/1, nhưng thực tế tín hiệu ghi ra chân và tín hiệu đọc vào CPU để xử lý có thể khác nhau (mức điện áp). Để tránh tình trạng này, khi ghi ra chân PIC thì người ta ghi nhớ nó vào một biến tạm (thanh ghi đệm port - shadow register), sau đó khi đọc vào thì đọc luôn cái biến tạm này (0/1).
Kỹ thuật này dùng cho các chân I/O, và một hình thức của nó chính là việc xử lý ngắt. Một tín hiệu nhiễu hay sự trôi nổi điện áp cũng có thể gây ra hoạt động ngắt. Tuy nhiên, nếu có một biến tạm trước đó, và sử dụng nó để kiểm tra lại, hoặc dùng hình thức gây trễ bằng phần mềm để kiểm tra lại (tương tự như việc dùng tụ điện trên các nút bấm), thì việc xác nhận ngắt sẽ hiệu quả hơn, và sẽ ko gây ra các lỗi tương tự. Tốt hơn bạn nên đọc các tài liệu hướng dẫn, chứ không nên hỏi ngay. Nó rất thừa và mất thời gian của các thành viên khác. Khi bạn đọc hiểu rồi, nếu bạn thực sự hiểu vấn đề, bạn hãy dành thời gian của mình dịch lại tài liệu đó và post lên đúng chỗ này. Như vậy, một mặt bạn sẽ hiểu vấn đề sâu hơn, mặt khác bạn sẽ giúp cho các thành viên khác nắm vấn đề nhanh hơn. Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
26-11-2008, 11:07 AM | #7 |
Đệ tử 1 túi
Tham gia ngày: Jul 2008
Bài gửi: 17
: |
cám ơn bác đã chỉ giáo.em mới tham gia nen chưa biết cách học tốt nhất.hihi.em sẽ nghiên cứu
|
21-12-2010, 12:55 AM | #8 |
Nhập môn đệ tử
Tham gia ngày: Jun 2009
Bài gửi: 1
: |
sữ dụng interrupt on change.
mình có viết chương trình ngắt cho interrupt on chage ở chân RB0 của port b như sau ( dùng hi-tech c viết): void interrupt ngat(){ if(RBIE&&RBIF){ RBIF=0; // xoa co ngat RB0=1; cnt++;// biến này đã được khai báo rùi! switch(cnt){ case 1: chay8ledsTP();// đây là chương trình chạy 8 led từ trái sang phải break; case 2: sangled();// sáng 8 leds break; default: PORTA=0xff; cnt=0; } } } mình viết chương trình và chương trình chạy được theo yêu cầu. nhưng gặp vấn đề như sau: khi nhấn nút bấm nối vào chân RB0 1 lần, chương trình con chay8ledsTP chạy, nhưng khi mình bấm nút RB0 thêm lần nữa, thì chương trình con tat8leds ko chay ngay mà phải đợi chương trình chay8ledsTP chạy xong thì chương trình tat8leds mới chạy. có phải khi sữ dụng ngắt portb thì chương trình ngắt ko thực thi ngay lệnh ngắt trong lúc chương trình này đang chạy một ứng dụng khác? |
21-12-2010, 02:46 PM | #9 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
|
|