View Full Version : help me!!!!! DS1307 + 16f877a
phanhoangag
04-05-2011, 10:45 AM
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?????????
tanbka
04-05-2011, 03:57 PM
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
danghien719
04-05-2011, 10:19 PM
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.
phanhoangag
04-05-2011, 10:48 PM
kam on cac nhieu de minh thu xem
phanhoangag
07-05-2011, 12:02 PM
may anh co cach nao k can xoa doan khoi tao Ds ma van k can chinh gio lai k giup voi!!!!!!
tanbka
08-05-2011, 12:43 AM
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.
friend_1990
09-05-2011, 09:28 PM
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.
vậy bạn đã làm ds1307 lần nào chưa vậy tui đang làm đồ án mà mù về con này quá bạn có thể nói cho tui biết tìm hiểu từ đâu ko?
shindo216
09-05-2011, 10:00 PM
mình có mấy file này bạn đọc tham khảo
phanhoangag
10-05-2011, 10:22 AM
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!!!!!!!!!!!!!!!!!!!!
lambaotrung
11-05-2011, 05:58 PM
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.
tanbka
12-05-2011, 05:46 PM
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ỉ?
Delfy_Coltech
14-05-2011, 10:54 AM
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)
tanbka
14-05-2011, 11:07 PM
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.
Delfy_Coltech
16-05-2011, 09:43 AM
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
Mình đã check lại và mô phỏng chạy bình thường với PIC16F877A.
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ị:
// 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,RTCVa lue.year,RTCValue.day); ds1307_get_time(RTCValue.hour,RTCValue.minute,RTCV alue.second);
printf(lcd_putc,"\fThu%d%02d/%02d/%02d",RTCValue.day,RTCValue.date,RTCValue.month,RTCValu e.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);
}
Trong đó, RTCValue là struct chứa 7 biến thời gian được khởi tạo từ đầu.
Thư viện mình dùng dưới đây:
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.