PDA

View Full Version : em mới học PIC, có một Project, nhờ các bác định hướng giúp!


chimchichchoe
12-11-2006, 04:20 AM
Em mới học PIC được mấy bữa thôi, nhưng phải làm cái project này.
Lão thầy nói là dùng PIC16F84(A), sau đây là yêu cầu của cái em cần làm

Thiết kế một mạch, input 5V, còn output bình thường là 0V (24h/24h thứ 2 đến thứ 7, và 23h/24h của ngày chủ nhật ), có điều trong khoảng thời gian 1h còn lại nào đó của ngày chủ nhật (ví dụ từ 10h sáng đến 11h sáng) thì output ko còn là 0V nữa. Oái oăm ở chỗ, trong một giờ đó (10h sáng đến 11h sáng) nó không là constant (không always 5V), mà là cứ 10 phút, thì có 2 phút 5V, 8 phút còn lại 0V, cứ thế 2 phút 5V, 8 phút 0V.... trong 1h.

Em chỉ mới đọc qua 3 bài giảng của anh Nguyễn Trung Chính, + vài bài giới thiệu của bác Falleaf thấy rất là hay và dễ hiểu, có điều, không biết làm thế nào để design cái đó được (dùng delay thì chuối quá), còn dùng cái khác thì em chưa học tới.

Các bác có thể cho em một định hướng để giải quyết vấn đề này được không, em xin cảm ơn nhiều.

Có điều này em cũng lưu ý, sau khi thiết kế xong rồi, cái mạch được designed đó đặt ngoài trời, được nuôi bởi nguồn DC, hoạt động một cách tự động từ tuần này sang tuần khác, tháng này sang tháng khác, trong khi những gì em biết về PIC thì phải kết nối với computer thì mới hoạt động được. Chẳng biết sao nữa.

Em xin gửi lời cảm ơn chân thành đến bác Falleaf cũng như những người nuôi dưỡng forum này, vì đã tạo ra một nguồn kiến thức rất bổ ích cho những ai yêu thích electronics.

bien_van_khat
12-11-2006, 12:38 PM
trong khi những gì em biết về PIC thì phải kết nối với computer thì mới hoạt động được

Bạn hiêu sai chỗ này ròi, đọc lại đi, nó là vi điêu khiển, thi dĩ nhiên phải chạy độc lập được chứ.

Thiết kế một mạch, input 5V, còn output bình thường là 0V (24h/24h thứ 2 đến thứ 7, và 23h/24h của ngày chủ nhật ), có điều trong khoảng thời gian 1h còn lại nào đó của ngày chủ nhật (ví dụ từ 10h sáng đến 11h sáng) thì output ko còn là 0V nữa. Oái oăm ở chỗ, trong một giờ đó (10h sáng đến 11h sáng) nó không là constant (không always 5V), mà là cứ 10 phút, thì có 2 phút 5V, 8 phút còn lại 0V, cứ thế 2 phút 5V, 8 phút 0V.... trong 1h.


Vấn đề của bạn ở đây là xác định thơi gian, cách đơn giản nhất là dùng timer của pic, nhưng cách này ko hay vì:
* khó đê có được thời gian chính xác
* ko có khả năng nhớ được thơi gian khi bị mất nguồn nuôi, trong khi hệ thống của bạn yêu cầu hoạt động độc lập
Vậy theo tớ, tốt nhất là dùng thêm 1 chip đông hô thơi gian thực có nguồn nuôi sẵn như ds12887 (khoảng 60K thi phai) hoặc ds1307 + 1 cục pin backup. VDK thi tùy bạn nhưng nên dùng 16F877A thì đơn giản hơn, còn vì sao thi bạn đọc datasheet, ko nên dùng 84A vi con này chẳng có gi, mà lại khó mua.

Trên diễn đàn đã có tut về con 12887 rồi, bạn nên tìm lại.

chimchichchoe
12-11-2006, 07:10 PM
Xin cảm ơn anh bien_van_khat rất nhiều.
* ko có khả năng nhớ được thơi gian khi bị mất nguồn nuôi, trong khi hệ thống của bạn yêu cầu hoạt động độc lập
vấn đề này thì không có gì phải lo, em định dùng một solar panel để sạc cho một rechareable battery. Battery này có dung lượng khá cao 4.5Ah, nên vấn đề nguồn nuôi theo em có thể giải quyết được, còn làm sao dùng timer của PIC, em vẫn chưa biết đến, anh có thể cho em xin link dẫn đến bài viết đó được không ?

Em đã xem sơ qua datasheet của ds12887 rồi, thấy có vẻ khả quan, em sẽ bắt đầu nghiên cứu loại này xem sao.

once again, thank you very much :)

