PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 21-06-2008, 05:23 AM   #5
cuong86vt
Đệ tử 1 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 22
:
ds1307 này có 3 chế độ tạo xung ở ngõ ra ở chân số 7 FT/OUT với 3 mức xung:
1Hz
4.096kHz
8.192kHz
32.768kHz
cho nên ta cần một con thạch anh 32.768kHz (bé gần bằng 1 con điện trở), trong sơ đồ mạch của mình nối 1 con led ở chân FT/OUT này để nó tạo xung nhấp nháy đúng 1s.

Việc đọc ghi giá trị từ ds1307 chỉ có một cái khó đó là việc chuyển đổi dữ liệu ở 2 mã BIN và BCD qua lại với nhau giữa con PIC6F877A (MASTER) và DS1307 (SLAVE) trên 2 đường BUS I2C là SDA và SCL.

Cụ thể: Khi ta GHI giá trị ngày 15 vào ds1307 thì số 15 này sẽ bị đổi thành 0x15 ngay khi vào thanh khi ds1307 !. Còn khi ta muốn ĐỌC giá trị từ DS1307 gửi về thì ds gửi về giá trị ngày 15 là: 0x15 !, tức là PIC nhận được giá trị 0x15 = 21 !.

Vậy ta phải làm sao để có được công thức chuyển đổi dữ liệu giữa 2 mã BIN và BCD:
0xAB -> AB và AB -> 0xAB. Sau đây mình xin viết ra công thức chuyền đổi của mình: (các bạn có thể viết a bằng cách khác mình cũng được):

Đổi dữ liệu mã BCD -> BIN:

Code:
int write(int data)                  // MASTER -> DS1307.
   {                                 //      x -> y.
      int x,y;                       //vd:   7 -> 7  = 0x07.
      x = data;                      //vd:  12 -> 18 = 0x12.
      if(x<10)
         {
            y = x;
         }
      else if(x>=10)
         {
            y = (x/10 * 6) + x;            //vd:  29 -> 41 = 0x29.
         }
      return(y);                     //vd:  35 -> 53 = 0x35.
   }
Đổi dữ liệu mã BCD -> BIN:

Code:
int read(int data)
   {                                 // MASTER <- DS1307.
      int x,y,z;                     //      x <- y.
      y = data;                      //vd:   5 <-  5 = 0x05.
      i=0;                           //vd:  10 <- 16 = 0x10.
      if(y<10)                       //vd:  20 <- 32 = 0x20.
         {                           //vd:  30 <- 48 = 0x30.
            x = y;                   //vd:  40 <- 64 = 0x40.
            z = x;                   //vd:  50 <- 80 = 0x50.
         }                           //..... 
      else if(y>=10)
         {
            do {
                  x = y - (6 * i);        
                  z = (x/10 * 6) + x;
                  i++;
               }
           while(z!=y);
         }
      return(x);    
   }
Code đổi dữ liệu ở trên mình viết kiểu nội suy tam suất (hơi cùi bắp nhỉ !), nhưng mình đã thử lại kiểm chứng thấy đúng và dữ liệu hiển thị lên màn hình LCD là chính xác.
cuong86vt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam