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

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

    Mình mới viết thử đoạn code giao tiếp với 1307, ngắt ngoài 0 dùng để set time, 2 nút up down. Mình set thử cho ngày chuyển từ chủ nhật (giá trị 7)qua thứ 2( giá tri 1). Nhưng con ds lại chuyển từ 7 qua 0, rồi sau đó các nút up down chạy sai, phải chuyển tới set lại DAY mới chạy đúng lại. Chuyển giữa các ngày khác trong tuần thì ko bị như thế. Ai biết lỗi này là lỗi gì ko chỉ giúp
    Attached Files

  • #2
    mình ko theo ASM nến ko xem được nhưng có chút góp ý
    tại sao rất nhiều người trong đó có bạn phức tạp hóa vấn đề việc ấn phím dùng ngắt ngoài làm chi cho phức tạp mà ko dùng 1 chân bất kì khác để thực hiện nhấn phím, dùng ngắt ngoài đôi khi vì độ nhạy của ngắt ngoài gây ra việc nhận vài giá trị ngắt tại cùng 1 lần nhấn
    còn việc bạn set ngày chủ nhật qua thứ 2 lại bị lỗi thì mình ko hiểu lắm, nó khác j các thanh ghi còn lại đâu
    chỉ cần 1 cái điều kiện y như các thanh ghi khác của con DS ví dụ như nếu UP được ấn thì Day+1, nếu Day=8(chuyển từ CN qua thứ 2) thì Day=1(tức thứ 2) rồi ghi lại giá trị Day này cho DS là được mà
    mình làm cái đồng hồ với DS1307 viết bằng C , các thuật toán cho cả 7 thanh ghi time có vấn đề gì đâu nhỉ mà bạn lại chỉ bị ở thanh Day
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

    Comment


    • #3
      dùng thuật toán như bạn mast90 là ok mà nhưng mà không cần dùng ngắt cũng được. nhưng nếu dùng phím exit để thoát ra khỏi chế độ cài đặt hoặc thoát ra khỏi bất cứ 1 chế độ nào đó thì nên dùng ngắt sẽ đảm bảo hơn. còn về phần DS1307 mình có thắc mắc là nếu mình không set time, date trong hàm main bằng dòng lệnh:
      rtc_set_time(h,m,s);
      rtc_set_date(day,month,year);
      cho nó thì nó không hề chạy nhưng khi set time, date trong hàm main rồi mà khi mình reset lại vi điều khiển thì nó set lại thời gian luôn mà không đếm tiếp thời gian đã đếm được trước đó do lệnh set time, date mình đặt trong hàm main. ai biết cách set time, date mà khi reset lại vi điều khiển thời gian vẫn tiếp tục đếm mà không bị set lại thời gian như thời gian mình cài đặt ban đầu không?
      Last edited by nhquangdt3k5; 13-06-2011, 23:17.
      Never forget who you are!

      Comment


      • #4
        cai này chỉ có cách là bạn phải làm các nút để chỉnh ngày thôi. còn cách đọc thời gian thì mình sẽ dùng timer. như vậy sẽ không còn lệnh set_timer và set_date trong ham main nua khi đó khi reset lai thì vẫn không bị sai.

        Comment


        • #5
          Nguyên văn bởi kakalot_bk Xem bài viết
          cai này chỉ có cách là bạn phải làm các nút để chỉnh ngày thôi. còn cách đọc thời gian thì mình sẽ dùng timer. như vậy sẽ không còn lệnh set_timer và set_date trong ham main nua khi đó khi reset lai thì vẫn không bị sai.
          bạn nói rõ hơn được không? nếu như không set time, set date thì nó không chạy được.
          Never forget who you are!

          Comment


          • #6
            kakalot nói đúng đó, ko lên để cái set time cho DS ở trong main mà lên dùng ngắt
            như mạch mình đã làm thì mình dùng 1 ngắt timer khoảng 0,1s thì bắt nó nhảy vào hàm đọc read_time của con DS như vậy 2 chuơng trình main và đọc time hay set_time đều ko ảnh hưởng j đến nhau, cứ sau 0,1s xảy ra ngắt 1 lần và đọc lại giá trị time cung cấp cho VDK
            DS hoạt động độc lập với VDK và có thạch anh+nguồn nuôi riêng nên việc hiển thị sai time chỉ có thể do Code của bạn đọc viết lỗi khiến nó hiển thị sai
            bên cạnh đó việc thoát khỏi chế độ set_time cũng ko cần thiết dùng ngắt, mình cũng có thiết lập 1 phím exit ấn bất cứ lúc nào cũng được và chạy luột, ko hề có hiện tượng lỗi hay ko nhận phím
            Website chính thức đổi địa chỉ website thành
            Mời các bạn ghé thăm !!!

            Comment


            • #7
              Nguyên văn bởi mast090 Xem bài viết
              kakalot nói đúng đó, ko lên để cái set time cho DS ở trong main mà lên dùng ngắt
              như mạch mình đã làm thì mình dùng 1 ngắt timer khoảng 0,1s thì bắt nó nhảy vào hàm đọc read_time của con DS như vậy 2 chuơng trình main và đọc time hay set_time đều ko ảnh hưởng j đến nhau, cứ sau 0,1s xảy ra ngắt 1 lần và đọc lại giá trị time cung cấp cho VDK
              DS hoạt động độc lập với VDK và có thạch anh+nguồn nuôi riêng nên việc hiển thị sai time chỉ có thể do Code của bạn đọc viết lỗi khiến nó hiển thị sai
              bên cạnh đó việc thoát khỏi chế độ set_time cũng ko cần thiết dùng ngắt, mình cũng có thiết lập 1 phím exit ấn bất cứ lúc nào cũng được và chạy luột, ko hề có hiện tượng lỗi hay ko nhận phím
              vậy theo bạn nên để set time, set date ở đâu? để khi reset lại vi điều khiển mà thời gian không bị reset về trạng thái ban đầu. nếu như mình không set time, set date thì DS 1307 nó sẽ đếm từ đâu?
              Never forget who you are!

              Comment


              • #8
                code của bạn có vấn đề rồi đó. khi DS chạy sai giờ hoặc DS mới mua về bạn chỉ cần set cho nó 1 lần thôi, sau đó nhiệm vụ của bạn là chỉ Read nó ra. khi tắt nguồn thì DS của bạn phải có Pin nuôi.
                sau khi set xong đúng giờ bạn có thể nạp lại code cho CPU bằng cách bỏ hàm set đi, khi đó sau này trong chương trình của bạn ko có hàm set nữa mà chỉ có hàm Read do đó dù có reset thì DS vẫn chạy đúng giờ. sau một thời gian nếu DS chạy sai giờ thì set lại
                LMD 238 Tăng Bạc Hổ - TP. Quy Nhơn.

                Comment


                • #9
                  Bạn nên để hàm set_timer và set_date trong chuong trình con chỉnh ngày giờ. Chương trình con này được gọi khi ngắt sảy ra.--> vì thế khi reset thi vẫn không bị set về giá trị ban đầu. bạn phải lắp pin để nuối DS phòng trường hợp khi mất điện thì con DS vẫn chạy đúng. lần đầu tiên khi các bạn nạp code xong thì bạn chỉnh luôn thời gian (bạn không nên khai báo thời gian mặc định). sau 1 thời gian DS có thể bị chạy sai thì bạn có thể chỉnh lại bằng các nút bấm. nếu làm như vậy thì bạn chỉ cần nạp code cho VDK 1 lần duy nhất.

                  Comment


                  • #10
                    Hi,
                    Để khởi động RTC thì bác chỉ cần ghi dữ liệu vào vị trí lưu trữ Giây là được rồi không cần phải set lại ngày làm gì đâu. Khi không cung cấp điện, RTC chạy bằng Pin dự phòng vì vậy ngày giờ cũng được tự cập nhật theo thời gian thực, VDK chỉ việc đọc giờ mà thôi không cần phải set lại.
                    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


                    • #11
                      trong chương trình chính của mình chỉ có lấy giá trị từ rtc ra rồi hiểu thị thôi, quét tới cuối cùng nó sẽ kiểm tra xem có bấm nút up hay down ko, nếu ko thì thoát ra quét lại từ đầu tiếp. Ý mình là khi đang quét led bình thường ko nhấn nút gì hết (nghĩa là chỉ đọc từ rtc ra thôi ấy) gải sử là 23h59min giá trị day xuất ra ko hiệu chỉnh gì cả, thì khi qua 0h00 thì day nhảy giá trị là 0 chứ ko phải 1 như trong datasheet nó báo là thanh ghi day chỉ chạy từ 1-7 ko có giá trị 0.


                      Với lại ACE có thuật toán chuyển chế độ để set thời gian nào ngắn gọn ko up cho mình tham khảo với, cái code trên mình viết cho khóa dưới để nó đọc dễ hiểu thôi. Có code ASM up lên giúp mình, thank ! À nếu kết hợp với nháy led đang điều chỉnh thì càng tốt, mình viết ra rồi mà thấy hơi hao tốn các bit định địa chỉ.
                      Last edited by chung1608; 14-06-2011, 20:05.

                      Comment


                      • #12
                        Nguyên văn bởi kakalot_bk Xem bài viết
                        Bạn nên để hàm set_timer và set_date trong chuong trình con chỉnh ngày giờ. Chương trình con này được gọi khi ngắt sảy ra.--> vì thế khi reset thi vẫn không bị set về giá trị ban đầu. bạn phải lắp pin để nuối DS phòng trường hợp khi mất điện thì con DS vẫn chạy đúng. lần đầu tiên khi các bạn nạp code xong thì bạn chỉnh luôn thời gian (bạn không nên khai báo thời gian mặc định). sau 1 thời gian DS có thể bị chạy sai thì bạn có thể chỉnh lại bằng các nút bấm. nếu làm như vậy thì bạn chỉ cần nạp code cho VDK 1 lần duy nhất.
                        mình dùng hàm rtc_set_time va rtc_set_date để khai báo thời gian mặc định cho nó trong hàm main. nên khi reset vi điều khiển lại nó cũng bị reset luôn thời gian về mặc định nhưng nếu không dùng hàm rtc_set_time, date thì nó không chạy. nhưng nếu set mặc định như thế thì nó lại chạy đúng chỉ mỗi khi reset vi điều khiển thì thời gian lại về giá trị mặc định ban đầu. mình chưa nghĩ ra cách giải quyết nó. nếu như bạn nói đặt nó trong chương trình con rồi dùng ngắt thì sao nhỉ??? mình làm sao mà set được thời gian mặc định từ trước để khi bật lên nó bắt đầu đếm từ đấy nhỉ? mình có gửi kèm code lên các bạn xem giúp xem.
                        cảm ơn nhiều.
                        Attached Files
                        Never forget who you are!

                        Comment


                        • #13
                          Nguyên văn bởi nhquangdt3k5 Xem bài viết
                          mình dùng hàm rtc_set_time va rtc_set_date để khai báo thời gian mặc định cho nó trong hàm main. nên khi reset vi điều khiển lại nó cũng bị reset luôn thời gian về mặc định nhưng nếu không dùng hàm rtc_set_time, date thì nó không chạy. nhưng nếu set mặc định như thế thì nó lại chạy đúng chỉ mỗi khi reset vi điều khiển thì thời gian lại về giá trị mặc định ban đầu. mình chưa nghĩ ra cách giải quyết nó. nếu như bạn nói đặt nó trong chương trình con rồi dùng ngắt thì sao nhỉ??? mình làm sao mà set được thời gian mặc định từ trước để khi bật lên nó bắt đầu đếm từ đấy nhỉ? mình có gửi kèm code lên các bạn xem giúp xem.
                          cảm ơn nhiều.
                          hjc, ko biết nhiều về AVR lên chỉ hiểu mỗi cái chỉnh giờ thôi, còn đâu chịu. nhưng mình nhắc bạn 1 điều rằng một khi đã set_time cho DS thì ko bao giờ có chuyện nó bị reset time khi reset VDK cả, 2 con này hoạt động độc lập nhau và DS còn có nguồn nuôi riêng để đề phòng mất điện, chỉ trừ trường hợp bạn ko lắp nguồn cho nó thôi
                          khi mà chưa set time lần nào cho VDK thì nó sẽ luôn cho giá trị các thanh ghi = 0, vì vậy trên LCD nó sẽ chỉ hiển thị tất cả các time =0, và khi set 1 lần rồi và có nguồn nuôi thì nó luôn tự đếm giờ và làm việc độc lập VDK
                          Mình nghĩ chắc bạn lập trình theo kiểu khởi tạo VDK, khởi tạo set time cho VDK rồi mới cho 1 vòng lặp vô tận 2 cặp lệnh đọc time+ hiển thị time ra. nếu làm thế này thì khi reset VDK thì chắc chắn nó sẽ tự reset luôn con DS. Bạn chỉ cần khởi tạo các thứ cần thiết cho VDK và LCD của bạn thôi, rồi nhảy luôn vào cái vòng lặp vô tận kia, khi chưa set_time cho nó thì nó cứ hiển thị giá trị 0 trên màn hình mà ko thay đổi, vào đây bạn chỉ nhấn phím để chỉnh time sau đó ghi giá trị này vào cho DS, lúc này DS sẽ tự đếm và xuất cho ta giá trị time cần
                          ////mà mình ko hiểu theo ý các bạn là set_time với set_day là gì mà lắm set thế, một khi chỉnh xong các giá trị về thời gian xong(cụ thể là chỉnh cho 7 thanh ghi) thì mình ghi lại cả 7 giá trị này cho DS chứ ko cần phải tách riêng rẽ thế
                          Website chính thức đổi địa chỉ website thành
                          Mời các bạn ghé thăm !!!

                          Comment


                          • #14
                            Nguyên văn bởi chung1608 Xem bài viết
                            trong chương trình chính của mình chỉ có lấy giá trị từ rtc ra rồi hiểu thị thôi, quét tới cuối cùng nó sẽ kiểm tra xem có bấm nút up hay down ko, nếu ko thì thoát ra quét lại từ đầu tiếp. Ý mình là khi đang quét led bình thường ko nhấn nút gì hết (nghĩa là chỉ đọc từ rtc ra thôi ấy) gải sử là 23h59min giá trị day xuất ra ko hiệu chỉnh gì cả, thì khi qua 0h00 thì day nhảy giá trị là 0 chứ ko phải 1 như trong datasheet nó báo là thanh ghi day chỉ chạy từ 1-7 ko có giá trị 0.
                            ^_^ góp ý chút xem có được ko, mình nghĩ có khi nào con DS của bạn lỗi ko, thử thay con khác xem, và nếu nó xuất 0 chứ ko phải xuất 1 thì bạn dùng 1 câu lệnh chuyển đổi rằng nếu day=0 thì hiển thị THU HAI
                            Website chính thức đổi địa chỉ website thành
                            Mời các bạn ghé thăm !!!

                            Comment


                            • #15
                              Nguyên văn bởi mast090 Xem bài viết
                              hjc, ko biết nhiều về AVR lên chỉ hiểu mỗi cái chỉnh giờ thôi, còn đâu chịu. nhưng mình nhắc bạn 1 điều rằng một khi đã set_time cho DS thì ko bao giờ có chuyện nó bị reset time khi reset VDK cả, 2 con này hoạt động độc lập nhau và DS còn có nguồn nuôi riêng để đề phòng mất điện, chỉ trừ trường hợp bạn ko lắp nguồn cho nó thôi
                              khi mà chưa set time lần nào cho VDK thì nó sẽ luôn cho giá trị các thanh ghi = 0, vì vậy trên LCD nó sẽ chỉ hiển thị tất cả các time =0, và khi set 1 lần rồi và có nguồn nuôi thì nó luôn tự đếm giờ và làm việc độc lập VDK
                              Mình nghĩ chắc bạn lập trình theo kiểu khởi tạo VDK, khởi tạo set time cho VDK rồi mới cho 1 vòng lặp vô tận 2 cặp lệnh đọc time+ hiển thị time ra. nếu làm thế này thì khi reset VDK thì chắc chắn nó sẽ tự reset luôn con DS. Bạn chỉ cần khởi tạo các thứ cần thiết cho VDK và LCD của bạn thôi, rồi nhảy luôn vào cái vòng lặp vô tận kia, khi chưa set_time cho nó thì nó cứ hiển thị giá trị 0 trên màn hình mà ko thay đổi, vào đây bạn chỉ nhấn phím để chỉnh time sau đó ghi giá trị này vào cho DS, lúc này DS sẽ tự đếm và xuất cho ta giá trị time cần
                              ////mà mình ko hiểu theo ý các bạn là set_time với set_day là gì mà lắm set thế, một khi chỉnh xong các giá trị về thời gian xong(cụ thể là chỉnh cho 7 thanh ghi) thì mình ghi lại cả 7 giá trị này cho DS chứ ko cần phải tách riêng rẽ thế
                              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.
                              Never forget who you are!

                              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