![]() |
|
Tài trợ cho PIC Vietnam |
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 |
![]() |
#5 |
Đệ 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. } 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); } |
![]() |
![]() |
|
|