Thông báo

Collapse
No announcement yet.

Xin giúp đỡ về Đồng hồ thời gian thực DS1307 ?

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Xin giúp đỡ về Đồng hồ thời gian thực DS1307 ?

    Không có pin Cmos 3V thì con DS1307 chạy bình thường đúng ngày giờ.
    Nhưng khi gắn pin 3V vào thì nó chạy 2-3s rồi đơ luôn ở giá trị ngày giờ như sau : 45:85:85 45-25-96
    Tháo pin ra thì DS chạy tiếp ngày giờ ban nãy + khoảng thời gian không chạy (suy ra DS vẫn chạy từ đầu đến cuối nhưng khi có PIN vào thì vẫn đơ mà các thanh ghi vẫn đếm bình thường)
    mạch em làm là led 7 đoạn dùng PIC?
    Các anh ai biết gỡ rối cho em với?

  • #2
    Nguyên văn bởi mryalamen Xem bài viết
    Không có pin Cmos 3V thì con DS1307 chạy bình thường đúng ngày giờ.
    Nhưng khi gắn pin 3V vào thì nó chạy 2-3s rồi đơ luôn ở giá trị ngày giờ như sau : 45:85:85 45-25-96
    Tháo pin ra thì DS chạy tiếp ngày giờ ban nãy + khoảng thời gian không chạy (suy ra DS vẫn chạy từ đầu đến cuối nhưng khi có PIN vào thì vẫn đơ mà các thanh ghi vẫn đếm bình thường)
    mạch em làm là led 7 đoạn dùng PIC?
    Các anh ai biết gỡ rối cho em với?
    cái này vì lí do nào đó bit CH=1 đây mà.
    cho vài đồng code lên đây.

    Comment


    • #3
      Đây nè huynh :
      void ds1307_init(void)
      {
      BYTE seconds = 0;

      i2c_start();
      i2c_write(0xD0); // WR to RTC
      i2c_write(0x00); // REG 0
      i2c_start();
      i2c_write(0xD1); // RD from RTC
      seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
      i2c_stop();
      seconds &= 0x7F;

      delay_us(3);

      i2c_start();
      i2c_write(0xD0); // WR to RTC
      i2c_write(0x00); // REG 0
      i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
      i2c_start();
      i2c_write(0xD0); // WR to RTC
      i2c_write(0x07); // Control Register
      i2c_write(0x80); // Disable squarewave output pin
      i2c_stop();

      }
      Thanh ghi thứ 0 em cho nó =0x00 thì bit số 7 (CH) làm sao mà lên 1 được ! oái ăm quá

      Comment


      • #4
        Nguyên văn bởi mryalamen Xem bài viết
        Đây nè huynh :

        Thanh ghi thứ 0 em cho nó =0x00 thì bit số 7 (CH) làm sao mà lên 1 được ! oái ăm quá
        trong chương trình chính "mỗi lần" cập nhập data em gọi hàm CH_DS1307();
        Code:
        void CH_DS1307(void)
        {
        i2c_write(0xD1); // RD from RTC
        seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
        i2c_stop();
        seconds &= 0x7F;// CH=0
        
        delay_us(3);
        
        i2c_start();
        i2c_write(0xD0); // WR to RTC
        i2c_write(0x00); // REG 0
        i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
        i2c_stop();
        }

        Comment


        • #5
          Hi,
          Tui làm với DS1307 toàn dùng cái này, bác thử quẳng nó vào code của bác xem sao nhé. Lưu ý khai báo lại chân SDA và SCL cho khớp với phần cứng của bác.
          Code:
          unsigned int Port, Dir;
          #byte Port = getenv("SFR:PORTC")
          #bit SDA = Port.4
          #bit SCL = Port.3
          #byte Dir = getenv("SFR:TRISC")
          #bit DirSDA = Dir.4
          #bit DirSCL = Dir.3
          
          
          #define RTC_SLAVE_ADDRESS   0xD0
          #define RTC_READ_COMMAND       RTC_SLAVE_ADDRESS | 0x01
          #define RTC_WRITE_COMMAND   RTC_SLAVE_ADDRESS
          
          
          struct Time
          {
              char second;
              char minute;
              char hour;
          };
          struct DateTime
          {
              char second;
              char minute;
              char hour;
              char day;
              char date;
              char month;
              char year;
          };
          
          
          void i2c_release(void)
          {
              DirSDA = 1;
              DirSCL = 1;
          }
          void i2c_start(void)
          {
              DirSCL = 0;
              SCL = 1;
              SCL = 1;
              DirSDA = 0;
              SDA = 0;
              SDA = 0;
              SCL = 0;
              SCL = 0;
          }
          void i2c_stop(void)
          {
             
              DirSDA = 0;
              SDA = 0;
              SDA = 0;
              DirSCL = 0;
              SCL = 1;
              SCL = 1;
              SDA = 1;
              SDA = 1;
          }
          unsigned int i2c_read(int1 ack)
          {
              int i, result;
              
              result = 0;
              DirSDA = 1; //select input direction
              SCL = 0;
              SCL = 0;
              for(i = 0; i < 8; i++)
              {
                  SCL = 1;
                  SCL = 1;
                  result <<= 1;
                  if(SDA == 1) result++;
                  SCL = 0;
                  SCL = 0;
              }
              DirSDA = 0;   //select output direction
              SDA = (ack == 1)? 0:1;
              SCL = 1;
              SCL = 1;
              SCL = 0;
              SCL = 0;
              return result;
          }
          int1 i2c_write(unsigned int value)
          {
              unsigned int i, temp;
              int1 ack;
              
              temp = value;
              DirSDA = 0;
              SCL = 0;
              SCL = 0;
              for(i = 0; i < 8; i++)
              {
                  SDA = (temp & 0x80)? 1:0;
                  SCL = 1;
                  SCL = 1;
                  SCL = 0;
                  SCL = 0;
                  temp <<= 1;
              }
              DirSDA = 1;   // read ACK
              SCL = 1;
              SCL = 1;
              ack = SDA;
              SCL = 0;
              SCL = 0;
              return ack;
          }
          
          
          void DS1307_init() 
          {
              char x;
              
              i2c_release();
              delay_us(10);
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);   //Write slave address
              i2c_write(0x00);   
              i2c_start();   
              i2c_write(RTC_READ_COMMAND);
              x = i2c_read(0);   // Read second with NACK
              i2c_stop();
              
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);
              i2c_write(0x00);   // Go to Second Reggister
              i2c_write(x & 0x7F);   // 
              i2c_stop();
              
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);
              i2c_write(0x07);   // Go to Control Reggister
              i2c_write(0x00);   // configure RTC
              i2c_stop();
          }
          
          
          struct Time DS1307_get_time()
          {
              struct Time t;
              
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);   
              i2c_write(0x00);      // Go to top of memory
              i2c_start();   
              i2c_write(RTC_READ_COMMAND);
              t.second = i2c_read(1);   // Read with ACK
              t.minute = i2c_read(1);
              t.hour = i2c_read(0);
              i2c_stop();
              return t;
          }
          struct DateTime DS1307_get_date_time()
          {
              struct DateTime t;
              
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);   
              i2c_write(0x00);      // Go to top of memory
              i2c_start();   
              i2c_write(RTC_READ_COMMAND);
              t.second = i2c_read(1);   // Read with ACK
              t.minute = i2c_read(1);
              t.hour = i2c_read(1);
              t.day = i2c_read(1);
              t.date = i2c_read(1);
              t.month = i2c_read(1);
              t.year = i2c_read(0);
              i2c_stop();
              return t;
          }
          void DS1307_set_time(struct Time t)
          {
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);
              i2c_write(0x00);
              i2c_write(t.second);
              i2c_write(t.minute);
              i2c_write(t.hour);
              i2c_stop();
          }
          void DS1307_set_date(struct Time t)
          {
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);
              i2c_write(0x04);
              i2c_write(t.second);    // set Date
              i2c_write(t.minute);    // set Month
              i2c_write(t.hour);        // set Year
              i2c_stop();
          }
          void DS1307_set_date_time(struct DateTime t)
          {
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);
              i2c_write(0x00);
              i2c_write(t.second);
              i2c_write(t.minute);
              i2c_write(t.hour);
              i2c_write(t.day);
              i2c_write(t.date);
              i2c_write(t.month);
              i2c_write(t.year);
              i2c_stop();
          }
          void DS1307_write(char value, char addr)
          {
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);
              i2c_write(addr);
              i2c_write(value);
              i2c_stop();                                    
          }
          unsigned int DS1307_read(char addr)
          {
              unsigned int value;
              
              i2c_start();
              i2c_write(RTC_WRITE_COMMAND);
              i2c_write(addr);
              i2c_start();
              i2c_write(RTC_READ_COMMAND);
              value = i2c_read(0);
              i2c_stop();
              return value;
          }
          Thân ái.
          Đường đến những ngày vinh quang không còn xa
          Con đường chúng ta... chúng ta đã chọn.

          Comment


          • #6
            o.k rồi, thanks các anh nhiều !

            Comment


            • #7
              có bác nào có mạch hiển thị trên led 7 doạn ko cho e xin code,mạch mô phỏng và mạch in với e cảm ơn các bác nhìu

              Comment


              • #8
                Bác cho em hỏi là.. em dung con MCU 16f685 sao em khai bao nhu bác mà 2 chan SCL và SDA nó hok hoạt động nhỉ..co cần phải khai báo gì nữa hok ah cho cái PORTC như cua bác đó

                Comment


                • #9
                  Nguyên văn bởi diendv187 Xem bài viết
                  Bác cho em hỏi là.. em dung con MCU 16f685 sao em khai bao nhu bác mà 2 chan SCL và SDA nó hok hoạt động nhỉ..co cần phải khai báo gì nữa hok ah cho cái PORTC như cua bác đó
                  con 16F685 không có module EUSART( I2C, SPI..) nên không giao tiếp với 1307 được đâu bạn. Cùng dòng con này mà có I2C là 16F687 16F690 ........

                  Comment


                  • #10
                    hok cần đâu .. tui dung dc nó

                    Comment

                    Về tác giả

                    Collapse

                    mryalamen Tìm hiểu thêm về mryalamen

                    Bài viết mới nhất

                    Collapse

                    Đang tải...
                    X