Thông báo

Collapse
No announcement yet.

Đóng mở port của AVR theo thời gian

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

  • Đóng mở port của AVR theo thời gian

    Hì hì, hay quá. Hôm nay được một anh bạn giới thiệu trang Web này. Vào thấy nhiều cái hay và mới quá. Hì hì, quái lạ sao từ trước tới giờ tớ chẳng biết cái trang này. Hì hì, hôm nay tiểu đệ xin gia nhập gia đình AVR của diễn đàn, kính mong các huynh trưởng giúp đỡ.

    Hì hì, đệ có một vấn đề mà cả tuần nay không giải quết được. Số là đệ nối con DS1307 với ATmega8515L. OK, chạy tốt, Không vấn đề gì. Như giờ đây đệ muốn cứ đúng 5 phút thì con AVR điểu khiển đèn LED sáng lên 1 phút rồi tắt, cứ thế .... Việc bật con LED đó lên thì OK rồi, Nhưng cái khó ở đây là cứ đúng 5 phút AVR mới bật và chỉ bật trong thời gian đúng 1 phút. Tức là ( Ví dụ nhé ) : thời gian đặt ban đầu là : 12:00:00 thì đúng 12:05:00 AVR sẽ bật đền LED lên và đúng 12:06:00 thì tắt đèn LED và đúng 12:11:00 giây bật lên, 12:12:00 tắt LED .... cứ như thế. Tiểu đệ đã làm thử mà chưa được, tiểu đệ đã tạo hàm trễ 5 phút và 1 phút bên trong chương trình. Nhưng khổ nỗi là tần số thời gian giữa VXL và DS1307 không giống nhau ( không bao giờ giống nhau ). Nên không đạt yêu cầu. ( thời gian theo DS1307, coi như thời gian của DS1307 là của hệ thống, giống như trong Mainboard có một con thời gian của hệ thống ấy )
    Xin các huynh trưởng chỉ bảo cho đệ với. Bí quá
    Cảm ơn các huynh nhiều
    Last edited by mainboard; 05-11-2006, 15:38.

  • #2
    Trời, đã có con RTC rồi mà còn tạo trễ nữa làm chi
    Bạn đọc các giá trị thời gian rồi quy đổi hết ra giây.
    Xong thì cứ kiểm tra giá trị thời gian hiện tại:
    if (Thời gian hiện tại - Thời gian đặt=300) //5phút
    { bật đèn }
    còn tắt đèn sau 1 phút thì cũng tương tự ha
    chunhanhoabattu :rose:

    Comment


    • #3
      Làm như anh Redrose chưa hay !, em có cách này anh thử xem: dùng bảng tra, do thời gian RTC đọc về chỉ từ 0-->59.
      Ta làm bảng tra

      const unsigned char LED()={0,0,0,0,0,1,0,0,0,0,0,1...}

      Giả sử biến lưu giá trị đọc về của RTC là phut, bạn nối LED vào chân nào đó tùy.
      Chỉ cần thêm một dòng vào chương trình chính, hoặc một ngắt timer nào đó dòng
      chân nối led = LED(phut); --> thía là OK thui.
      Không cần if then gì cả.

      Comment


      • #4
        uh cách làm rất hay. Nếu bài toán của bạn mainboard là cố định thì rất tuyệt.
        Nếu phụ thuộc vào thời gian đặt thì cũng phải if then nhiều
        chunhanhoabattu :rose:

        Comment


        • #5
          Hì hì, Tớ đã thử bằng 2 cách, cách của sư huynh Phamthaihoa rất đơn giản và hay, nhưng không linh hoạt khi thay đổi thời gian đặt. Còn của "sư huynh" Redrose thì linh hoạt hơn, chỉ hiểm mội nỗi số to quá, mệt muốn đứt hơi . Hì hì, cảm ơn hai huynh nhé. Ấy ấy mà không biết là cảm ơn "sư huynh" RedRose hay "Đại tỷ" RedRose đây, hì hì. Nếu gọi sai mong các vị đại ca thông cảm.

          Chán quá Add cái ảnh mainboard và hồ sơ mãi không được. Hình nhưng phần này bị hỏng.
          Last edited by mainboard; 06-11-2006, 19:43.

          Comment


          • #6
            Hì hì, ý tớ là so sánh như vậy nhưng bạn có thể so sánh từng số (giờ, phút) thôi.

            Have fun with AVR :P
            chunhanhoabattu :rose:

            Comment


            • #7
              chao cac ban
              mình mới tập tò vào vdk
              các baạn có thể giúp mình mạch : dung VDK để đóng ngắt role
              minh xin cám ơn nhiều
              phanungnhanhanh@yahoo.com
              |

              Comment


              • #8
                to phanungnhanh

                Nguyên văn bởi phanungnhanh Xem bài viết
                chao cac ban
                mình mới tập tò vào vdk
                các baạn có thể giúp mình mạch : dung VDK để đóng ngắt role
                minh xin cám ơn nhiều
                phanungnhanhanh@yahoo.com
                tớ cũng mới tập học với AVR trước được học 89c51 thì tớ thấy với cái này bạn cứ nối chân AVR vào 1 con Tran sau đó nối Relay với Tran đó lúc này điều khiên như với led đơn thôi.Bạn thử xem thế nào
                gmail:

                Comment


                • #9
                  Nếu thời gian đặt là lẻ. Ví dụ: 0,5; 1,5; .... thì cách của bạn phamthaihoa không dùng được

                  Comment


                  • #10
                    Nguyên văn bởi hungnp Xem bài viết
                    Nếu thời gian đặt là lẻ. Ví dụ: 0,5; 1,5; .... thì cách của bạn phamthaihoa không dùng được
                    hihi ý bạn là sao nhỉ? thời gian đặt lẽ là sao? theo tôi nghĩ thì thời gian khi đặt ví dụ như 10(giờ):30(phút):20(giây). có chăng chính xác lắm nữa là thêm vài con số phần trăm của giây nữa thôi nhưng đối với DS1307 thì cái này không thể. Vì vậy theo thôi tôi ta cứ dùng một mảng gồm 3 số char lưu {giờ, phút, giây} để cài đặt giờ bắt đầu , một char nữa là cài khoảng cách sau một lần chuông reo {0, phút, giây}; một char nữa là cài thời gian reo {0, phút, giây}; và cái cuối cùng là {giờ, phút, giây} để đọc từ DS1307 và lưu vào đó.
                    Ta viết một chương trình ngắt ngoài nhờ cái sqwout của DS1307 đọc giờ và so sánh với giờ cài đặt nếu bằng nhau thì cho thực hiện vậy. Sau khi thực hiện xong nhớ tích lũy thêm giờ cài đặt cho lần sau nhé ( cứ cộng thêm mấy cái giây, phút, giờ nhé: nhớ khi cộng giây hơn = 60 thì thêm phút 1 nhé, và tương tự cho phút, riêng giờ thì hơn = 24 thì về 0 nhé và không cần nhớ cho ngày nữa đâu)

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X