![]() |
Ngắt RB0 và MCLR ?
1 Attachment(s)
Mình viết đoạn code như sau,sử dụng ngắt ngoài RB0 và mạch reset.Mô phỏng bằng proteus thì rất tốt nhưng khi nạp vào pic thì lại không như mô phỏng.Đúng ra thì bắt đầu chương trình thì sẽ thực hiện các lệnh nằm trong main() trước nhưng thực tế thu được là :khi bắt đầu cấp nguồn cho pic thì nó thực hiện ngắt trước ,sau đó mới chạy vào hàm main() và chạy.Sau đó nếu nhấn reset thì lại tiếp tục như vậy.Mình xài ngắt ngoại,liệu reset ở MCLR có được hiểu là một laọi ngắt ngoại không ?Phải cấu hình cho pic thê nào để nó chạy đúng như mô phỏng trong trường hợp này ?
|
MCLR la ngắt có mức độ ưu tiên cao nhất ! Có thể chương trình bạn có bugs. Hãy dò lại 1 cách kỹ lưỡng xem. Tôi thấy hàm ngắt thực hiện việc hiển thị giống hàm main. Có khi nào bạn lầm lẫn trog việc quan sát kết quả? Bugs nằm ở đó. Thêm nữa, bạn đừng nghĩ sử dụng hàm xây dựng sẵn của trình biên dịch thì có nghĩa là ko cần quan tâm các bit cấu hình cũng như các thanh ghi ko liên quan đến module mình đang dùng. Ở đây bạn dùng ngắt ngoài, nên để ý các thanh ghi liên quan ngắt.
|
Vậy phải cấu hình như thế nào?Hàm ngắt làm công việc giống hàm main() nhưng chuỗi hiển thị thì khác (đó là ý đồ chính ).Có lẽ vấn đề ở đây là cấu hình pic để nó giống với mô phỏng thôi vì mô phỏng đâ chạy được
|
Vấn đề sao vậy trời .Mô phỏng Proteus chính xác mà.
|
Trích:
Trong chuơng trình chính bạn nên xóa cờ ngắt ngoài trước khi enable ngắt ngoài. |
Em thử sd POR(power on reset) & PWTR(power up timer)
anh nghỉ mạch em bị nhiểu trên chân RB0 |
Ngay khi cấp nguồn cho nó chạy thì nó lại nhảy vô chương trình ngắt luôn vậy đó.Để em thử cách cua anh phamhoangthong.Cảm ơn 2 anh phamhoangthong và bien_van_khat.
|
ngat rb0
minh dang lam ve dieu khien dong co mot chieu.minh dung ngat rb0 de dk toc do dong co theo cac cap khac nhau.nhung khi minh mo phong thi ko ngat dc.bac nao da lam roi cho minh them y khien dc ko???
|
Trích:
|
Ngắt ngoài bị nhiễu! Help help!
Hi all!
Em cũng đang gặp rắc rối với chú ngắt ngoài RB0. Xin ý kiến của các tiền bối. Em làm một hệ thống đếm sản phẩm hiển thị 3 LED 7 đoạn. Gồm 1 MCU điều khiển chung và các module nhỏ. Riêng module hiển thị LED 7. Em dùng hẳn 1 chú 16F877(Pic_Slave) để điều khiển việc hiển thị LED. http://i560.photobucket.com/albums/s...on/LED_DIS.jpg Cứ mỗi lần tín hiệu truyền về chân RC7(Xảy ra ngắt RDA), thì thực hiện đoạn mã: Code:
output_high(PIN_A0) Về code thì đã OK. Xong khi Em làm mạch và test thì xảy ra hiện tượng chân RBO bị nhiễu mỗi lần cắm Adapter nguồn, hoặc bật công tắc nguồn. Ngay cả sờ tay vào đường mạch nối tới chân RB0 đó, cũng xảy ra ngắt! Em nghĩ có thể do mình không phủ mass nên mạch bị nhiễu. Đây là mạch in của Em. http://www.fileden.com/files/2009/5/...718/LED_in.jpg Bi giờ phải khác phục sao đây các bác! (Em không muốn làm lại mạch! :)) Thanks alot! |
Dựa trên sơ đồ, mình nghĩ con PIC bên trái của bạn sẽ kéo chân RA0 lên logic 1 hoặc xuống logic 0 để gây ngắt ở con PIC bên phải.
Nhưng vấn đề là khi khởi động chân RA0 là Tris-state, do đó có 1 khoảng thời gian chân RB0 của PIC-phải sẽ lơ lửng nên nhiễu từ môi trường sẽ tác động làm thay đổi mức logic trên chân RB0 gây ra ngắt. Ngay khi khởi động bạn cần đưa chân RA0 về logic 0 hoặc logic 1. Tốt hơn, bạn nên hàn 1 con điện trở 10K nối thằng từ RB0 lên Vdd, khi nào cần gây ngắt thì xuất logic 0 ra chân RA0. |
Thank U!
Trích:
Em cũng đã khắc phục được bằng các khởi động MCU trước! Rồi khởi động module LED Drive sau. Nhưng cách hàn thêm trở của Bác chắc là tối ưu hơn đó! Để Em thử nào. Many thanks! |
Cảm ơn Anh Biển nha!
Bây giờ mới có thời gian sửa lại! Tuyệt vời! Đã hết nhiễu nhờ hàn thêm trở cho chân RBO của Slave_Pic. Mời bác 1 ly cafe nào! http://www.tinnhanhblog.com/images/a.../u16_coffe.jpg |
[Help] Continue with RDA interrupts question...???
Hi all!
Em gặp một lỗi về thời gian xảy ra ngắt RDA. Tiếp tục với cái project của Em như ở bài trên. Tư tưởng như sau: - Khi có tín hiệu về chân RC7, xảy ra ngắt RDA. Biến đếm tăng lên 1 đơn vị. --> Tăng biến đếm led, hiển thị LCD. Code của Em như sau: Code:
// LCD Display function Em nghĩ là do hàm LCD_Display(). Khi Em bỏ hàm LCD_Display() trong void main() đi thì ngắt được, nhưng phải đến lần thứ 2 mới xảy ra ngắt (sản phẩm đầu bị bỏ qua không đếm)--> Why? Các bác cho Em hỏi: 1. Đối với ngắt RDA thì nó cần bao nhiêu ms để khởi tạo xong và phải làm thế nào để khắc phục lỗi trên của Em. 2. Viết lệnh thế nào để dòng thứ 2 của LCD hiển thị số thứ tự sản phẩm chạy qua? (Chú LCD_putchar(sanpham) đặt ở đâu? Vì đặt trong hàm ngắt thì Em thấy có warning.) Cảm ơn các bác rất nhiều! |
Up nào! Các hảo huynh đệ đâu hết rùi. Bắt lỗi giúp Em với!
|
Múi giờ GMT. Hiện tại là 10:17 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