namqn: Không nên gọi là "lão thầy"! Người Việt nam vốn tôn sư trọng đạo.

bien_van_khat
12-11-2006, 10:21 PM
vấn đề này thì không có gì phải lo, em định dùng một solar panel để sạc cho một rechareable battery

Vấn đề ko phải ở cái nguồn mà là ở nó ko thể lưu được thời gian lại, có nghĩa nếu vì bất cứ lý do gì, hệ thống của bạn mất nguồn thì bắt buộc bạn phải điều chỉnh lại thời gian, vô cùng bất tiện. Dùng RTC là đơn giản nhất.

còn làm sao dùng timer của PIC, em vẫn chưa biết đến, anh có thể cho em xin link dẫn đến bài viết đó được không

Ờ, cái này tớ pó tay, vì hix... bro nào trong diễn đàn biết thì chỉ cho cậu ấy nhé :D

chimchichchoe
12-11-2006, 11:39 PM
đại ca ơi em không biết RTC là gì hết. Vả lại trên diễn đàn có tut về dsPIC chẳng biết đó có phải là tut cho ds12887 hay không nữa.

Đại ca có thể trình bày sơ lược cách làm cho cái design đó hoạt động ngoài trời được không ? Em chẳng biết phải bắt đầu như thế nào mới làm cho nó hoạt động ngoài trời cả.

Thanks đại ca nhiều ^:)^

bien_van_khat
13-11-2006, 12:04 AM
RTC: Real Time Clock, nghe nói đọc datasheet rồi nên tớ nghĩ cậu biết từ này ròi.

Hoạt động ngoài trời? Bạn phải phân tích từ yêu cầu thực tế thành yêu cầu kỹ thuật chứ. Hệ thống của bạn hoạt động trong điều kiện nào? Yêu cầu là gì? Có yêu cầu nào đặc biệt hay phải chịu những tác động đặc biệt nào ? Nói chung đó đại loại là ~ câu hỏi mà tớ nghĩ bạn phải tự đặt ra để giải quyết. Tớ chỉ có thể cho bạn thấy với 1 yêu cầu cụ thể nào đó, theo tớ thì nên làm thế nào mà thôi.

Về vấn đề tài liệu, nhìn chung datasheet là đầy đủ nhất rồi. Hầu hết mọi trường hợp chỉ cần datasheet là bạn có đủ thông tin. Và cũng nói luôn, làm với con 12887 thì dễ òm, bạn cứ coi rồi sẽ thấy. Còn tut thì tớ chắc chắn có vì có lần thấy đâu đó, bạn nào biết thì link cho cậu ấy cái.

Cuối cùng nếu chưa biết về PIC thì bạn nên chịu khó bỏ vài ngày làm quen với nó trước thì hơn.

chimchichchoe
13-11-2006, 11:52 AM
hơ, em coi sơ qua cái datasheet của ds12c887 rồi, cái tutorial của anh Nguyễn Trung Chính về real time clock cũng coi rồi, thấy hay quá, hiểu sơ sơ và có một số thắc mắc sau đây, nhờ anh chỉ dẫn hộ.

Trong cái address location của ds12c887, address 0x02 chỉ phút, address 0x04 chỉ giờ, 0x06 chỉ ngày trong tuần. Vậy nếu lúc bắt đầu program, em khai báo biến chẳng hạn

min EQU 0x02
hour EQU 0x04
day EQU 0x06
....

thì các biến min, hour, day đó có mang giá trị phút, giờ, ngày trong cái ds12c887 đó không ?

Trong cái tutorial đó, dùng Pic16f887a để đọc, ghi dữ liệu lên ds12c887, còn trong cái chương trình của em, em thấy chỉ cần dùng 1 cái ds đó là đủ, không biết chỉ dùng một cái có được không.

Còn cái clock bên trong cái ds12c887, em không hiểu nó chạy như thế nào, chẳng lẽ lúc chế tạo ra cái đó, người ta làm cho nó chạy cùng thời gian với bên ngoài ??? Chẳng hạn như bây giờ là 04:55 thi` trong đó cũng là 04:55 hay sao.

Xin lỗi anh vì em hỏi hơi nhiều, nhưng chẳng biết hỏi ai nữa cả.

Đội ơn anh lắm lắm :)

bien_van_khat
13-11-2006, 02:55 PM
Trong cái address location của ds12c887, address 0x02 chỉ phút, address 0x04 chỉ giờ, 0x06 chỉ ngày trong tuần. Vậy nếu lúc bắt đầu program, em khai báo biến chẳng hạn

min EQU 0x02
hour EQU 0x04
day EQU 0x06

tất nhiên là ko ròi, vì khi bạn khai báo như thế thì các biến đó nằm trong ram của PIC chứ đâu có liên quan gì tới con RTC. Nếu muốn lấy được giá trị đó bạn còn phải "hỏi" nó nữa.


Trong cái tutorial đó, dùng Pic16f887a để đọc, ghi dữ liệu lên ds12c887, còn trong cái chương trình của em, em thấy chỉ cần dùng 1 cái ds đó là đủ, không biết chỉ dùng một cái có được không.

Tớ ko hiểu câu này

Còn cái clock bên trong cái ds12c887, em không hiểu nó chạy như thế nào, chẳng lẽ lúc chế tạo ra cái đó, người ta làm cho nó chạy cùng thời gian với bên ngoài ??? Chẳng hạn như bây giờ là 04:55 thi` trong đó cũng là 04:55 hay sao.

