![]() |
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> 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) |
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, |
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é |
1 Attachment(s)
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á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) |
Đạ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á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
|
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? |
Trích:
|
Múi giờ GMT. Hiện tại là 01:44 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam