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)
-   -   Hỏi cách ghép nối pic và ic thời gian thực ds12887 (http://www.picvietnam.com/forum/showthread.php?t=3291)

lequocbao 12-12-2008 04:47 PM

Hỏi cách ghép nối pic và ic thời gian thực ds12887
 
Mình đang làm 01 ứng dụng có liên quan đến thời gian thực nhưng không biết tí gì về con RTC ds12887.Bạn nào có tài liệu ghép nối giữa pic6f877a và RTC thì cho mình với.Cảm ơn trước nha!

namqn 12-12-2008 05:49 PM

Trích:

Nguyên văn bởi lequocbao (Post 21345)
Mình đang làm 01 ứng dụng có liên quan đến thời gian thực nhưng không biết tí gì về con RTC ds12887.Bạn nào có tài liệu ghép nối giữa pic6f877a và RTC thì cho mình với.Cảm ơn trước nha!

Đọc datasheet của DS12887 (link ở đây:
http://datasheets.maxim-ic.com/en/ds...-DS12C887A.pdf) cho thấy chip này giao tiếp kiểu byte, với địa chỉ và dữ liệu được dồn kênh vào các chân AD0..AD7. Do đó, cần một port 8-bit của PIC để nối vào các chân này. Ngoài ra, các chân dùng cho mục đích giao tiếp gồm có: CS, AS, DS, R/W (đây là những chân bắt buộc phải kết nối với PIC). Những chân giao tiếp còn lại là tùy chọn (xem datasheet về thông tin chi tiết). Tất nhiên các chân nguồn cần được nối, và chú ý chân VBAT (xem datasheet).

Thân,

lequocbao 13-12-2008 02:26 PM

Chà! ngoài con ds12887 này ra mình còn con RTC nào khác không anh Namqn(càng ít chân càng tốt)?vì pic em còn dư có 1 port (8 pins) ah!vậy là không đủ để giao tiếp rồi!

namqn 13-12-2008 04:00 PM

Trích:

Nguyên văn bởi lequocbao (Post 21362)
Chà! ngoài con ds12887 này ra mình còn con RTC nào khác không anh Namqn(càng ít chân càng tốt)?vì pic em còn dư có 1 port (8 pins) ah!vậy là không đủ để giao tiếp rồi!

Có khá nhiều RTC giao tiếp với vi điều khiển bằng các giao thức nối tiếp. Chẳng hạn, DS1307 dùng giao thức I2C, đã được giới thiệu trong tutotial 4 cho dsPIC của tôi. Bạn có thể tham khảo thông tin về DS1307 trong tài liệu đó.

Thân,

lequocbao 15-12-2008 10:59 AM

Em đã chọn dùng con ds1307 r (chỉ có 8 chân thôi hì hì).Cảm ơn anh Namqn nhiều!
Nhưng anh cho em hỏi là ds1307 chỉ cho nhập xuất dữ liệu dạng mã BCD, mà mã BCD là như vậy phải không anh?
vd:
số 0(decimal):00000000
số 1 :00000001
số 2 :00000010
số 3 :00000011
số 4 :00000100
số 5 :00000101
số 6 :00000110
số 7 :00000111
số 8 :00001000
số 9 :00001001

nếu đúng thì mình có cách nào chuyển thành số decimal không?tại vì em đang xử lý dữ liệu trong pic bằng số decimal.

namqn 15-12-2008 04:52 PM

Trích:

Nguyên văn bởi lequocbao (Post 21392)
Em đã chọn dùng con ds1307 r (chỉ có 8 chân thôi hì hì).Cảm ơn anh Namqn nhiều!
Nhưng anh cho em hỏi là ds1307 chỉ cho nhập xuất dữ liệu dạng mã BCD, mà mã BCD là như vậy phải không anh?
vd:
số 0(decimal):00000000
số 1 :00000001
số 2 :00000010
số 3 :00000011
số 4 :00000100
số 5 :00000101
số 6 :00000110
số 7 :00000111
số 8 :00001000
số 9 :00001001

nếu đúng thì mình có cách nào chuyển thành số decimal không?tại vì em đang xử lý dữ liệu trong pic bằng số decimal.

Số BCD thì mã hóa như vậy là đúng rồi. 4 bit cho một chữ số thập phân, chẳng hạn, 99 sẽ có mã BCD là '10011001'.

Dữ liệu trong vi điều khiển được lưu ở dạng nhị phân. Không rõ bạn lưu dữ liệu và xử lý bằng số decimal như thế nào, và thực tế bạn thực hiện những phép toán gì?

Thân,

lequocbao 16-12-2008 12:38 PM

Thì các biến em đều khai báo là int8,gán giá trị cho biến là các số thập phân và thực hiện các phép toán +,- ,so sánh bình thường.

namqn 16-12-2008 04:33 PM

Trích:

Nguyên văn bởi lequocbao (Post 21422)
Thì các biến em đều khai báo là int8,gán giá trị cho biến là các số thập phân và thực hiện các phép toán +,- ,so sánh bình thường.

Nếu vậy bạn chỉ cần chuyển mã BCD về nhị phân thôi. Các giá trị trong mã nhị phân, thập phân, hay thập lục phân đều như nhau, chỉ có cách biểu diễn (đối với con người) là khác nhau thôi. Tức là, giá trị 11 trong mã nhị phân, thập phân, hay thập lục phân đều vẫn là 11, chỉ khác là được viết thành '00001011' trong mã nhị phân, '11' trong mã thập phân, và 'B' trong mã thập lục phân (để cho thuận tiện khi viết).

Thân,

lequocbao 16-12-2008 05:19 PM

Như vậy với lệnh:
x=0b00001010;
if (x=0xa);
thì kết quả vẫn là true đúng không anh?

và khi em nhận 01 byte dữ liệu từ ds1307 vào pic và byte đó được lưu tạm thời trong biến có kiểu là int8 thì mặc nhiện byte dữ liệu đó đang được biểu diễn dưới dạng nhị phân đúng không anh?
vd:
ds1307 truyền đi số 10 (mã BCD) là:00000001(MSB đi đầu - chổ này e không chắc có đúng không nữa,nếu sai anh góp ý giúp e nha!).
nhưng khi pic lần lượt nhận vào sẽ là:10000000(binary) sẽ có giá trị là 128 thập phân.
Em hiểu như vậy có đúng không?




anh Namqn ơi! 11 thập phân là 00001011b chứ đâu phải là 00010011b đâu anh!hì hì...

namqn 16-12-2008 05:49 PM

Trích:

Nguyên văn bởi lequocbao (Post 21430)
Như vậy với lệnh:
x=0b00001010;
if (x=0xa);
thì kết quả vẫn là true đúng không anh?

và khi em nhận 01 byte dữ liệu từ ds1307 vào pic và byte đó được lưu tạm thời trong biến có kiểu là int8 thì mặc nhiện byte dữ liệu đó đang được biểu diễn dưới dạng nhị phân đúng không anh?
vd:
ds1307 truyền đi số 10 (mã BCD) là:00000001(MSB đi đầu - chổ này e không chắc có đúng không nữa,nếu sai anh góp ý giúp e nha!).
nhưng khi pic lần lượt nhận vào sẽ là:10000000(binary) sẽ có giá trị là 128 thập phân.
Em hiểu như vậy có đúng không?




anh Namqn ơi! 11 thập phân là 00001011b chứ đâu phải là 00010011b đâu anh!hì hì...

Câu hỏi đầu tiên của bạn: đúng.

Byte nhận về từ DS1307 có dạng số BCD, bạn lưu vào biến int8 thì nó vẫn số BCD.

Bạn chưa cần quan tâm đến việc truyền dữ liệu nối tiếp ra sao. Chỉ cần hiểu nếu DS1307 trả về giá trị 10 (BCD) thì bạn sẽ nhận được giá trị 10 (BCD) trong PIC (giả thiết bạn đang dùng module I2C của PIC).

Tôi đã viết nhầm 11 thập phân là 00010011 trước đó, đã sửa lại như bạn chỉ ra.

Thân,

lequocbao 16-12-2008 06:22 PM

Đúng là em đang dùng modul i2c để giao tiếp pic16f877a với ds1307.
Đồng ý là ds1307 trả về số 10(BCD) và chắc chắn pic sẽ nhận được số 10(BCD)
Cái em muốn hiểu là số 10(BCD) như ví dụ trên sau khi được lưu vào biến trong pic thì khi đó bản thân vđk pic sẽ hiểu cái giá trị thực sự trong biến là bao nhiêu?10 hay 128 thập phân?
vì em cần xử lý +,- so sánh ...biến đó với các giá trị thập phân có sẳn trong pic anh ah!

namqn 16-12-2008 06:49 PM

Trích:

Nguyên văn bởi lequocbao (Post 21433)
Đúng là em đang dùng modul i2c để giao tiếp pic16f877a với ds1307.
Đồng ý là ds1307 trả về số 10(BCD) và chắc chắn pic sẽ nhận được số 10(BCD)
Cái em muốn hiểu là số 10(BCD) như ví dụ trên sau khi được lưu vào biến trong pic thì khi đó bản thân vđk pic sẽ hiểu cái giá trị thực sự trong biến là bao nhiêu?10 hay 128 thập phân?
vì em cần xử lý +,- so sánh ...biến đó với các giá trị thập phân có sẳn trong pic anh ah!

Số 10 (BCD) được biểu diễn là '00010000' trong mã nhị phân, hay 0x10 trong mã thập lục phân, hay 16 trong mã thập phân.

Như tôi đã nói trước đó (post #8), bạn chỉ cần chuyển các số BCD thành dạng nhị phân trước khi tính toán, so sánh với các hàm có sẵn. Hoặc bạn có thể tự viết các hàm tính toán, so sánh số BCD, và không cần chuyển dạng thành nhị phân.

Thân,

lequocbao 18-12-2008 12:22 PM

Đã hiểu vấn đề, em cảm ơn anh Namqn nhiều!


Múi giờ GMT. Hiện tại là 09:50 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