không phải thế, chỉ khi nào bạn cấp nguồn cho nó lần đầu tiên thì nó thật sự mới bắt đầu chạy. Có nghĩa là ngay sau lần cấp nguồn hợp lý đầu tiên, con 12887 sẽ bắt đầu đếm giờ từ đó, tuy nhiên giá trị bắt đầu là nhiêu thì tớ ko rõ và ko quan trọng. Bới vì bạn phải điều chỉnh giá trị đầu tiên đó cho hợp lý. Kể từ đó cho dù nguồn nuôi ngoài có bị mất thì nó vẫn tiếp tục đếm giờ hoàn toàn độc lập.

chimchichchoe
14-11-2006, 12:00 AM
Trích:
Trong cái address location của ds12c887, address 0x02 chỉ phút, address 0x04 chỉ giờ, 0x06 chỉ ngày trong tuần. Vậy nếu lúc bắt đầu program, em khai báo biến chẳng hạn

min EQU 0x02
hour EQU 0x04
day EQU 0x06

tất nhiên là ko ròi, vì khi bạn khai báo như thế thì các biến đó nằm trong ram của PIC chứ đâu có liên quan gì tới con RTC. Nếu muốn lấy được giá trị đó bạn còn phải "hỏi" nó nữa.


Trích:
Trong cái tutorial đó, dùng Pic16f887a để đọc, ghi dữ liệu lên ds12c887, còn trong cái chương trình của em, em thấy chỉ cần dùng 1 cái ds đó là đủ, không biết chỉ dùng một cái có được không.

Tớ ko hiểu câu này

ý của em lả không dùng cái PIC nào cả, chỉ dùng và lập trình cho mỗi con ds12c887 thôi, không biết có được không,bởi vì em thấy cái project của em cũng đơn giản, chỉ cần 3 biến "phút", "giờ", "ngày", vả lại cũng không cần phải đọc hay viết dữ liệu gì rối rắm như trong chương trình của anh NTC nên thiết nghĩ chỉ cần 3 biến này hướng đến cái địa chỉ second, hour, day of week trong memory location là được(Em có hỏi câu nào ngu quá thì cũng mong anh lượng thứ, hix hix)


;--------------------------------------------------------
; can chu y doan chuong trinh duoi day
; do chua trang bi chua nang dieu chinh ngay thang nam
; nen tam them doan chuong trinh nay vao de dieu chinh
; khi cho dong ho hoat dong lau dai, can bo doan code nay di
; vi neu mach bi reset, doan chuong trinh nay duoc thuc thi
; khi do, thoi gian hien thi khong con dung nua
;----------------------------------------------------------
hello
MOVLW d'10' ; kiem tra dieu kien de thao tac len
; cac thanh ghi chua gia tri thoi gian thuc
MOVWF ADDRESS_R ; thuc chat la kiem tra trng thai bit UIP
CALL read_12C887 ; xem lai chuc nang cua bit UIP
BTFSC DATA_R,7
GOTO hello
MOVLW d'23' ; Khoi tao cac gia tri thoi gian cho DS12C887
MOVWF DATA_W ; ngay 23
MOVLW d'7'
MOVWF ADDRESS_W
CALL write_12C887
MOVLW d'3' ; thang 3
MOVWF DATA_W
MOVLW d'8'
MOVWF ADDRESS_W
CALL write_12C887
;--------------------------------------------------------------------------------


ở trong cái tut của anh NTC em có thấy đoạn này, đoạn này dùng để khởi tạo thời gian cho cái ds12c887 được phải không anh ???

