Thông báo

Collapse
No announcement yet.

Thắc mắc về thanh ghi DAY của DS1307 !!!

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

  • #16
    Nguyên văn bởi nhquangdt3k5 Xem bài viết
    mình cũng nghĩ như vậy nhưng nếu không set_time,date theo kiểu khởi tạo thế thì con RTC nó không chạy mà đứng im. còn phần set_time, date ở dưới là để chỉnh thời gian bằng các phím nhấn bên ngoài.
    thế thì ra nguyên nhân reset time con DS rồi còn gì, như mình đã nói là bạn khi reset vdk sau đó lại có cả hàm khởi tạo DS tất nhiên giờ nó bị reset là phải
    hãy xóa cái khởi tạo đó đi, và coi như khi DS chạy lần đầu nó chưa được khởi tạo, các giá trị thanh ghi =0 và nó ko đếm giờ, và bạn đọc nó hiển thị lên LCD nhưng giá trị time đó ko thay đổi, bạn cứ coi như cái giờ đó là bị chạy sai và cần sửa, bạn hãy chỉnh lại time cho nó đúng với thực tế rồi thoát chỉnh giờ ra và cứ để kệ vdk đọc giá trị time+rồi hiển thị thôi (cái khâu chỉnh giờ lần đầu bạn coi như là khâu khởi tạo time cho DS), vừa gọn gàng cho Code mà lợi cho cả việc Reset VDK ko sợ mất giờ
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

    Comment


    • #17
      Nguyên văn bởi mast090 Xem bài viết
      thế thì ra nguyên nhân reset time con DS rồi còn gì, như mình đã nói là bạn khi reset vdk sau đó lại có cả hàm khởi tạo DS tất nhiên giờ nó bị reset là phải
      hãy xóa cái khởi tạo đó đi, và coi như khi DS chạy lần đầu nó chưa được khởi tạo, các giá trị thanh ghi =0 và nó ko đếm giờ, và bạn đọc nó hiển thị lên LCD nhưng giá trị time đó ko thay đổi, bạn cứ coi như cái giờ đó là bị chạy sai và cần sửa, bạn hãy chỉnh lại time cho nó đúng với thực tế rồi thoát chỉnh giờ ra và cứ để kệ vdk đọc giá trị time+rồi hiển thị thôi (cái khâu chỉnh giờ lần đầu bạn coi như là khâu khởi tạo time cho DS), vừa gọn gàng cho Code mà lợi cho cả việc Reset VDK ko sợ mất giờ
      cảm ơn bạn. như mình đã nói ở trên rồi còn gì. nếu mình không set_time, set_date nhu vậy con DS nó không hề chạy mà đứng im luôn mà nó không bắt đầu đếm từ 0.
      Never forget who you are!

      Comment


      • #18
        Nguyên văn bởi nhquangdt3k5 Xem bài viết
        cảm ơn bạn. như mình đã nói ở trên rồi còn gì. nếu mình không set_time, set_date nhu vậy con DS nó không hề chạy mà đứng im luôn mà nó không bắt đầu đếm từ 0.
        uhm thì tất nhiên, đặc điểm con này là chưa set time cho nó lần nào thì nó sẽ ko chạy mà cứ đứng im(có thanh ghi =0, có thanh ghi #0 nói chung là time ko nhảy), nhưng bạn đã set time cho nó 1 lần + và nối nguồn nuôi riêng (pin 3V) thì sẽ ko có hiện tượng nó đứng im nữa, và các lần sau dù bạn có rút nguồn của mạch đồng hồ ra thi DS nó vấn đếm bình thường nhờ nguồn nuôi riêng, và khi bạn cắm nguồn cho mạch nó sẽ chạy bình thường chứ ko phải đứng im nữa
        Website chính thức đổi địa chỉ website thành
        Mời các bạn ghé thăm !!!

        Comment


        • #19
          vậy theo bạn nên để hàm set_time ở đâu để không bị reset thời gian?
          Never forget who you are!

          Comment


          • #20
            như bài của mình làm là
            khởi tạo VDK // ko có khởi tạo set time gì ở đây nhé
            khởi tạo LCD
            While(1)
            {
            chỉnh_giờ(); // cái này bao gồm hàm quét phím bấm để chỉnh giờ và ghi lại giá trị sau khi chỉnh cho DS, nếu ko có phím bấm coi như bỏ qua
            if(có ngắt) // dùng ngắt timer khoảng 0,1 0,2s, với mắt người khoảng thời gian này rất ngắt, ko ảnh hưởng đến việc hiển thị
            {
            đọc_time từ DS();
            hiển_thị_LCD();
            }
            }
            làm thế này thì khi mà bạn chưa set time lần nào cho DS thì khi VDK đọc time nó cứ hiển thị giá trị đứng yên, khi bạn chỉnh giờ 1 lần và ghi vào DS rồi thì nó cứ liên tuc đọc time của DS nhờ ngắt Timer thôi
            Website chính thức đổi địa chỉ website thành
            Mời các bạn ghé thăm !!!

            Comment


            • #21
              Nguyên văn bởi nhquangdt3k5 Xem bài viết
              vậy theo bạn nên để hàm set_time ở đâu để không bị reset thời gian?
              ngắn gọn, mới vào đọc byte giây trước. Rồi OR nó với giá trị 00h để cho bit CH xuống 0 xong nạp lại cho giây. Mặc định nếu là DS mới thì tất cả là 00, còn DS đã chạy thì cũng ko ảnh hường tới thanh ghi nào hết. Rồi trong chương trình chỉnh thời gian chỉnh theo ý mình, Reset 89 cũng còn

              Comment


              • #22
                Nguyên văn bởi mast090 Xem bài viết
                như bài của mình làm là
                khởi tạo VDK // ko có khởi tạo set time gì ở đây nhé
                khởi tạo LCD
                While(1)
                {
                chỉnh_giờ(); // cái này bao gồm hàm quét phím bấm để chỉnh giờ và ghi lại giá trị sau khi chỉnh cho DS, nếu ko có phím bấm coi như bỏ qua
                if(có ngắt) // dùng ngắt timer khoảng 0,1 0,2s, với mắt người khoảng thời gian này rất ngắt, ko ảnh hưởng đến việc hiển thị
                {
                đọc_time từ DS();
                hiển_thị_LCD();
                }
                }
                làm thế này thì khi mà bạn chưa set time lần nào cho DS thì khi VDK đọc time nó cứ hiển thị giá trị đứng yên, khi bạn chỉnh giờ 1 lần và ghi vào DS rồi thì nó cứ liên tuc đọc time của DS nhờ ngắt Timer thôi
                mình hiểu ý của bạn nhưng nếu muốn set trước thời gian. giả sử như bây giờ mình đặt sẵn thời gian là ngày 8/9/2010. và thời gian bắt đầu đếm từ đây mà khi reset lại VDK vẫn không bị reset thời gian. còn làm theo cách của bạn không bị reset thời gian nhưng lại không cài đặt thời gian mặc định được.
                Never forget who you are!

                Comment


                • #23
                  Nguyên văn bởi nhquangdt3k5 Xem bài viết
                  mình hiểu ý của bạn nhưng nếu muốn set trước thời gian. giả sử như bây giờ mình đặt sẵn thời gian là ngày 8/9/2010. và thời gian bắt đầu đếm từ đây mà khi reset lại VDK vẫn không bị reset thời gian. còn làm theo cách của bạn không bị reset thời gian nhưng lại không cài đặt thời gian mặc định được.
                  làm một cái công tắc gạt :
                  =1 thì lạp giá trị mặc định
                  =0 thì làm cái gì thì làm
                  |

                  Comment


                  • #24
                    Nguyên văn bởi tdm Xem bài viết
                    làm một cái công tắc gạt :
                    =1 thì lạp giá trị mặc định
                    =0 thì làm cái gì thì làm
                    ý mình là nó bắt đầu đếm từ giá trị mặc định mà không bị reset thời gian khi reset vi điều khiển. chứ dùng công tắc thì nói làm gì. như những cái điện thoại bình thường nó vẫn làm được đấy chứ. khi mới lắp pin vào nó vẫn đếm từ 1 ngày mặc định nào đó trở đi nhưng khi mình tắt nguồn( nhưng không tháo pin) tức là tắt nguồn con vi điều khiển( coi như là reset ) nhưng khi bật lên thì nó vẫn tiếp tục đếm mà thời gian có bị reset đâu.
                    Last edited by nhquangdt3k5; 16-06-2011, 19:46.
                    Never forget who you are!

                    Comment


                    • #25
                      Nguyên văn bởi nhquangdt3k5 Xem bài viết
                      ý mình là nó bắt đầu đếm từ giá trị mặc định mà không bị reset thời gian khi reset vi điều khiển. chứ dùng công tắc thì nói làm gì. như những cái điện thoại bình thường nó vẫn làm được đấy chứ. khi mới lắp pin vào nó vẫn đếm từ 1 ngày mặc định nào đó trở đi nhưng khi mình tắt nguồn( nhưng không tháo pin) tức là tắt nguồn con vi điều khiển( co như là reset ) nhưng khi bật lên thì nó vẫn tiếp tục đếm mà thời gian có bị reset đâu.
                      èo, hóa ra thế, nhưng cách giải quyết của cái này mình nghĩ cũng dễ có gì đâu, ko cần công tắc
                      sau khi khởi tạo LCD và VDK xong, trước khi nhảy vào hàm while(1) bạn cho 1 cái kiểm tra điều kiện IF với 2 biến đó là biến second và second1
                      bạn đọc time từ DS lưu nó vào second rồi chuyển giá trị này sang cho second1, dùng 1 vòng lặp delay( 1 giây) sau đó lại đọc time từ DS lưu vào second
                      nếu là DS mới chưa khởi tạo bao giờ thì time ko nhảy => second=second1 => nhảy vào chương trình khởi tạo time cho DS
                      còn nếu DS đã được khởi tạo 1 lần rồi mà bạn chỉ rút nguồn ra thì nó vẫn chạy tức => second # second1 => DS đã được cài time, ko cần khởi tạo lại nữa
                      Website chính thức đổi địa chỉ website thành
                      Mời các bạn ghé thăm !!!

                      Comment


                      • #26
                        Nguyên văn bởi mast090 Xem bài viết
                        èo, hóa ra thế, nhưng cách giải quyết của cái này mình nghĩ cũng dễ có gì đâu, ko cần công tắc
                        sau khi khởi tạo LCD và VDK xong, trước khi nhảy vào hàm while(1) bạn cho 1 cái kiểm tra điều kiện IF với 2 biến đó là biến second và second1
                        bạn đọc time từ DS lưu nó vào second rồi chuyển giá trị này sang cho second1, dùng 1 vòng lặp delay( 1 giây) sau đó lại đọc time từ DS lưu vào second
                        nếu là DS mới chưa khởi tạo bao giờ thì time ko nhảy => second=second1 => nhảy vào chương trình khởi tạo time cho DS
                        còn nếu DS đã được khởi tạo 1 lần rồi mà bạn chỉ rút nguồn ra thì nó vẫn chạy tức => second # second1 => DS đã được cài time, ko cần khởi tạo lại nữa
                        cảm ơn bạn mình viết như thế OK rồi.
                        Last edited by nhquangdt3k5; 16-06-2011, 21:38.
                        Never forget who you are!

                        Comment


                        • #27
                          bạn thử với mạch thật chưa? hay mới chỉ thử với mô phỏng?mô phỏng nhiều cái lỗi lắm
                          mạch này mình ko còn vì ngày đấy là làm hộ đứa em nó bảo vệ đồ án môn nên mình cũng ko có gì để test mà mình chỉ nêu ra ý kiến như vậy thôi, mà mình làm thì ko có time mặc định như của bạn, mà vào chỉnh giờ lần đầu cho DS
                          mình nhớ lúc làm thì chưa set time cho nó bao giờ tất cả các giá trị liên quan tới time giờ phút giây nó đều đứng yên ko thay đổi, có nghĩa là các giá trị của second cũng ko đổi, với kết quả hiển thị rõ ràng trên mạch thật như vậy thì mình ko nghĩ cái thuật toán mình gợi ý cho bạn ko hoạt động được
                          mà code theo bạn viết thế này là có vấn đề thì phải
                          Code:
                          rtc_get_time(&hour,&m,&s);//doc thoi gian tu rtc
                          second1 = s;
                          delay_ms(2000);
                          second2 = s;
                          if(second1 == second2) //neu second 1 bang second2 thì cài đặt cho rtc
                          {
                          rtc_set_date(2,8,9,10);//cai dat ngay thang nam mac dinh
                          rtc_set_time(5,6,7); //cai gio phut giay mac dinh
                          }
                          thì cái second1 luôn = second2, bởi vì bạn ko đọc lại cái giá trị giây thì biến s của bạn vẫn giữ giá trị cũ và giá trị này được gán cho cả 2 biến second
                          sửa lại
                          Code:
                          rtc_get_time(&hour,&m,&s);//doc thoi gian tu rtc
                          second1 = s;
                          delay_ms(2000);
                          rtc_get_time(&hour,&m,&s);//doc thoi gian tu rtc
                          second2 = s;
                          if(second1 == second2) //neu second 1 bang second2 thì cài đặt cho rtc
                          {
                          rtc_set_date(2,8,9,10);//cai dat ngay thang nam mac dinh
                          rtc_set_time(5,6,7); //cai gio phut giay mac dinh
                          }
                          Website chính thức đổi địa chỉ website thành
                          Mời các bạn ghé thăm !!!

                          Comment


                          • #28
                            cai dat ngay thang nam va gio phut giay minh da hieu nhung con cai dat thu 2=>chu nhat thi k co k bit lam the nao chang le lam rieng thi ton potr vdk (ngon ngu c) qua.mong cac pro chi giao!
                            rtc_set_date(2,8,9,10);//cai dat ngay thang nam mac dinh
                            rtc_set_time(5,6,7); //cai gio phut giay mac dinh
                            ??? //cai dat thu (2=>chu nhat) mac dinh

                            Comment


                            • #29
                              Nếu làm đồng hồ sử dụng LCD thì ghi thứ ra màn hình ta phải làm hàm chuyển đổi thôi , cũng k có gì khó khăn ngoài mấy lệnh IF hoặc case ....

                              Comment


                              • #30
                                mấy bạn cho mình hỏi. con chíp thời gian thực đó mình viết code cho nó riêng rồi nạp riêng cho nó, hay là viết chung rồi nạp chung với vikhien? rồi mạch nạp cho nó co dùng chug với vdk ko? minh học điện lực nên ko rành về điện tử lắm nhưng mình rất thích. cám ơn mấy bạn!
                                "điều quan trọng khi lập nghiệp ko phải ở thành phố hay ở quê, mà quan trọng là chúng ta nhận định ra hướng đi nào là đúng"
                                yahoo:
                                gmail:

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X