PDA

View Full Version : Không chạy được nhiều chương trình con được gọi từ chương trìng chính!


lequocbao
17-11-2008, 12:06 PM
#include<16f877a.h>
#use delay<clock=20000000>
void ct_1();
void ct_1();
void ct_1();
void main()
{
do{
ct_1();
delay_ms(200);
ct_2();
delay_ms(200);
ct_3();
delay_ms(200);
}while(true);
}
void ct_1()
{
output_B(0xff);
//có thử dùng lệnh return tại đây nhưng không có gì thay đổi
}
void ct_2()
{
output_c(0xff);
//có thử dùng lệnh return tại đây nhưng không có gì thay đổi
}
void ct_1()
{
output_d(0xff);
//có thử dùng lệnh return tại đây nhưng không có gì thay đổi
}

khi chạy chỉ có các led ở port b sáng .
mình có cảm giác như là chương trình chỉ thực thi lệnh ở chương trình con ct_1(); rồi thôi!
Có ai biết tại sao không vậy?

namqn
17-11-2008, 05:04 PM
Bạn xem lại đoạn code mà bạn đã post lên. Bạn khai báo void ct_1(); 3 lần, và bạn định nghĩa ct_1() 2 lần, không có định nghĩa cho ct_3(), trong khi gọi ct_3() trong main().

Trước khi post code lên diễn đàn, bạn nên kiểm tra kỹ hơn. Với đoạn code đó, bạn lẽ ra phải gặp lỗi biên dịch, làm sao có được mã chương trình để thử?

Thân,

lequocbao
20-11-2008, 01:51 PM
Xin lổi mọi người mình "ẩu" quá!

#include<16f877a.h>
#use delay<clock=20000000>
void ct_1();
void ct_2();
void ct_3();
void main()
{
do{
ct_1();
delay_ms(200);
ct_2();
delay_ms(200);
ct_3();
delay_ms(200);
}while(true);
}
void ct_1()
{
output_B(0xff);
//có thử dùng lệnh return tại đây nhưng không có gì thay đổi
}
void ct_2()
{
output_c(0xff);
//có thử dùng lệnh return tại đây nhưng không có gì thay đổi
}
void ct_3()
{
output_d(0xff);
//có thử dùng lệnh return tại đây nhưng không có gì thay đổi
}

Cảm ơn anh namqn đã góp ý!

namqn
20-11-2008, 04:51 PM
Bạn chưa thiết lập đầy đủ cấu hình cho PIC. Có khả năng WDT đang hoạt động, dẫn đến PIC bị reset liên tục, do đó code của bạn không có cơ hội chạy đến những chương trình con khác.

Thân,

lequocbao
21-11-2008, 11:54 AM
Có phải mình phải thêm đoạn mã này vào phải không bạn?
#fuses HS,NOWDT,NOPROTECT,NOLVP
Nếu đúng ,vậy sẳn cho mình hỏi là đoạn code trên có ý nghĩa là gì vậy?
+ fuses là gì?
+ HS là mạch dùng thạch anh ngoài 20Mhz, còn XT là thạch anh 4Mhz đúng không (cái này mình vừa được chỉ giáo ở luồng khác )
+ NOWDT :NO là không , còn WDT là Watch Dog Timer phải không ?(mình cũng không biết Watch Dog Timer là gì luôn)
+ NO là không ,còn PROTECT là bảo vệ .Vậy là không bảo vệ cái gì vậy ta?
+ NOLVP là gì vậy bạn?(mình đoán LV là Low Voltag không biết có đúng không nữa, còn chữ P thì chắc là Programable quá!)
Các câu hỏi hơi "chuối" bạn nào biết giải thích giúp mình nha!

tungtot_vl
22-11-2008, 11:06 AM
fuses: là khai báo Config cho pic
WDT: dùng để reset lại pic mỗi khi nó tràn bộ đệm (nếu sử dụng).
NOPROTECT: không bảo vệ code (hay cho phép đọc code từ pic)
NOLVP: cho phép ghi (nạp) code ở điện áp thấp (P là power)

love_ac
22-11-2008, 04:02 PM
@lequocbao:
---Không phải cứ XT--4MHz,HS--20M.Nếu bạn dùng 16F877A thì hãy xem lại trang 147 để biết chi tiết,với các chip khác cũng nên xem(nếu dùng)
--Vâng WDT giúp reset lại PIC mỗi khi có sự kiện tràn.Và việc làm cho nó không tràn khi hoạt động bình thường này được người lập trình kiểm soát khi lập trình .WDT nó dùng cho mục đích gí:WDT được đùng để đưa chip ra khỏi tình trạng hoạt động không chính xác:có thể là do lỗi người lập trình dẫn đến vòng lặp không thoát,có thể là do nhiễu tác động chíp bị treo...
Các vidieukhien có thể cung cấp xung cho WDT chung hoặc riêng.Với PIC thì nó có bộ dao động dành riêng cho WD,và PIC có config cứng (không thay đổi được trong quá trình chạy)
còn nhiều cái...

namqn
22-11-2008, 04:49 PM
fuses: là khai báo Config cho pic
WDT: dùng để reset lại pic mỗi khi nó tràn bộ đệm (nếu sử dụng).
NOPROTECT: không bảo vệ code (hay cho phép đọc code từ pic)
NOLVP: cho phép ghi (nạp) code ở điện áp thấp (P là power)
LVP: Low Voltage Programming. NOLVP: không dùng chế độ nạp chương trình ở điện áp thấp.

Thân,

lequocbao
24-11-2008, 12:01 PM
To anh Namqn!
Đúng là khi mình khai báo là NOWDT thì các chương trình con chạy bình thường.Cảm ơn anh nhiều!
Nhưng anh cho hỏi là làm sao mình có thể kiểm soát được WD (khi nào thì biết bộ đệm bị tràn),nhân tiện hỏi luôn để vài bữa nữa làm phần giao tiếp với máy tính khỏi phải hỏi lại hì hì..

falleaf
24-11-2008, 01:21 PM
Bạn nên mở luồng khác để hỏi. F khoá luồng, tránh đi lan man.

Chúc vui