PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   cần giải đáp thắc mắc gấp!mong các cao thủ giúp đỡ (http://www.picvietnam.com/forum/showthread.php?t=6347)

chuot chui 13-05-2010 12:56 PM

cần giải đáp thắc mắc gấp!mong các cao thủ giúp đỡ
 
1 Attachment(s)
em đang làm bài mạch đèn giao thông với PIC6f877a và thạch anh 20M!Dưới là sơ đồ quét led hiển thị thời gian dành cho các hướng của em.
Thuật toán của em là dùng ngắt RB0 định thì 1s để giảm biến count
void ngat_ngoai()
{

--count;

}
sau đó sẽ xuất giá trị
#separate void hienthi1( int x)
{
//int t1,t2;
t1=x/10;
t2=x%10;


portb=0x02;
porta=t1;
delay_ms(5);
portb=0x00;

portb=0x04;
porta=t2;
delay_ms(5);
portb=0x00;

}
tuy khi làm trên mô phỏng thì thời gian đếm đúng là 1s nhưgn khi vào mạch thật thì nó lại chạy nhanh hơn rất nhiều lần khiến em trong hàm ngắt phải cho đếm đến 30 mới đc gần 1s!!Có cao thủ nào có nhiều kinh nghiệm làm mạch thật mong giúp đỡ em để tuần sau em nộp btl

chuot chui 13-05-2010 08:23 PM

Trích:

while(1)
{
if(mode==0)
{ temp=0x93;
xuat(temp);
count=dox-1;


while(mode==0)
{ //xuat(temp);
// delay_ms(800);
hienthi(count+xanh+vang+dox,count);
if (count+1==0)
mode++;
// enable_interrupts(int_timer1);

}
}
if(mode==1)
{ temp=0xC2;
xuat(temp);
count=xanh-1;
while(mode==1)
{//xuat(temp);
// delay_ms(800);
hienthi(count+vang+dox,count);
if (count+1==0) mode++;
// enable_interrupts(int_timer1);

}
}
if(mode==2)
{ temp=0xA3;
xuat(temp);
count=vang-1;
while(mode==2)
{ //xuat(0x21);
//delay_ms(800);
OUTPUT_B(0X07);
hienthi1(count+dox);
if (count+1==0) mode++;
// enable_interrupts(int_timer1);

}
}
if(mode==3)
{ temp=0x93;
xuat(temp);
OUTPUT_B(0x01);
count=dox-1;
while(mode==3)
{//xuat(temp);
//delay_ms(800);
hienthi(count,count+xanh+vang+dox);
if (count+1==0) mode++;
// enable_interrupts(int_timer1);

}
}
if(mode==4)
{ temp=0x19;
xuat(temp);
count=xanh-1;
while(mode==4)
{//xuat(temp);
// delay_ms(800);
hienthi(count,count+vang+dox);
if (count+1==0) mode++;
// enable_interrupts(int_timer1);

}

}
if (mode==5)
{ temp=0x95;
xuat(temp);
count=vang-1;
while(mode==5)
{ //xuat(temp);
// delay_ms(800);
OUTPUT_B(0x19);
hienthi2(count+dox);
if(count+1==0) mode++;
// enable_interrupts(int_timer1);
}
}
if (mode==6)mode=0;

}
đây là hàm main em dùng qued led!những cái râu ria ko cần post!ở đây em dùng DS1307 định thì 1s nhưng khi em sử dụng ngắt timer1 định thì thì nó vẫn như thế nên ko thể là do con DS1307 được!tạm thời các bác cứ bỏ qua con DS 1307 đi vif em chưa dùng gì đến nó cả!mà cũng thông báo luôn khi dùn ngắt địng thì 1s này chỉ để nháy tắt bật led thì lại đúng 1s thật!thật khó hiểu quá

chuot chui 14-05-2010 08:50 PM

mẹ cha ơi~ko ai trả lời sao!!chắc toàn cao thủ code chứ ko chịu làm mạch thật

cskiller 14-05-2010 11:26 PM

Trích:

Nguyên văn bởi chuot chui (Post 35998)
mẹ cha ơi~ko ai trả lời sao!!chắc toàn cao thủ code chứ ko chịu làm mạch thật

Bạn muốn được trả lời, giúp đỡ thì ít ra cũng phải có đủ cả schematic mô phỏng + code luôn chứ, chỉ có phần mô phỏng không thế kia chắc chỉ 'siêu cao thủ' mới 'khám' ra bệnh cho bạn.
PIC không chạy sai theo cấu hình OSC như chỉ dẫn trong datasheet đâu, chỉ có bạn config + code không đúng thôi.

Regards

chuot chui 15-05-2010 01:09 AM

Trích:

Nguyên văn bởi ngocthanh07 (Post 36008)
Không ai có nhiệm vụ phải trả lời cho những kẻ xấc xuợc và ngạo mạng như bạn. Trong tầm mắt của bạn thì có lẽ chuyện này là khó nhưng nhiều và rất nhiều nguời không nghĩ như vậy. Thì giờ của mọi nguời là tiền bạc. Không ai rỗi hơi đâu đi trả lởi cho những kẻ đòi hỏi và không biết chịu khó tìm tòi như bạn đâu. Cho dù không ai trả lời bạn nhưng nếu bạn chịu học hành đến nơi đến chốn suy nghĩ cặn kẽ thì cũng có câu trả lời thôi.
Làm đuợc cái mạch chẳng có gì đâu bạn ơi! chưa đáng là gì để la lói đòi hỏi vậy đâu.

tiếp thu ý kiến của các bác!
em chẳng có ý gì xấc xược đâu! chỉ nghĩ là các bác chưa bao h gặp qua cái lỗi này nên ko ai trả lời thôi

chuot chui 15-05-2010 01:16 AM

1 Attachment(s)
đây là code modul em đã test mạch!trong này em đã chỉnh lại cho mo fỏng đúng 1s (như lí thuyết em nghĩ) nhưng trong thực tế thì nó chỉ là 1/30s!em không hiểu chỗ này mong các bác chỉ giáo cho!

chuot chui 15-05-2010 09:44 AM

bác ơi!em tính toán đúng 1s dùng timer1 mà vẫn thế bác ạ!vì em cho thử nháy led thì vẫn đúng 1s mà!code em để trên là đang dùng ngắt ngoài RB0 do chân SOUT của DS1307 tạo xung 1HZ!nhưng vào mạch thật thì lại sai khác!các bác có thể xem hộ em phâng quét led có chỗ nào trục trặc không mà sai thế !
thanks!

bien_van_khat 15-05-2010 10:29 AM

Mô phỏng proteus ko thể thể hiện được thời gian thực hiện lệnh của PIC. Tức là proteus thực hiện 1 lệnh có thể nhanh hơn hoặc chậm hơn so với PIC.

Do đó
Trích:

khi làm trên mô phỏng thì thời gian đếm đúng là 1s nhưgn khi vào mạch thật thì nó lại chạy nhanh hơn rất nhiều lần
là điều đương nhiên.

Để người khác có thể giúp bạn được thì bạn cần cung cấp thông tin nhiều nhất có thể. Thử nghĩ bạn có mạch có code còn ko làm nó chạy được thì người khác chỉ nghe bạn mô tả:
Trích:

Nguyên văn bởi chuot chui (Post 36019)
bác ơi!em tính toán đúng 1s dùng timer1 mà vẫn thế bác ạ!vì em cho thử nháy led thì vẫn đúng 1s mà!code em để trên là đang dùng ngắt ngoài RB0 do chân SOUT của DS1307 tạo xung 1HZ!nhưng vào mạch thật thì lại sai khác!các bác có thể xem hộ em phâng quét led có chỗ nào trục trặc không mà sai thế !
thanks!

sẽ giúp bạn như thế nào???

Các bạn mới tham gia chịu khó đọc thread bên dưới chữ ký của mình một lần để biết cách đặt câu hỏi!

chuot chui 15-05-2010 03:13 PM

Trích:

Nguyên văn bởi bien_van_khat (Post 36021)

Để người khác có thể giúp bạn được thì bạn cần cung cấp thông tin nhiều nhất có thể. Thử nghĩ bạn có mạch có code còn ko làm nó chạy được thì người khác chỉ nghe bạn mô tả:

sẽ giúp bạn như thế nào???

em đã đưa code và mạch test mô phỏng lên rồi mà!

Vậy em xin bác nào đã từng chạy quét led mạch thật mà chạy đúng 1s cho em xin cái code và mạch để em so sánh!! Vấn đề của em hiện tại là chưa hiểu qued led theo đúng 1s thì chịu ảnh hưởng của cái gì và khi sử dụng ngắt 1s thì sử dụng như thế nào cho nó đúng!

Theo lời bác bien_van_khat nói thì mô phỏng có thể thực hiện thời gian chênh lệch so với của pic nhưng vào trường hợp của em thì em thấy như vậy thì chênh lệch quá lớn!!???liệu có đúng ko??

chuot chui 15-05-2010 03:19 PM

Trích:

Nguyên văn bởi ngocthanh07 (Post 36015)

Xin đuợc hỏi con số 3036 của bạn đuợc tính bằng cách nào ?.



em tính thế này 1s=(65536-3036)x4/20Mx8x10

65536=2^16 là giá trị tối đa đếm của thanh ghi timer1
8:tỉ số chia tần
10:ta cho biến count đếm 10 lần để đc 1s

ngocthanh07 16-05-2010 12:56 AM

Ừh, xin lỗi bạn, mình dùng PIC khác nên nhầm. Bạn bỏ QUOTE cái đoạn nhầm đó của mình nhé,
Thank.
Chúc bạn sớm tìm ra nguyên nhân.

chuot chui 16-05-2010 01:11 AM

cảm ơn bác!!em biết cái lỗi này nghe chừng cũng vô lí!nó còn hài hước hơn khi sau vài ngày ko sửa code mà mạch lại chạy đúng đc!em cũng đến pó tay cái vụ này!

Thôi nhân tiện đây được trao đổi với các tiền bối đi trước,bây h em thấy mình gà quá lí thuyết với mạch thực tế thật cần nhiều hiểu biết hơn là đơn giản chỉ ngồi code và mô phỏng!thế nên không biết các bác có nhã hứng thử post một số chương trình của mình và kể một số lỗi gặp khi làm mạch thật để coi đó là kinh nghiệm cho đàn em sau này không??

chuot chui 17-05-2010 03:18 PM

chán quá!cái trên thì thôi em khắc phục đc cho đếm đúng 1 s!nhưng h cái code kia nạp vào mạch của em lại không hiện số 0 ở led 7 đoạn dù các số từ 1==>9 vẫn hiện rõ nét!các bác thử cho em ý tưởng gì về lỗi này không?

cskiller 17-05-2010 04:13 PM

Trích:

Nguyên văn bởi chuot chui (Post 36049)
cảm ơn bác!!em biết cái lỗi này nghe chừng cũng vô lí!nó còn hài hước hơn khi sau vài ngày ko sửa code mà mạch lại chạy đúng đc!em cũng đến pó tay cái vụ này!

Thôi nhân tiện đây được trao đổi với các tiền bối đi trước,bây h em thấy mình gà quá lí thuyết với mạch thực tế thật cần nhiều hiểu biết hơn là đơn giản chỉ ngồi code và mô phỏng!thế nên không biết các bác có nhã hứng thử post một số chương trình của mình và kể một số lỗi gặp khi làm mạch thật để coi đó là kinh nghiệm cho đàn em sau này không??

Sao lại vô lý, code của bạn sai ở phần setup cho timer 1, nên timing của nó không đúng là phải rồi:
Code:

setup_timer_1(T1_INTERNAL||T1_DIV_BY_8);
Rút kinh nghiệm của việc nhầm lẫn giữa phép toán bit OR(|) và phép kiểm toán luận lý OR(||).

Regards

chuot chui 17-05-2010 04:28 PM

Trích:

Nguyên văn bởi cskiller (Post 36081)
Sao lại vô lý, code của bạn sai ở phần setup cho timer 1, nên timing của nó không đúng là phải rồi:
Code:

setup_timer_1(T1_INTERNAL||T1_DIV_BY_8);
Rút kinh nghiệm của việc nhầm lẫn giữa phép toán bit OR(|) và phép kiểm toán luận lý OR(||).

Regards

cảm ơn bác!lời bác dạy chí phải!em chủ quan quá do nhìn mô phỏng và nháy đèn vàng đúng 1s nên ko kiểm tra lại !!

Tiện thể em xin hỏi các bác :hiện nay như mạch em đưa ở trên thì em điều khiển hiển thị led 7 thanh từ port b thông qua 1 con tran C828 và điện trở 10k giảm dòng.Tuy nhiên em chỉ hiển thị được các số từ 1 đến 9 mà thiếu mất số 0@em đo điện áp khi cho hiển thị 0 thì dòng của tran quá bé ! em không biết bây h


Múi giờ GMT. Hiện tại là 10:52 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam