PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Hỏi về DS1307 (http://www.picvietnam.com/forum/showthread.php?t=2366)

nguyendungdt12 13-05-2008 05:41 PM

Hỏi về DS1307
 
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

Trích:

Nguyên văn bởi ltrkhanh (Post 16235)
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/show...9&postcount=71

Mr.Bi 20-05-2008 01:28 AM

Trích:

Nguyên văn bởi ltrkhanh (Post 16235)
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

Trích:

Nguyên văn bởi nguyendungdt12 (Post 16808)
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ế
Code:

#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,min1,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à:
Code:

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à
Code:

I2C_write(15);
hoặc là
Code:

I2C_write(0x0F);
mới đúng chứ, phải không nhỉ ?...

namqn 16-06-2008 11:52 PM

Trích:

Nguyên văn bởi cuong86vt (Post 16854)
Trong void init_time() bạn viết là:
Code:

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à
Code:

I2C_write(15);
hoặc là
Code:

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,


Múi giờ GMT. Hiện tại là 02:55 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam