PDA

View Full Version : Giúp config thạch anh 20 MHz. Cần rất gấp...


chaulongfight
29-05-2009, 02:51 AM
Chào các bác, hk này em đang làm đồ án về cái AC measurement hiển thị ra LCD. Mọi thứ vẫn rất tôt đẹp. CODE mô phỏng đã chạy được từ lâu. Mấy bữa rồi em bận làm cái đồ án tin với lại có phần hơi chủ quan nên vẫn chưa làm mạch thử. Hôm qua em dự định gắn ra test board thử để cuối tuần làm mạch in. Độ tuần sau là phải nộp sản phẩm rồi. Bỗng dưng xuất hiện một vấn đề như sau:
* Vốn là em định debug từng bước ( chỉ là debug phần cứng như đấu dây, test linh kiện thôi) để sau này gỡ lỗi cho đỡ rối nên em test thử bằng chương trình nhấp nháy một PORT (PORTB), mô phỏng OK. Nhưng khi gắn vô test board thì hắn không chạy. Rõ hơn là mạch dao động không hoạt động ( em đoán thế ). Bởi nếu đấu tiên em cho PORT đó sáng thì gắn vô mạch hắn cứ sáng mãi chứ ko nháy, Còn nếu em cho tắt trứơc sáng sau thì nó cứ tắt mãi.
* Em rất rối, do mặc dù đã thử rất nhiều cách nhưng vẫn không khắc phục được lỗi trên.
* Mạch em đang dùng PIC 16F877A, thạch anh 20 MHZ, em đã cấu hình #FUSE HS mà vẫn không được. Khả năng thạch anh hư là rất hiếm bởi theo em biết thì thạch anh rất khó bị hư vả lại ở nhà em có 2 con 20 MHz đã thử cả 2 con mà vẫn không được.
* Sau đó em thử chuyển sang xài thử con 4 MHz với cấu hình #FUSE XT, năm ngoái đồ án em làm về quang báo dùng con này chạy rất OK. Thế nhưng mọi chuyện vẫn như cũ.
* Em đọc trong datasheet của con PIC thấy có nói là đối với cấu hình sử dụng HS, cũng như XT thì yêu cấu gắn thêm một điện trở Rs để tránh overiding nhưng hắn không nêu rõ giá trị điện trở là bao nhiêu. Em đã thử thay dẫn các giá trị thì thấy như sau: với các trơ 100 Ohm, 220 Ohm đèn sáng mãi, với trở từ 1 KOhm trở lên thì tắt mãi. (Khi em sử dụng trơ 220 Ohm hoặc không gắn thêm trở thì có hiện tượng là nếu em chạm tay vào chân của con thạch anh thì hắn tắt cũng giống như là gắn thêm trở lớn vậy. Em nghĩ cái này là do trở kháng của cơ thể gây ra.)
* Có một hiện tượng khác nữa là nếu em chạm tay váo chân của 2 con tụ thì đèn có nháy mặc dù cơ chế không thất sự chuẩn xác lắm. Cái này giống như là cấu hình hoạt động với Resistor/Capacitor nhưng rõ ràng trong file cấu hình của em sử dụng với high speed crystal.
* Khả năng PIC hư em nghĩ chắc cũng không phải tại ngoài con của em, em còn có 2 con của thằng bạn nữa. Cả 3 con điều có chung hiện tượng trên.
* Em chỉ còn lại 2 nghi vấn là: test board bị lỗi, các chân gắn không chặt nên khi hoạt động với tần số cao gây ra lỗi trên. Thứ 2 là config của em vẫn có lỗi mà em không phát hiện ra.

* Nói ra thì thật là ngại tại cũng đã tiếp xúc với PIC cũng được một thời gian rồi, em nghĩ mình cũgn biết đôi chút về con PIC. Tự dưng giờ làm cái mạch nhấp nhấy cũng không chạy làm em thấy dỡ khóc dỡ cười quá.
* Các bác có cao kiến gì chỉ giúp em với. Chứ nếu chưa chạy thử trên testboard, làm mạch in luôn lỡ hắn không chạy thì chỉ có mà khóc thét. Tại cái mạch in cũng khá phức tạp...
* Cái code thử của em đây:


#include <16F877A.h>
#include "G:\Ebook\CCS\Lib\def_16f877A.h"
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Crystal osc >= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

// TODO: USER CODE!!
TRISB = 0x00;
while(true)
{
PORTB = 0xff;
delay_ms(1000);
PORTB = 0x00;
delay_ms (1000);
}
}



