PDA

View Full Version : Hỏi về DS1307


nguyendungdt12
13-05-2008, 05:41 PM
Em đang làm cái bài tập lớn trongddos cần 1 phần hiển thị thời gian, em dùng CCS, có bác nào biết cách khởi tao giá trị thời gian ban đầu cho DS1307 không ạ, cho em kinh nghiệm với, em định gán nó vào biến rồi i2c_write vào mà không đc, cho ra led đồng hồ không chạy.Giúp em với nhé các bác

nguyendungdt12
13-05-2008, 05:51 PM
cho em đoạn code lúc ví dụ mnhf thiết lập cho đồng hồ bây giwof là 16h ngày 13-05-08 ấy nha các bác.
Chờ hồi âm...

nguyendungdt12
15-05-2008, 03:32 PM
chán quá không ai giúp em được ah, chắc tịa ulongf này nhiều chú ý quá ::(

ltrkhanh
15-05-2008, 04:46 PM
Thuật toán ghi DS1307: start i2c
ghi 0xD0
ghi địa chỉ
start
ghi 0xD0
ghi giây, phút, giờ, ngày...
stop i2c
Đấy là VDK của bạn hỗ trợ giao tiếp I2C, nếu không thì bạn phải xây dựng chương trình riêng.
Chúc thành công

HTAluvBeBeo
16-05-2008, 08:21 PM
có sẵn thư viện cho CCS C cho bạn đây.
Have fun

nguyendungdt12
17-05-2008, 10:26 PM
bạn ơi nhầm link rồi:(

nguyendungdt12
17-05-2008, 10:35 PM
Thuật toán ghi DS1307: start i2c
ghi 0xD0
ghi địa chỉ
start
ghi 0xD0
ghi giây, phút, giờ, ngày...
stop i2c
Đấy là VDK của bạn hỗ trợ giao tiếp I2C, nếu không thì bạn phải xây dựng chương trình riêng.
Chúc thành công

mình làm y như bạn mà nó không chạy, hic hic

ltrkhanh
18-05-2008, 10:10 AM
Bạn đưa code lên tôi mới biết được bạn sai ở chỗ nào chứ?

HTAluvBeBeo
18-05-2008, 08:04 PM
sory
gửii lại link đây:d
http://dientuvietnam.net/forums/showpost.php?p=104059&postcount=71

Mr.Bi
20-05-2008, 01:28 AM
Thuật toán ghi DS1307: start i2c
ghi 0xD0
ghi địa chỉ
start
ghi 0xD0
ghi giây, phút, giờ, ngày...
stop i2c


tui cũng đang làm với con 1307 này , đọc giản đồ data-slave Receive write mode , tui thấy trình tự nó là
- Start_i2c();
- ghi 0xD0 // Write
- ACK rùi mới ghi đia chỉ
- tiếp ACK , rùi ghi tiếp giá trị
- stop_i2c();
trình tự của u : sau khi ghi điạ chỉ xong , start lại . Vậy start chỗ này có ý nghĩa gì ?Tui ko bit các hàm start_i2c(0, stop_i2c() của CCS nằm ở đâu cả , nên ko hỉu trong 2 hàm đó ng ta viết cái gì ?

Mr.Bi
22-05-2008, 11:10 AM
có ai bit 2 hàm start_i2c() stop_i2c() viết gì ko ? nó ko chỉ đơn thuần là khởi động & kết thúc gửi nhận data phải ko ? để bit chi tiết 2 hàm này , vào đâu để xem chúng ?

nguyendungdt12
13-06-2008, 04:10 PM
làm mãi mà vẫn khong thiết lập được chán ghê, có bác nào giúp cho tiểu đệ 1 đoạn code để khởi taịo cho ds1307 giá trị đầu và nó chạy luôn mà không cần nút chỉnh bên ngoài không nhỉ? Em dung pic 16F877a và CCS

Mr.Bi
15-06-2008, 12:02 PM
làm mãi mà vẫn khong thiết lập được chán ghê, có bác nào giúp cho tiểu đệ 1 đoạn code để khởi taịo cho ds1307 giá trị đầu và nó chạy luôn mà không cần nút chỉnh bên ngoài không nhỉ? Em dung pic 16F877a và CCS

nè u ! làm gì mà than vãn ghê z thế

#include <16F877A.h>
#fuses NOPROTECT,HS,NOWDT,NOLVP,NODEBUG,NOPUT
#use delay(clock =20000000)
#use i2c(master,fast,sda=PIN_C4,scl=PIN_C3)

#define mode RE0
#define change RE1
#define IR RE2
// 0 1 2 3 4 5 6 7 8 9
unsigned char const maled[10] = {0x01,0xCF,0x92,0x86,0xCC,0xA4,0xA0,0x8F,0x80,0x04 };
unsigned char sec,min,hour,dow,date,month,year; // bien data trong RTC
unsigned char day1,day2,month1,month2,year1,year2,hour1,hour2,mi n1,min2,sec1,sec2; // bien xuat data
unsigned char hour_wait1,hour_wait2,min_wait1,min_wait2;
unsigned char i=0;
unsigned int var_IR=0;

//------------ham thu tin hieu Sony------------------------
void scan_IR()
{ if (!IR) { delay_ms(1);
if(!IR){ RB1= RB2 = 1 ; // tat 2 led
while(!IR) continue ; // trong khi IR van muc 0 thi wait de doi sang muc 1
while(IR) continue ; // neu IR chuyen sang muc 1 thi wait tiep
delay_us(750);
for(i=1;i<=12;i++)
{ //if(IR==0){ bit_set(var_IR,i) ; };
//if(IR!=0){ bit_clear(var_IR,i); };
if(IR==0){ (var_IR ||0x01)<<i; };
if(IR!=0){ (var_IR ||0x01)<<i; };
while(!IR) continue ;
while(IR) continue ;
delay_us(750);
};
};
};
}


void test_IR()
{ for(i=0;i<=12;i++)
{
if(bit_test(var_IR,i)==1)
{RB1 = 0 ;delay_ms(1000); // bat led day1
RB1 = 1 ;delay_ms(1000);
};
if(bit_test(var_IR,i)==0)
{RB2 = 0;delay_ms(1000); // bat led day2
RB2 = 1;delay_ms(1000);
};
};
}
//++++++++++++++++++++++++++++++++++++++++++++++++++ ++


//------------ cac ham lien quan den RTC--------------------
void init_time()
{ I2C_start(); // gui bit start
I2C_write(0xD0); // gui lenh write
I2C_write(0x07); // den dia chi 07H de
I2C_write(0x10); // cau hinh cho thanh ghi 07H
I2C_stop();

I2C_start();
I2C_write(0xD0);
I2C_write(0x00); // dia chi 00h
I2C_write(0x00); // nap gia tri cho thanh ghi giay = 0 , dong thoi xoa bit CH
I2C_write(0x01); // cho thanh ghi phut = 1
I2C_write(0x11); // chon mode 24h cho thanh ghi gio & nap gia tri la 11h
I2C_write(0x02); // thu 2
I2C_write(0x15); // ngay 15
I2C_write(0x06); // thang 6
I2C_write(0x08); // nam 2008 , nhap gia tri 2 so cuoi cua nam
i2c_read(0);
I2C_stop();
}
void up_date1307()
{
}

void update_time()
{I2C_start();
I2C_write(0xD0); // gui lenh ghi
I2C_write(0x00); // dia chi bat dau
I2C_start();
I2C_write(0xD1); // gui lenh doc
sec=i2c_read(1);
min=i2c_read(2);
hour=i2c_read(3);
dow =i2c_read(4);
date=i2c_read(5);
month=i2c_read(6);
year=i2c_read(7);
i2c_read(0);
i2c_stop();

sec1 = sec & 0x0F;
sec2 = (sec & 0xF0)>>4;
min1 = min & 0x0F;
min2 = (min & 0xF0)>>4;
hour1 = hour & 0x0F;
hour2 = (hour & 0xF0)>>4;
day1 = date & 0x0F ;
day2 = (date & 0xF0)>>4;
month1= month & 0x0F ;
month2= (month & 0xF0)>>4;
year1 = year & 0x0F ;
year2 = (year & 0xF0)>>4;
}


#int_ext
void read_time()
{ I2C_start();
I2C_write(0xD0);
I2C_write(0x00); // xoa bit CH
I2C_start();
I2C_write(0xD1);
sec = I2C_read(0x00);
I2C_stop();
if(sec==0) update_time();
sec1 = sec & 0x0F;// lay 4 bit thap
sec2 = (sec & 0xF0) >> 4 ;
}


void display()
{ PORTD = maled[sec1] ;RC6=0 ; delay_us(50); RC6=1 ;
PORTD = maled[sec2] ;RC5=0 ; delay_us(50); RC5=1 ;
PORTD = maled[min1] ;RC2=0 ; delay_us(50); RC2=1 ;
PORTD = maled[min2] ;RC1=0 ; delay_us(50); RC1=1 ;
PORTD = maled[hour1];RB7=0 ; delay_us(50); RB7=1 ;
PORTD = maled[hour2];RC0=0 ; delay_us(50); RC0=1 ;
PORTD = maled[day1]; RB2=0 ; delay_us(50); RB2=1 ;
PORTD = maled[day2]; RB1=0 ; delay_us(50); RB1=1 ;
PORTD = maled[month1];RB4=0; delay_us(50); RB4=1 ;
PORTD = maled[month2];RB3=0; delay_us(50); RB3=1 ;
PORTD = maled[year1];RB6=0 ; delay_us(50); RB6=1 ;
PORTD = maled[year2];RB5=0 ; delay_us(50); RB5=1 ;
}

main()
{ set_tris_A(0b0000000); PORTA = 0b00001111;
set_tris_B(0b00000001); PORTB = 0b11111111; // tat led 1-9
set_tris_C(0b00011000); PORTC = 0b11100111;
set_tris_D(0x00); PORTD = 0xFF;
set_tris_E(0xFF); PORTE = 0xFF;

delay_ms(500);
init_time();

GIE = 1; // cho phep ngat xay ra
enable_interrupts(int_ext);
ext_int_edge(H_to_L);

while(1)
{display();
};
}



code chạy rùi đóa , nhưng ko hỉu sao khi giây về 00 thì tất cả các led đều nháy nháy ( khó chịu chỗ này lám , giống như ta quét led với tốc độ chậm í) wa 3s thì nó mới quét lại đúng thời gian 50ms . Tui cũng ko hỉu làm sao nữa . Nhưng nói chung thỏa mãn kì vọng khởi tạo DS1307 rùi đóa

cuong86vt
16-06-2008, 11:49 PM
Trong void init_time() bạn viết là: I2C_write(0x15);, viết như vậy là thành ngày 21 mất rồi.
Nếu muốn ghi khởi tạo là ngày 15 thì phải viết là I2C_write(15); hoặc là I2C_write(0x0F); mới đúng chứ, phải không nhỉ ?...

namqn
16-06-2008, 11:52 PM
Trong void init_time() bạn viết là: I2C_write(0x15);, viết như vậy là thành ngày 21 mất rồi.
Nếu muốn ghi khởi tạo là ngày 15 thì phải viết là I2C_write(15); hoặc là I2C_write(0x0F); mới đúng chứ, phải không nhỉ ?...
DS1307 dùng số BCD (binary-coded decimal) chứ không phải số nhị phân. Do đó, ngày 15 cần mã hóa thành 0x15.

Thân,

cuong86vt
17-06-2008, 12:38 AM
Mình hiểu rồi,
khi: i2c_write(0x15): tức là BIN: 0x15 -> BCD: 15 (BIN -> BCD)
còn khi: data = i2c_read(): nếu data nhận được giá trị là 15 thì BCD: 15 -> BIN: 0x15 (BCD -> BIN), tức là lúc này data = 0x15, phải vậy không anh namqn ?...

namqn
17-06-2008, 03:18 AM
Mình hiểu rồi,
khi: i2c_write(0x15): tức là BIN: 0x15 -> BCD: 15 (BIN -> BCD)
còn khi: data = i2c_read(): nếu data nhận được giá trị là 15 thì BCD: 15 -> BIN: 0x15 (BCD -> BIN), tức là lúc này data = 0x15, phải vậy không anh namqn ?...
Đúng vậy.

Thân,

hung7191
15-12-2009, 04:00 PM
mach ne ban
http://www.mediafire.com/file/kxktzzi2ioy/Clock.rar

hungtroet2005
22-04-2010, 02:14 AM
chào các bác.em là người mới học pic.em đang làm đồ án về điều khiển có dùng con DS1307 nhưng khi làm thì có một lỗi phát sinh,mong các bác xem giúp. Em bị lỗi như thế này: em cho đèn led D0 sáng( các đèn led D1--D7 tắt ) bằng lệnh output_d(1). nhưng khi chạy mô phỏng thì các đèn ở chân portd lại sáng lung tung. nếu em không dùng lệnh DS1307_init() thì các đèn lại sáng đúng như mong muốn( chỉ có D0 sáng ). em không hiểu tại sao nữa??? mong các bác nghiên cứu giúp. lệnh DS1307_init() là lệnh khởi tạo DS1307

em gừi theo file drive DS1307 và một file em thử làm để kiểm tra lỗi( chỉ đơn giản là cho đèn D0 sáng mà thôi,nhưng có thêm lệnh DS1307_init() trong đó)