PDA

View Full Version : Trục trặc với 16f877a ngay từ đầu?


tranducbinh
20-08-2007, 07:06 PM
Chào mọi người

Minh đang thực hành 16f877a nhưng gặp một trục trặc như sau: (mong mọi người chỉ giúp)

mình thử xuất ra chân RB4 đến RB7 điện áp 5V nhưng khi dung dồng hồ đo thi không thấy lên 5V mà chỉ là ở mức 0, đôi khi là 0.02V khi để thang đo ở mức 0.1V trong khi mình mô phỏng trên proteus thì vẫn đúng. Chương trình rất đơn giản, minh nghĩ không có gì sai cả

#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=40000000)
#use fast_io(b)
#byte portb=0x06
#bit RB1=portb.1

main()
{
set_tris_b(0b00001111);

while (true)
{
portb=0b11110000;
}

}

mình dùng thach anh 4MHz và tụ cho thạch anh là 104pF.Mình cũng nghỉ tới khả năng chip bi hư nhưng chip vẫn nap được bình thường, thấy không báo lỗi gi cả.
mình không thể tìm ra dươc sai chổ nào. Mong các bạn chi giúp với.

namqn
20-08-2007, 07:16 PM
Nếu tụ pi của bạn được ghi là 104 thì nó là tụ 100 nF, chứ không phải là 104 pF (tôi cho là giá trị 104 pF là không chuẩn). Bạn cần tụ khoảng 15 đến 33 pF cho thạch anh 4 MHz.

Chương trình của bạn đang xuất giá trị 1 ra các chân RB4..RB7, chứ không phải RB0.

Thân,

tranducbinh
20-08-2007, 07:22 PM
Xin cảm ơn anh đã gửi câu trả lới.
Ban đầu thì em cũng dùng tụ 33p nhưng gặp trục trặc như trên thế là chuyển sang 104nF( theo như anh nói). Và em cũng nhầm lần ở chân RB0 nhưng mà em đã đo hết các chân của port b thì vẫn tình trang như vậy thôi. Không biết là em có thiếu cái gi không nữa? Em cũng đã thử nhiếu chip nhưng kết thì vẫn giống nhau.

Không biết có cần phải gắn thêm tụ vào đâu không nữa.Nếu có thì xin mọi ngưới hãy chỉ giúp.

namqn
20-08-2007, 07:40 PM
Vẫn còn chân MCLR cần được xác định trạng thái. Bạn vẫn chưa post sơ đồ mạch mà bạn đang dùng để thử nghiệm. Thông thường, nếu bạn cho phép chân MCLR hoạt động như ngõ vào để reset PIC thì bạn cần phải có 1 điện trở kéo lên, nối giữa chân MCLR (chân 1 của PIC) và nguồn Vdd, giá trị điện trở khoảng 10k đến 33k. Bạn cũng cần đảm bảo tất cả các chân Vdd và Vss đều được nối vào điện thế thích hợp. Giữa các chân Vdd và Vss nằm sát nhau bạn nên có ít nhất một tụ bypass (hay decoupling) có giá trị 100 nF, loại ceramic.

Thân,

caonam
20-08-2007, 10:41 PM
Chào mọi người

Minh đang thực hành 16f877a nhưng gặp một trục trặc như sau: (mong mọi người chỉ giúp)

mình thử xuất ra chân RB0 điện áp 5V nhưng khi dung dồng hồ đo thi không thấy lên 5V mà chỉ là ở mức 0, đôi khi là 0.02V khi để thang đo ở mức 0.1V trong khi mình mô phỏng trên proteus thì vẫn đúng. Chương trình rất đơn giản, minh nghĩ không có gì sai cả

#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=40000000)
#use fast_io(b)
#byte portb=0x06
#bit RB1=portb.1

main()
{
set_tris_b(0b00001111);

while (true)
{
portb=0b11110000;
}

}

mình dùng thach anh 4MHz và tụ cho thạch anh là 104pF.Mình cũng nghỉ tới khả năng chip bi hư nhưng chip vẫn nap được bình thường, thấy không báo lỗi gi cả.
mình không thể tìm ra dươc sai chổ nào. Mong các bạn chi giúp với.

Trisb như vậy thì output RB0 không được thì phải rồi.
Phải vầy nè set_tris_b(0b11110000);

