![]() |
|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Mar 2011
Bài gửi: 17
: |
![]() void INIT_MAIN() {
// Khoi tao truyen thong I2C I2C_Init(100000); // Kích hoạt môddun truyền thông i2c với tốc độ baud là 100kHz // Khoi tao DS1307 I2C_Start(); // điều kiện start I2C_Wr(0xD0); // truyền địa chỉ của ds1307 và chọn ghi dữ liệu lên ds1307 I2C_Wr(0x00); // Truyền địa chỉ ô nhớ đầu tiên của ds1307 I2C_Wr(0x13); // Khoi tao gia tri ban dau cho thanh ghi giây I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi phút I2C_Wr(0x02); // Khoi tao gia tri ban dau cho thanh ghi giờ I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi thứ I2C_Wr(0x05); // Khoi tao gia tri ban dau cho thanh ghi ngày I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi tháng I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi năm I2C_Wr(0x90); // đặt cấu hình cho thanh ghi điều khiển, sử dụng xung 1Hz. I2C_Stop(); // Điều kiện stop } chuong trinh chinh void MAIN() { INIT_MAIN(); } Trong hàm INIT_MAIN() có đoạn khởi tạo cho ds1307 như trên. Như thế cứ mỗi lần con PIC được cấp điện lại thi đồng hồ lại bị Reset theo giá trị mình khởi tạo ban đầu cho nó. Vi Thế mỗi lần như vậy phải chỉnh lại giờ cho đồng hồ . co ai giup minh khong????????? |
![]() |
![]() |
![]() |
#2 |
Đệ tử 5 túi
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
: |
DS1307 chỉ phải khởi tạo một lần thôi, vậy nên sau đó bạn bỏ hàm INIT đi.Không để trong hàm Main nữa
|
![]() |
![]() |
![]() |
#3 |
Đệ tử 3 túi
Tham gia ngày: Jan 2010
Bài gửi: 52
: |
cái này đơn giản thôi.
đầu tiên bạn cứ nạp cho Ds1307 set giá trị chuẩn, thế là nó đã OK rồi, có cục pin nuôi rùi. sau đó bỏ dòng lệnh set đi, nạp lại lần nữa. xem sản phẩm chúc vui. |
![]() |
![]() |
![]() |
#4 |
Đệ tử 1 túi
Tham gia ngày: Mar 2011
Bài gửi: 17
: |
![]() kam on cac nhieu de minh thu xem
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 1 túi
Tham gia ngày: Mar 2011
Bài gửi: 17
: |
![]() may anh co cach nao k can xoa doan khoi tao Ds ma van k can chinh gio lai k giup voi!!!!!!
|
![]() |
![]() |
![]() |
#6 |
Đệ tử 5 túi
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
: |
Cái đoạn khởi tạo ấy không dùng làm gì cả, xóa đi là cách hay nhất bạn ơi.
|
![]() |
![]() |
![]() |
#7 |
Đệ tử 3 túi
Tham gia ngày: Apr 2011
Bài gửi: 56
: |
|
![]() |
![]() |
![]() |
#8 |
Nhập môn đệ tử
Tham gia ngày: May 2010
Bài gửi: 9
: |
mình có mấy file này bạn đọc tham khảo
|
![]() |
![]() |
![]() |
#9 |
Đệ tử 1 túi
Tham gia ngày: Mar 2011
Bài gửi: 17
: |
![]() xoa doan khoi tao nap vao chay binh thuong.Nhung tat nguon wa ngay sao cap nguon lai no laj nhay lun tung lai fai khoi tao lai thi no moi chay.minh co su dung pin cmos lam nguon nuoi rui.
Co ban noi the nay: bẫy DS : Đặt lệnh ghi vào d/c 0x08 ngay trong hàm khởi tạo DS. Trong hàm Main() thì kiểm tra lại d/c 0x08 xem có còn duy trì giá trị đó không. Nếu không còn tức là các thông số thời giờ trong DS cũng đã sai, phải cho khởi tạo lại DS. Nếu còn thì bỏ qua bước khởi tạo READ_DS(); //Đọc ds1307, có đọc X = giá trị lưu tại 0x08 (0x08 chứa 0xff) if (X != 0xff) SET_DS(); //Nếu khác 0xff thì Khởi tạo DS1307, có ghi vào 0x08 giá trị 0xff --------------------------------------------------------------------- VD: void RTC_init() { unsigned char i,RTC_flag; // dat ba^~y DS1307 RTC_flag = RTC_get(0x08); // doc gia tri tại địa chỉ 0x08 của DS1307 . if(RTCflag!=0xFF) // neu ko phai 0xFF { RTC_setdate(0x21,0x07,0x08); // thi khoi tao gia tri cho DS1307 RTC_settime(0x14,0x30,0x00); Soft_I2C_Start(); // dat cau hinh cho DS Soft_I2C_Write(RTC_ID); Soft_I2C_Write(0x07); //dat con tro tai vi tri nay Soft_I2C_Write(0x10); // tao xung 1Hz tai chan so 7. Soft_I2C_Write(0xFF); // ghi giá trị 0xFF vào ô nhớ có địa chỉ 0x08; Soft_I2C_Stop(); } } với các hàm do người dùng tự định nghĩa (nếu nắm được nguyên tắc I2C thì thật dễ dàng): unsigned char RTC_get(unsigned char addr); RTC_settime(unsigned char hh, unsigned char mm, unsigned char ss); RTC_setdate(unsigned char dd, unsigned char mm, unsigned char yy); - khi đó, trong hàm main(): void main() { // thiet lap PORT cho PIC // thiet lap gia tri cho cac thanh ghi chuc nang khac, v.v... RTC_init(); // goi ham khoi tao DS1307 - da co "trap". // cac ham khac .... while (1) { // hien thi hoac cac cong viec khac.... } } minh k hieu lam co ai giup minh voi!!!!!!!!!!!!!!!!!!!! |
![]() |
![]() |
![]() |
#10 |
Đệ tử 5 túi
Tham gia ngày: Jan 2010
Bài gửi: 96
: |
phải chi dùng thư viện DS1307. mọi chuyện sẻ đơn giản hơn..
chi cần truy xuat den các đĩa chỉ của ds1307 LÀ OK. |
![]() |
![]() |
![]() |
#11 |
Đệ tử 5 túi
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
: |
Cũng từ một số ví dụ trên internet, mình đã xây dựng đủ cảc hàm cho DS1307, bạn chỉ cần gọi hàm ra để sử dụng thôi, chú ý hàm init cũng chỉ dùng 1 lần thôi rồi xoá đi trong những lần sau nhé. Bạn có thể tham khảo cho nhanh. Oh nhưng khôgn bit add tài liệu như thế nào nhỉ?
|
![]() |
![]() |
![]() |
#12 |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
Hi all,
Mình đang gặp vấn đề với chú DS1307. Đó là, không thể đọc được giá trị "Giây". Các giá trị còn lại thì đọc được và thay đổi đúng. Có ai gặp phải hiện tượng này xin chia sẻ! ^^ (Mình dùng CCS 4.017, thư viện DS1307.c trên CCS info)
__________________
Mechatronics Department University of Engineering and Technology, VNUH. |
![]() |
![]() |
![]() |
#13 |
Đệ tử 5 túi
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
: |
Tất cả các giá trị đọc được, chỉ có giây không đọc được thì có lẻ bạn chỉ phải xem lại phần chương trình xử lý của bạn có bị nhầm gì không thôi.
|
![]() |
![]() |
![]() |
#14 | |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
![]() Trích:
Tuy nhiên khi viết cho mạch thực của mình (dùng dsPIC30F), thì không đọc được giá trị giây. Đây là đoạn code đọc dữ liệu và hiển thị: Code:
// DS1307 Testing ds1307_init(); ds1307_set_date_time(RTCValue.date,RTCValue.month,RTCValue.year,RTCValue.day,RTCValue.hour,RTCValue.minute,RTCValue.second); while(1) { ds1307_get_date(RTCValue.date,RTCValue.month,RTCValue.year,RTCValue.day); ds1307_get_time(RTCValue.hour,RTCValue.minute,RTCValue.second); printf(lcd_putc,"\fThu%d%02d/%02d/%02d",RTCValue.day,RTCValue.date,RTCValue.month,RTCValue.year); printf(lcd_putc,"\n%02d:%02d:%02d", RTCValue.hour,RTCValue.minute,RTCValue.second); fprintf(P2PC,"\f\%02d/\%02d/\%02d\r\n",RTCValue.date,RTCValue.month,RTCValue.year); fprintf(P2PC,"\r\n%02d:\%02d:\%02d", RTCValue.hour,RTCValue.minute,RTCValue.second); } Thư viện mình dùng dưới đây:
__________________
Mechatronics Department University of Engineering and Technology, VNUH. |
|
![]() |
![]() |
![]() |
|
|