namqn
14-11-2006, 12:50 AM
ý của em lả không dùng cái PIC nào cả, chỉ dùng và lập trình cho mỗi con ds12c887 thôi, không biết có được không,bởi vì em thấy cái project của em cũng đơn giản, chỉ cần 3 iến "phút", "giờ", "ngày", vả lại cũng không cần phải đọc hay viết dữ liệu gì rối rắm như trong chương trình của anh NTC nên thiết nghĩ chỉ cần 3 biến này hướng đến cái địa chỉ second, hour, day of week trong memory location là được(Em có hỏi câu nào ngu quá thì cũng mong anh lượng thứ, hix hix)
Đề bài có yêu cầu điều khiển theo thời gian thực, DS12C887 chỉ là chip đồng hồ thời gian thực, nếu không có PIC thì điều khiển các ngõ ra bằng cách nào?

ở trong cái tut của anh NTC em có thấy đoạn này, đoạn này dùng để khởi tạo thời gian cho cái ds12c887 được phải không anh ???
Dùng được, nhưng nếu không có PIC thì nạp code vào đâu?

Thân,

hanspkt
14-11-2006, 09:52 PM
xin chào các bác
các bác cho em hỏi: dùng thạch anh càng lớn thì tốc độ thực hiện càng nhanh có phải không ạ? Sao em dùng thạch anh 20Mhz gắn vào thì nó chạy rất chậm (cùng một chương trình.asm) so với thạch anh 4Mhz
cám ơn!

bien_van_khat
14-11-2006, 10:42 PM
Biểu hiện gì khiến bạn nghĩ nó chạy chậm

namqn
14-11-2006, 11:49 PM
xin chào các bác
các bác cho em hỏi: dùng thạch anh càng lớn thì tốc độ thực hiện càng nhanh có phải không ạ? Sao em dùng thạch anh 20Mhz gắn vào thì nó chạy rất chậm (cùng một chương trình.asm) so với thạch anh 4Mhz
cám ơn!
Về lý thuyết là như vậy, nhưng trên thực tế nhiều bạn không chú ý đến chế độ làm việc của mạch dao động (đặc biệt các mạch dao động trong PIC). Để dùng với thạch anh từ 200 kHz đến 4 MHz, bộ dao động nên làm việc ở mode XT, để dùng với thạch anh từ 4 MHz đến 20 MHz, bộ dao động nên làm việc ở mode HS (tham khảo từ datasheet của PIC16F87xA). Nếu bạn giữ nguyên mode XT như khi làm việc với thạch anh 4 MHz, nhưng lại cho PIC chạy với thạch anh 20 MHz, thì bộ dao động sẽ không có đủ công suất để kích thích cho thạch anh dao động ở đúng tần số thiết kế (là 20 MHz), mà thạch anh sẽ dao động ở một tần số nào đó thấp hơn tần số thiết kế nhiều lần. Ngẫu nhiên là bạn nhận thấy khi chạy với thạch anh 20 MHz thì chậm hơn so với khi chạy với thạch anh 4 MHz.

Thân,

bien_van_khat
15-11-2006, 02:09 PM
Nếu bạn giữ nguyên mode XT như khi làm việc với thạch anh 4 MHz, nhưng lại cho PIC chạy với thạch anh 20 MHz, thì bộ dao động sẽ không có đủ công suất để kích thích cho thạch anh dao động ở đúng tần số thiết kế (là 20 MHz), mà thạch anh sẽ dao động ở một tần số nào đó thấp hơn tần số thiết kế nhiều lần. Ngẫu nhiên là bạn nhận thấy khi chạy với thạch anh 20 MHz thì chậm hơn so với khi chạy với thạch anh 4 MHz.


Em ko nghĩ thế, vì trong mạch dao động, thạch anh làm nhiệm vụ lọc tín hiệu hồi tiếp dương, như vậy nếu hệ số khuyếch đại của bộ dao động ko đủ lớn thì mạch sẽ ko dao động, PIC ko chạy chứ ko thể chạy ở tốc độ thấp được.

Vấn đề mà bạn kia hỏi em nghĩ mấu chốt ở từ "chậm" của cậu ấy có nghĩa như thế nào.

ntc
16-11-2006, 12:37 PM
ở trong cái tut của anh NTC em có thấy đoạn này, đoạn này dùng để khởi tạo thời gian cho cái ds12c887 được phải không anh ???

Thì anh đã chú thích rất rõ rồi còn gì nữa.

Nói chung là, đọc những câu hỏi của em, thấy em hấp tấp, chưa suy nghĩ và đọc hiểu cho kĩ càng. Bây giờ em cứ bình tĩnh lại, uống li cà phê, từ từ, vừa đọc, vừa nghiền ngẫm cho thật kĩ, tìm hiểu cho rõ ràng các vấn đề. Sau đó có chỗ nào thắc mắc, thì mới hỏi.

:)

PS:
Anh Nam cũng đã nhắc nhở rồi, tuy nhiên anh cũng phải nhắc nhở laị, em cần sửa chữa lại từ ngữ và tư duy của em khi sử dụng từ "lão thầy".