tranducbinh
21-08-2007, 12:20 AM
Mach của em đơn giản chỉ là cấp nguồn cho pic và đo điện áp ở đầu ra thôi. Nhưng có một điều là em không dùng chân MCLR, không biết có ảnh hường gì tới hoạt động của pic hay không. Trong lúc viết reply này thì em chưa thử lại. Em thường nối thẳng chân MCRL xuống đất khi cần reset pic. Làm như vậy thì có vấn đề gi không nhì?
Mong mọi người chỉ giúp.

namqn
21-08-2007, 12:25 AM
Mach của em đơn giản chỉ là cấp nguồn cho pic và đo điện áp ở đầu ra thôi. Nhưng có một điều là em không dùng chân MCLR, không biết có ảnh hường gì tới hoạt động của pic hay không. Trong lúc viết reply này thì em chưa thử lại. Em thường nối thẳng chân MCRL xuống đất khi cần reset pic. Làm như vậy thì có vấn đề gi không nhì?
Mong mọi người chỉ giúp.
Không may là mạch đơn giản hóa đó sẽ không làm việc, vì chân MCLR luôn luôn được kích hoạt trong PIC16F877A, và nếu bạn thả nổi trạng thái của nó (tức là không nối vào đâu hết) thì PIC sẽ không chạy. Phải nối nó như thế nào thì tôi đã nói trên kia rồi.

Thân,

tranducbinh
21-08-2007, 12:08 PM
Đúng là khi nối chân MCLR thì pic đã hoạt động nhưng có điều là khi đo thì điện áp ở cả 4 chân từ RB4 đến RB7 chỉ đạt được là 2.3V chứ không phải là 5V, trong khi nguồn cấp cho pic vẫn ổn định ở 5V và mô phỏng trên proteus thì cũng là 5V

Mong mọi người chỉ giúp.

batbatdieu
21-08-2007, 03:13 PM
Bạn xem lại TA bạn dùng là gì , theo như khai báo của bạn là 40MHz , trong khi 877A max chỉ 20MHz thôi.

tranducbinh
21-08-2007, 05:35 PM
Mình đã nhầm khi đặt 40MHz và đã sửa lại là 4MHz trong chuong trình. Còn mạch thật thì dùng thach anh N4.000J. Nhưng sau khi sửa xong và nạp lại thì vẫn là 2.3 V. Không biết tại sao nữa.

Mong mọi người chỉ giúp.

anh_gioi
21-08-2007, 08:11 PM
cho em hỏi Pic của em ạ: em dùng con pic 16F877A ,phần mềm nạp wi800.ban đầu nó nhận pic,xóa đc cả pic.nhưng khi em nạp dữ liệu vào thì nó báo lỗi(em quên ko chụp lỗi rùi).
con pic khac em nạp ngon ơ(như vậy là pic chít ạ)

namqn
21-08-2007, 08:28 PM
Đúng là khi nối chân MCLR thì pic đã hoạt động nhưng có điều là khi đo thì điện áp ở cả 4 chân từ RB4 đến RB7 chỉ đạt được là 2.3V chứ không phải là 5V, trong khi nguồn cấp cho pic vẫn ổn định ở 5V và mô phỏng trên proteus thì cũng là 5V

Mong mọi người chỉ giúp.
Bạn thay lệnh portb = 0b11110000 thành OUTPUT_B(0b11110000) và thử lại xem.

Thân,

namqn
21-08-2007, 08:30 PM
cho em hỏi Pic của em ạ: em dùng con pic 16F877A ,phần mềm nạp wi800.ban đầu nó nhận pic,xóa đc cả pic.nhưng khi em nạp dữ liệu vào thì nó báo lỗi(em quên ko chụp lỗi rùi).
con pic khac em nạp ngon ơ(như vậy là pic chít ạ)
Chưa thể kết luận là PIC chết được. Nếu có thể thì bạn nhờ người khác nạp thử con PIC của bạn bằng một mạch nạp khác xem thế nào. Thông tin của bạn đưa ra còn thiếu, đó là mạch nạp loại nào, khi nạp thì bạn dùng socket của mạch nạp, hay nạp kiểu ICSP?

Bạn thử lại như sau: ra lệnh xóa chip, sau đó cho đọc lại ngay sau khi xóa chip, để xem chip có thực sự bị xóa hay không. Nếu chip không thể bị xóa thì bạn sẽ gặp lỗi như trên.

Thân,

