Đồng hồ số dùng DS1307
Mình có làm 1 đồng hồ số dùng Pic 18f458 , kết nối DS1307 qua i2c . hiển thị trên lcd . mình đã làm cho chạy , nhưng lại hiển thị không đúng kết quả . anh em nào đã từng làm cái này rồi thì giúp mình nha . Lỗi cụ thể như sau ;
- mình nhập giá trị ban đầu : $00,$00,$00,$07,$1B,$01,$07,$90 ' Sec Min Hr Day D M Y Control giây(sec) : 00 phút(min) : 00 giờ (hr) : 00 thứ (Day) : 7. ngày (D) : 27 tháng(M) : 1 năm(y):7 lcd hiển thị như sau : thu 7 27-1-7 0:0:0 h m s mình nhập vào DS1307 thì ok . đọc ra thì cũng ok luôn . nhưng khi bắt đầu đếm . thì con số s chỉ đếm đến 9 thôi , rồi lại nhảy thành số 16 . ngay cả con m và con h cũng vậy . Khi mình nhẩm tính thì đúng là con s nhảy 60 lần thì con m nhảy 1 lần . nhưng hiển thị thì không đúng . có khi con s lên đến hàng 80 luôn . Mình nghĩ chắc từ số 9 con DS1307 đã bỏ qua A , B , C , D , E , F để đếm đến 16 . Nhưng tại sao lại như vậy ? làm sao đế cho hiển thị đúng ? Và khi nạp lần đầu cho con Ds , thì mình nên để giá trị là gì ? thập phân hay nhị phân hay hệ 16 ? . khi mình đọc ra là số gì ? mong bạn nào rành thì giúp mình nha . mình vô cùng cảm ơn . À, còn 1 điều nữa . mình có cần phải đọc ghi theo thứ tự không ? và nếu có thì mình phải đọc cái gì trước , cái gì sau ? ghi cái gì trước , cái gì sau ? |
Cha`o ban,
Ban co' bao gio nghe noi den chuan BCD chua? (Binary coded decimal). Con IC cua ban dung cai BCD do'. Khi no de^'m tu 09 xong len den 10 roi 11...12.. giong nhu dem so^' binh thuong thoi. Neu doc ra 10 tuc la so^' muo*i, ma ban lai nghi~ la hex, thi luc do' ban se doi ra la 16. la se bi. sai lien. byte hr, byte StrHH[3] = {0}; rtc_get_time(hr, min, sec); g_StrHH[0] = (char) (hr/16 + 0x30); g_StrHH[1] = (char) (hr%16 + 0x30); lcd_display_string(StrHH); ban hay tham khao doan ma tren, hy vong se giup duoc ma. VNBTECH. |
Trích:
|
chao ban,
BCD uses 4 binary bits to encode each decimal digit. Vi' du. la: ban muon dua du lieu ngay 27 vao trong con IC, thi ban phai dung 0x27, chung khong phai la 0x1B. 0x1B la sai roi, khong phai la ngay 27 theo chuan BCD dau. Vi' du ban dung thong tin sau de "initialize" con timer IC: gia^y : 45 second Phut : 37 phu't Gio : 8 gio. Thi ban phai dung cai data sau day de dua vao : 0x45, 0x37, 0x08 sau khi dua vao, gia su*? 50 giay sau, ba.n doc cai thoi gio tu con IC, luc no' con IC se cho ban data sau: Giay = 0x35 Phut = 0x38 Gio = 0x08 Neu ban muon hien thi. tren LCD cho du'ng thi ban phai doi ra nhu sau: char second_digit1, second_digit2; second_digit2 = (Giay / 0x10) + '0' = (0x35 / 0x10) + 0x30 = 0x33 second_digit1 = (Giay % 0x10) + '0' = (0x35 % 0x10) + 0x30 = 0x35 roi ban co' the display giong nhu display character: lcd_display_char(second_digit2); lcd_display_char(second_digit1); Ban cu lam nhu vay, minh tin chac ban se da.p duoc yeu cau. Neu ban co' thac mac gi, thi cu hoi tiep nhe'. VNBTECH |
Cảm ơn các bạn đã quan tâm . hôm nay mình đã làm được rồi . cái con số mình nhập vào DS không qua trọng . là kiểu dữ liệu gi cũng ok , hex hoặc decimal . nhưng quan trọng là lúc đọc ra . mình phải chuyển số đó sang hex , rồi xuất thẳng ra LCD luôn . bây giờ thì ok rồi . nhưng mình còn chưa biết cái vụ AM và PM . lại còn năm nhuận hay không nhuận để mà biết tự cộng thêm ngày cho tháng 2 . nếu các bạn biết , mình mong các bạn chia sẻ nha .
a, mà lúc mình nạp lần đầu , mình nạp thẳng số hex luôn . vd : năm : $07 tháng : $01 ngày : $28 giờ : $13 phút : $25 giây : $00 tương ứng khi xuất ra LCD là : 28 - 01 - 07 13:25:00 namqn: đây đâu phải là số hex, nó vẫn là dạng BCD đó chứ. Bạn thử nạp $0F vào ô nhớ đếm năm rồi đọc lại xem sẽ được số nào. |
Trích:
Bạn chịu khó đọc datasheet đi. Thân, |
Trích:
|
Bài thực hành
2 Attachment(s)
sẵn tiện đây mình đưa lên diễn đàn đề tài đồng hồ số dùng DS1307 mà mấy hôm nay mình nghiên cứu , học hỏi kinh nghiệm của anh em .
Đề tài dùng ngôn ngữ Picbasic pro . pic 18f458 kết nối I2c với DS1307 .bạn thông cảm , mình chưa rành về Proteus cho lắm nên cũng chưa biết con xtal và pin backup ở đâu . nên đành thay 2 con đó bằng 2 con điện trở .:o . Sơ đồ kết nối như sau : 1\dành cho lcd : portb từ b.4 đến b.7 kết nối từ D4 đến D7 của lcd portb.1 >> rs portb.2 >>rw portb.3 >>e 2\ dành cho DS1307 : porta.0 >> sda porta.1 >> sc 3\ dành cho các nú bấm : portc.0 >> nút nạp dữ liệu vào DS portc.1 >> nút vào chương trình cài ngày giờ portc.2 , portc.3 >> tương ứng với nút giảm , tăng dữ liệu . các bạn xem file đính kèm sẽ rõ nha . nếu có thắc mắc , hãy liên hệ mình . h_a_tuan2002@yahoo.com đây là phần mềm cho con pic . mình mới làm quen nên chắc sẽ có nhiều sai sót . nếu có gì mong anh em giúp đỡ mình hoàn thiện phần mềm nha . cảm ơn nhiều . |
Trích:
|
Trích:
chào bạn . |
Bạn đã xin ý kiến những ai đã từng làm với DS1307, nhưng những người góp ý lại không được bạn hoan nghênh. Tôi đã viết tutorial cho dsPIC sử dụng DS1307, cũng đã viết tutorial cho dsPIC sử LCD, nghĩa là tôi không lạ lẫm gì với những thứ này.
Lời khuyên của tôi là bạn đọc kỹ datasheet, chỗ nào không hiểu thì hãy hỏi, như vậy bạn sẽ nắm được nó rõ hơn. Bạn chưa hiểu rõ về số BCD thì làm sao phân biệt được nó với số hex, như vậy làm sao có thể khẳng định là nạp số BCD và số hex đều được (tôi giả sử bạn ngụ ý là đều cho giá trị đúng). BCD là binary-coded decimal, nghĩa là số thập phân mã hóa bằng nhị phân, mỗi chữ số nhị phân sẽ dùng 4 bit để mã hóa, như vậy các tổ hợp cho các giá trị A, B, C, D, E, và F sẽ không được dùng. Số thập phân 10 có mã hex là 0x0A, và mã BCD là 0x10. Bạn thử nạp 0x0A và 0x10 xem có ghi được cùng kết quả vào một thanh ghi nào đó của DS1307 hay không? Thân, |
Trích:
Còn về các tên gọi của hệ thống số đếm . có thể mình đã nắm không rõ . nhưng chắc chắn mình đã nạp cho con DS1307 , phần giờ những loại số sau : ví dụ , nạp số 10 - tương ứng là 10 giờ $10 - hex %00010000 - Binary 16 - decimal thì con DS khi đọc ra vẫn là 10 h . với điều kiện phải chuyển con số vừa đọc từ DS sang Hex rồi mới xuất ra LCD . Để tương thích với lcd . nếu không thì LCD sẽ hiển thị 1 con số khác ( chuyện này mình cũng đã từng nói ). Việc này mình đã thử đi , thử lại nhiều lần . Và như mình ĐÃ nói . mọi vấn đề mấy hôm nay mình hỏi đều đã được giải quyết xong , bởi vậy , chúng ta không nên bàn cãi thêm về các con số , tên gọi của chúng nữa mà làm gì .. Mình cũng đã đưa đề tài đó lên để anh em , những người mới chưa biết gì về pic và RTC có thêm thông tin để tham khảo . bài thực hành này mình đã làm với ngôn ngữ PICBASIC PRO . . |
anh HaTuan,
Co' the anh lam du'ng nhung ca'ch goi cua anh bi. lan lo^.n. Ta ca nhung gi anh chuyen de nap co con DS1300 va doc no ra the hien thi, la theo chuan BCD het. May ban trong nay chi? mong anh hieu ro va dung co' lan lon giua HEX/DEC and BCD.... chuc mung anh da lam duoc. VNBTECH |
cảm ơn bạn VNBTECH về lời khuyên . thực sự mình đã học hỏi rất nhiều từ diễn đàn này . . nếu có thời gian . mong bạn góp ý cho bài thực hành của mình nha .
|
Trích:
Bạn đã từng tiếp xúc với RTC DS12887 cũng của Dallas chưa? trong thanh ghi chức năng của nó có một bit cho phép ta chọn dạng số nhập vào và đọc ra là BCD hay HEX đấy! phần hiển thị của bạn là LCD thì không thể có chuyện để nguyên con số đọc được đem xuất. CPU của LCD không giải mã bảng mã nào khác ngoài ASCII. Lấy ví dụ khi muốn xuất số 1 ra LCD, bạn phải đẩy số 31Hexa (số Hexa theo quan điểm của Vi điều khiển) lên LCD (số 31-ASCII theo quan điểm của LCD). Các số từ số 00Hexa đến số 99hexa (mã BCD - DS1307) được VĐK đọc (VĐK không nghĩ đó là BCD đâu nhé, đối với nó chỉ là HEXA), rồi xuất lên LCD (đối với LCD cũng vậy,chỉ có ASCII thôi). Bạn hiểu rồi chứ? |
Múi giờ GMT. Hiện tại là 10:15 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