* Rất mong nhận được sự phản hồi từ các bác. Thân.

tienchuan
29-05-2009, 07:21 AM
Em chỉ là dân amteur thôi,nhưng em đã gặp phải vấn đề "xx" như anh.Sau khi học xong các lệnh I/O em cũng viết thử chương trình nhấp các kiểu của chữ Happy New Year,nhưng khi gắn lên test board thì nó im lìm đến bực mình.

Cuối cùng,em đã cẩn thận kiểm tra lại từng phần (code thì chắc chắn OK) như sau:

+ thay test board và cắm lại cẩn thận (nhớ đè chip chặt xuống test board)
+ khi nạp chương trình đảm bảo đã load được chương trình xuống Chip (khi đó em nạp bằng winpic 800 nhưng ấn hoài mũi tên màu xanh,nhưng chính xác thì phải nhấn mũi tên màu đỏ mới đúng>củ chuối<)
+cần có thêm 2 con tụ giấy 33p tại chân 13,14 của mạch dao động .
+kiểm tra lại nguồn và mass (pic16f877a cần 2 chân nguồn 11,32 ; và 2 chân đất 12,31) thì mới hđộng được.

Sau khi kiểm tra và lắp lại như trên,em đã tìm ra lỗi của mạch là như vây.Cuối cùng,nó cũng chạy (mừng đến phát khóc (#+#))

Àh,ngoài ra phần khai báo cấu hình anh nên làm gộp lại một lệnh cho gọn (em hiểu chắc là anh đang kiểm tra từng option )

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT

với cái này nữa,anh chưa khai báo con trỏ để quy định sử dụng không gian bộ nhớ Ram

#device *=16 adc=8 // anh thử cái này thử nha!

Àh,anh nên chép file định nghĩa def_16f877A.hvào chung thư mục với file chương trình C(chương trình do mình viết),thường thì do ta tạo ta để dễ quản lí,khi dịch thì tự động CCS nó sẽ lấy ra và chỉ cần viets lại như sau:

#include <def_877a.h> // FILE DINH NGHIA CAC THANH GHI VA CAC BIT

Hơn nữa,anh thử bỏ đoạn code setup chức năng ADC,timer,ngắt..: (cái này theo em thôi,nếu có gì sai mong các anh thứ lỗi,em còn yếu lắm):

//setup_adc_ports(NO_ANALOGS);setup_adc(ADC_OFF);
//setup_psp(PSP_DISABLED);
//setup_spi(FALSE);
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
//setup_timer_1(T1_DISABLED);
//setup_timer_2(T2_DISABLED,0,1);
//setup_comparator(NC_NC_NC_NC);
//setup_vref(FALSE);

Em chỉ góp ý cho Anh như vậy thôi,em cũng ko biết mình có nói gì bậy bạ ko ? (nếu có thì cho em nhận trước >hhe<)
Thân,chúc anh thành công !!!

bien_van_khat
29-05-2009, 10:46 AM
Thêm 2 con tụ gốm 0.1uF, mỗi con nối vô 1 cặp chân Vdd - Vss của PIC. cắt thật ngắn chân, cắm sát xuống breadboard, gắn ngay sát con PIC (mục đích để đường nối giữa tụ và các chân nguồn của PIC là ngắn nhất).

2 con tụ này rất quan trọng và luôn luôn cần phải có.

tienchuan
29-05-2009, 11:21 AM
Anh bien_van_khat có thể nói rõ thêm chức năng của 2 tụ gôm 0.1 uF được ko? Có phải để lọc nhiễu từ nguồn ko anh ?

bien_van_khat
29-05-2009, 12:28 PM
Anh bien_van_khat có thể nói rõ thêm chức năng của 2 tụ gôm 0.1 uF được ko? Có phải để lọc nhiễu từ nguồn ko anh ?

1 - các tụ này ko phải dùng để lọc nguồn mà để decoupling (mình cũng ko dịch được từ này) cho chip, được bố trí rất gần với chip và luôn luôn cần phải có. Tụ lọc nguồn bao giờ cũng đc đặt gần nơi cấp nguồn.

Mặc dù dòng tiêu thụ trung bình có thể nhỏ nhưng khi hoạt động ở tần số cao, dòng điện tức thời mà chip cần (để nạp các cổng của các MOSFET) là rất lớn.

Do di/dt lớn nên ảnh hưởng của điện cảm trên đường mạch cũng rất lớn. Ngoài ra các ổn áp tuyến tính đều ko thể cung cấp đc dòng điện này cho chip. Vì vậy bạn phải cần các tụ điện để tích điện tạm thời trong chu kỳ chip ko hoạt động và xả dòng để cung cấp cho chip trong chu kỳ hoạt động. Các tụ điện này phải:

+ ESR thấp để có khả năng xả dòng lớn. Tụ gốm (nhật tảo gọi là tụ bi, hình đĩa màu vàng hoặc nâu) là lựa chọn tốt. 0.1uF là phù hợp. Đôi khi có thể mắc song song thêm 1 tụ 0.01uF.
+ Thật gần 2 chân nguồn của chip để giảm điện cảm, điện trở của đường mạch.

2 - Khi lắp các tụ decoupling, trên các đường cấp nguồn sẽ có nhiễu tần số cao do nạp và xả các tụ này cộng thêm nhiễu từ nhiều nguồn khác và cần phải triệt tiêu.
Nhưng đây là vấn đề rất phức tạp, mình chỉ có một số cách:
+ Sử dụng LDO tốt, dòng tĩnh thấp, nếu phải xài 7805, với 1 số loại theo mình biết cần có 1 con 0.1uF sát ngay chân output để tránh bị dao động.
+ Tăng kích thước đường nguồn để giảm điện cảm.
+ Đặt rải rác các tụ 10uF (low ESR) trên các đường cấp nguồn.
+ Nếu phải dùng các tải cảm như relay, motor và dùng chung nguồn, nên đi 2 đường mạch Vss - Vdd riêng.
+ Dùng diode schottky (1N5817, 1N5822...) thay vì các loại nắn dòng (1N4001, 4007..) để dập dòng cảm ứng trong các tải cảm. Có một số loại linh kiện gọi là tranzorbs, sidactor để dập các dòng cảm ứng, tuy nhiên mình chưa dùng loại này.

chaulongfight
29-05-2009, 01:28 PM
@tienchuan: cám ơn rất nhiều về sự góp ý của bạn. Các vân đề của bạn nêu ra mình đã đọc.
+ Cai đầu tiên thay board thì hơi căng tại ở nhà chỉ có độc mỗi cái board này thôi, trước khi gắn mạch mình đã "vệ sinh" nó kỹ để tránh rò rỉ điện và test mấy chân thấy vẫn tiếp xúc tốt.
+ Cái thứ hai thì mình biết rồi, cái nút màu xanh là để read code từ trong PIC ra. Cái màu đỏ là để write code vào PIC, còn cái màu vàng để verify code. Sau khi nạp mình đã verify lại code và chắc chắn là khi nạp không có lỗi, code đã được nạp hoàn toàn vào PIC.
+ 2 cái tụ với cái nguồn mình điều gắn cả. Mấy cái này thì đã thành mặc định khi xài thạch anh rồi nên chắc cũng không phải tại chỗ đó.
+ Phần khai báo đó là do PICC tự động viết. Mình cũng đã thử viết phần khai báo riêng trước rồi nhưng vẫn không được nên mới post bài lên đây. Ngoài ra đó chắc cũng không phải là nguyên nhân.
Một lần nữa cám ơn bạn rất nhiều.
@bien_van_khat: rất cám ơn sự góp ý của anh. 2 con tụ mà anh nói đến là để chốt áp giữa 2 chân của của PIC để đảm bảo áp giữa chúng ít dao động tạo sự ổn định cho mạch phải không? Cái này thì em có biết nhưng chưa hề nghĩ tới trường hợp này. Có lẽ đây là một ý hay. Chút nữa em sẽ thử liền.
+ Em đang thử với test board nên việc tăng kích thước đường nguồn là hơi khó vì khi đó sợ gắn khôgn lọt cái lỗ.
+ Ổn áp em đang xài là 78L05, có gắn kèm 1 cặp tụ ở cả đầu vào và đầu ra để ổn định điện áp. Chương trình của em cũng không xài tải cảm nên vấn đề đó chắc không đáng ngại.
Dẫu sao cũng đã có được một manh mối. Thank rất nhiều. Chiều thử xem hi vọng được.

chaulongfight
30-05-2009, 10:17 PM
@ngocthanh07: cám ơn vì góp ý của bạn.
* Cai Rs mà bạn nói trước đây mình không dùng do hay xai với thạch anh 4 MHz, nhưng do cái đồ án này đòi tốc độ xử lý cao nên mình chuyển sang xài con 20 MHz. Theo thói quen mình cũng chỉ xài mỗi thạch anh thôi. Nhưng sau gắn vô hắn không chạy nên mới kiểm tra lại datasheet với nhớ tới cái vụ Rs đó thôi.
* Còn tụ thì mình có rất nhiều mua lần cả trăm con mình đã thử thay tụ mấy lần mà cũng không được nên khả năng tụ hư cũng là khá thấp.
* Hiện tại thì mình chưa nghĩ đến việc mua con PIC mới vì so ra 2 con có chức năng gần tương tự nhau, nên chi mua về dể test thì cũng hơi phí. Ngặc nỗi tụi bạn cũng đa số xài con 16F877A này (tại mua cùng lượt để làm đồ án mà ).
* Để chiều mai thi xong minh thử lại lần nữa nếu vẫn không được thì đành nhắm mắt làm mạch in đại. Hi vọng gắn vô mạch in mấy cái nhiễu sẽ bị loại. Nếu mạch hoạt động bình thường thì tốt nếu không thì đành chấp nhận đau thương. Khi đó đành suy nghĩ giải pháp khác.
Thanks nhiều.

nguyenluong
31-05-2009, 12:53 PM
@ngocthanh07: cám ơn vì góp ý của bạn.
* Cai Rs mà bạn nói trước đây mình không dùng do hay xai với thạch anh 4 MHz, nhưng do cái đồ án này đòi tốc độ xử lý cao nên mình chuyển sang xài con 20 MHz. Theo thói quen mình cũng chỉ xài mỗi thạch anh thôi. Nhưng sau gắn vô hắn không chạy nên mới kiểm tra lại datasheet với nhớ tới cái vụ Rs đó thôi.
* Còn tụ thì mình có rất nhiều mua lần cả trăm con mình đã thử thay tụ mấy lần mà cũng không được nên khả năng tụ hư cũng là khá thấp.
* Hiện tại thì mình chưa nghĩ đến việc mua con PIC mới vì so ra 2 con có chức năng gần tương tự nhau, nên chi mua về dể test thì cũng hơi phí. Ngặc nỗi tụi bạn cũng đa số xài con 16F877A này (tại mua cùng lượt để làm đồ án mà ).
* Để chiều mai thi xong minh thử lại lần nữa nếu vẫn không được thì đành nhắm mắt làm mạch in đại. Hi vọng gắn vô mạch in mấy cái nhiễu sẽ bị loại. Nếu mạch hoạt động bình thường thì tốt nếu không thì đành chấp nhận đau thương. Khi đó đành suy nghĩ giải pháp khác.
Thanks nhiều.

Bạn có chắc chắn rằng cái testboard của bạn tốt không,kết nối tốt không, chỉ cần hở một chân nào đó thì VDK ko chạy được rồi. Cái này tui gặp hoài rùi, quen quá mà. Tôi khuyên bạn hãy thiết kế trên Orcad rồi làm mạch in lun. hãy dung XTAL 4MHz, 2 tu 15p. Đảm bảo sẽ chạy tốt.
CHào bạn , chúc bạn có kết quả tốt!

chaulongfight
01-06-2009, 09:35 AM
Bạn có chắc chắn rằng cái testboard của bạn tốt không,kết nối tốt không, chỉ cần hở một chân nào đó thì VDK ko chạy được rồi. Cái này tui gặp hoài rùi, quen quá mà. Tôi khuyên bạn hãy thiết kế trên Orcad rồi làm mạch in lun. hãy dung XTAL 4MHz, 2 tu 15p. Đảm bảo sẽ chạy tốt.
CHào bạn , chúc bạn có kết quả tốt!

Ừ cám ơn bạn, sau một hồi suy nghĩ cuối cùng chỉ còn nghi vấn là cái mạch testboard thôi. Mình quyết định làm mạch in luôn. Ngồi xử lý ba cái lỗi vớ vẩn này mất thời gian quá. Hên xui thôi, hi vọng hắn sẽ chạy. Thanks mọi người nhiều.

hopeman
01-06-2009, 10:47 AM
tại sao bạn lại ko post mạch phần cứng lên đây để mọi người xem sao?
bạn đã nối trở treo cho chân reset chưa?

chaulongfight
06-06-2009, 11:48 PM
chào mọi người, thật là có lỗi quá. Mấy bữa nay mình bận thi nên quên việc ghé diễn đàn mất. Cái mạch mình sau khi làm mạch in đã chạy phần số khá tốt, hiển thị LCD và chạy chữ đã ok rồi. Còn phần tương tự vài bữa xem sao, sai thì chỉnh lại. Cảm ơn mọi người đã giúp đỡ và góp ý cho mình.