batbatdieu
22-08-2007, 12:30 AM
Mình đã nhầm khi đặt 40MHz và đã sửa lại là 4MHz trong chuong trình. Còn mạch thật thì dùng thach anh N4.000J. Nhưng sau khi sửa xong và nạp lại thì vẫn là 2.3 V. Không biết tại sao nữa.

Mong mọi người chỉ giúp.

Nếu bạn sửa lại thành 4MHz rồi thì dòng này
#fuses NOWDT,PUT,HS,NOPROTECT
HS bạn cũng phải đổi thành XT ,ví dụ như :
#fuses XT,NOWDT,NOPROTECT,NOLVP

namqn: HS chấp nhận dải tần số thạch anh 4 - 20 MHz, do đó không nhất thiết phải đổi lại.

tranducbinh
22-08-2007, 11:33 AM
Mình đã sửa lại dòng #FUSES như bạn chỉ và chân RB4..7 đã lên đúng 5V! Xin cảm ơn đã chỉ giúp mình. Sau một hồi mày mò thì mình nhận ra lỗi là do từ khóa PUT trong dòng #FUSES. Tại sao lại như vậy??? Có ai giải thích giùm mình với. Xin cảm ơn.

chuchinh
28-08-2007, 01:27 PM
Các bác có tài liệu nào về ngắt của PIC877A không cho em nhé. Em dùng cả 3 ngắt đồng thời thì có cần phải để ý gì không, hay cứ lúc nào cần dùng ngắt nào thì bật ngắt đó lên? Khi bật nguồn và khi reset ngắt khác nhau chỗ nào không nhỉ?
Em dùng 3 ngắt cho 3 sự kiện, để cả 3 sự kiện cùng xảy ra khi bật nguồn thì thấy ngắt 1 và ngắt 2 làm việc, ngắt 0 không khởi động. Nhưng nếu reset lại PIC thì ngắt 0 và ngắt 2 khởi động, ngắt 1 không làm việc? Các bác có thể cho em biết tại sao không?
Còn nữa, em thường disable các ngắt ngay cuối chương trình ngắt sau khi nó đã định thời xong hoặc chưa định thời xong nhưng có sự kiện khác xảy ra, như vậy có vấn đề gì không các bác.

namqn
28-08-2007, 06:36 PM
Các bác có tài liệu nào về ngắt của PIC877A không cho em nhé. Em dùng cả 3 ngắt đồng thời thì có cần phải để ý gì không, hay cứ lúc nào cần dùng ngắt nào thì bật ngắt đó lên? Khi bật nguồn và khi reset ngắt khác nhau chỗ nào không nhỉ?
Em dùng 3 ngắt cho 3 sự kiện, để cả 3 sự kiện cùng xảy ra khi bật nguồn thì thấy ngắt 1 và ngắt 2 làm việc, ngắt 0 không khởi động. Nhưng nếu reset lại PIC thì ngắt 0 và ngắt 2 khởi động, ngắt 1 không làm việc? Các bác có thể cho em biết tại sao không?
Còn nữa, em thường disable các ngắt ngay cuối chương trình ngắt sau khi nó đã định thời xong hoặc chưa định thời xong nhưng có sự kiện khác xảy ra, như vậy có vấn đề gì không các bác.
Phản ứng của PIC ra sao phụ thuộc vào cách bạn xử lý ngắt, do đó bạn nên post phần code xử lý ngắt của bạn, cùng với phần code khởi tạo cho các ngắt thì mới có thể góp ý được.

Thân,

chuchinh
29-08-2007, 01:04 PM
Chương trình của em khá dài và không rõ ràng lắm, để em tìm cách rút gọn lại mà vẫn giữ nguyên phần ngắt rồi gửi lên bác nhé.
À, bác cho em hỏi, khi một ngắt đang trong quá trình định thời, nếu có một sự kiện xảy ra mà mình muốn xóa không cho ngắt đó thực hiện tiếp thì có phải mình chỉ cần dùng lệnh sau phải không (ngắt 1):
disable_interrupts(int_timer1);
Em dùng lệnh này nhưng không thấy hiệu quả, không hiểu tại sao???

Mr.Bi
04-09-2007, 09:07 PM
Không bit thông báo này là gì đây các sư huynh nhỉ ? Hình như plugin module PCM trong PIC C của em chưa có phải ko ?
http://i189.photobucket.com/albums/z78/NgCongMinhDN/Loi-1.jpg