|
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 |
15-05-2009, 10:15 PM | #1 |
Đệ tử 7 túi
Tham gia ngày: Aug 2007
Bài gửi: 213
: |
Ngắt RB0 và MCLR ?
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 ?
|
16-05-2009, 12:26 AM | #2 |
Đệ tử 6 túi
Tham gia ngày: Jul 2006
Bài gửi: 135
: |
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.
|
16-05-2009, 05:39 AM | #3 |
Đệ tử 7 túi
Tham gia ngày: Aug 2007
Bài gửi: 213
: |
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
|
10-06-2009, 02:11 AM | #4 |
Đệ tử 7 túi
Tham gia ngày: Aug 2007
Bài gửi: 213
: |
Vấn đề sao vậy trời .Mô phỏng Proteus chính xác mà.
|
10-06-2009, 09:57 AM | #5 |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Vấn đề là mô phỏng ko thể mô phỏng được tất cả mọi yếu tố mà chúng ta gặp khi chạy thực tế.
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. |
10-06-2009, 12:23 PM | #6 |
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 6
: |
Em thử sd POR(power on reset) & PWTR(power up timer)
anh nghỉ mạch em bị nhiểu trên chân RB0 |
10-06-2009, 02:05 PM | #7 |
Đệ tử 7 túi
Tham gia ngày: Aug 2007
Bài gửi: 213
: |
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.
|
07-10-2009, 10:25 AM | #8 |
Đệ tử 1 túi
Tham gia ngày: Apr 2009
Bài gửi: 25
: |
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???
|
07-10-2009, 11:18 AM | #9 |
Đệ tử 6 túi
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
: |
cho code lên coi thử bạn!
__________________
A&A |
29-11-2009, 11:55 PM | #10 |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
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. 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) delay_ms(100); output_low(PIN_A0); delay_ms(100); 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. 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!
__________________
Mechatronics Department University of Engineering and Technology, VNUH. thay đổi nội dung bởi: Delfy_Coltech, 30-11-2009 lúc 12:18 AM. Lý do: Change sth! |
30-11-2009, 08:35 AM | #11 |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
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. |
30-11-2009, 10:48 AM | #12 | |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
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!
__________________
Mechatronics Department University of Engineering and Technology, VNUH. |
|
01-12-2009, 01:43 AM | #13 |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
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!
__________________
Mechatronics Department University of Engineering and Technology, VNUH. thay đổi nội dung bởi: Delfy_Coltech, 19-12-2009 lúc 01:13 AM. Lý do: ... |
19-12-2009, 01:07 AM | #14 |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
[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 VOID LCD_Display() { LCD_init(); Printf(LCD_putchar,"START..."); delay_ms(500); LCD_putcmd(0x80);// The first line Printf(LCD_putchar,"PRODUCT COUNTER"); delay_ms(500); LCD_putcmd(0xC0); // The second line Printf(LCD_putchar,"PRO.NUMBER: "); } // Interrupts function #INT_RDA VOID src_rda() { ................ sanpham++; // Create interrupts for PIC_Slave OUTPUT_HIGH(PIN_A0); OUTPUT_LOW(PIN_A0); // Clear interrupts flag. RCIF=0x00; } //4. Main program VOID main() { TRISA=0X00; PORTA=0XFF; LCD_Display(); enable_interrupts(GLOBAL); enable_interrupts(INT_RDA); WHILE(TRUE) { delay_ms(100); } } 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!
__________________
Mechatronics Department University of Engineering and Technology, VNUH. thay đổi nội dung bởi: Delfy_Coltech, 19-12-2009 lúc 01:12 AM. Lý do: Change sth...:) |
21-12-2009, 10:48 PM | #15 |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
Up nào! Các hảo huynh đệ đâu hết rùi. Bắt lỗi giúp Em với!
__________________
Mechatronics Department University of Engineering and Technology, VNUH. |
|
|