Thông báo

Collapse
No announcement yet.

Watchdog là gì?

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

  • Watchdog là gì?

    Chào các cao thủ, em nghe bác Bình Anh có nói rằng chức năng Watchdog gần như ko thể thiếu trong các ứng dụng cho VĐK, vậy nó để làm gì? nó hoạt động như thê nào? sao em thấy con 89C52 ko có chức năng này nhỉ?
    Bác nào có thêm 1 ví dụ mẫu về code sử dụng watchdog thì hay quá!

  • #2
    Watchdog là thế này...

    Đó chẳng qua là một bộ đếm có chức năng reset lại vi điều khiển khi xảy ra sự kiện tràn (overflow). Giả sử nó là bộ đếm 8 bit thì khi đếm từ 255 lên 256 (tức là tràn về 0) thì sẽ tự động reset lại vi điều khiển. Xung nhịp clock đưa vào đếm thường được lấy từ clock cung cấp cho CPU, sau đó cho qua một bộ chia tần trước khi đưa vào watchdog.

    Tất nhiên là chúng ta không dùng watchdog để "reset vi điều khiển theo chu kỳ"! Chúng ta cho nó chạy, nhưng trong thân chương trình của chúng ta sẽ có các lệnh reset lại watchdog (tức là xóa giá trị đếm của nó để nó không thể đếm lên cao và gây ra tràn). Các vi điều khiển khác nhau thì có các phương pháp reset watchdog riêng của chúng, có thể là ghi giá trị 0 vào thanh ghi đếm của watchdog, có thể là tác động lên một bit nào đó, cũng có loại cung cấp sẵn một lệnh reset watchdog trong tập lệnh của nó... Đương nhiên chúng ta phải tính toán (chọn tần số clock, vị trí đặt lệnh reset watchdog...) để luôn reset watchdog trước khi nó tràn. Mục đích chính của việc sử dụng watchdog là chống lại các tình huống lỗi do phần mềm, khi mà vi điều khiển thực hiện một vòng lặp chết (dead loop), không thoát ra được. Khi đó do không thực hiện được các lệnh reset watchdog nên nó sẽ tràn, tự động reset lại hệ thống, thoát khỏi tình trạng "bị treo" trong vòng lặp chết.

    Comment


    • #3
      Re: Watchdog là thế này...

      Nguyên văn bởi blackmoon
      Đó chẳng qua là một bộ đếm có chức năng reset lại vi điều khiển khi xảy ra sự kiện tràn (overflow). Giả sử nó là bộ đếm 8 bit thì khi đếm từ 255 lên 256 (tức là tràn về 0) thì sẽ tự động reset lại vi điều khiển. Xung nhịp clock đưa vào đếm thường được lấy từ clock cung cấp cho CPU, sau đó cho qua một bộ chia tần trước khi đưa vào watchdog.

      Tất nhiên là chúng ta không dùng watchdog để "reset vi điều khiển theo chu kỳ"! Chúng ta cho nó chạy, nhưng trong thân chương trình của chúng ta sẽ có các lệnh reset lại watchdog (tức là xóa giá trị đếm của nó để nó không thể đếm lên cao và gây ra tràn). Các vi điều khiển khác nhau thì có các phương pháp reset watchdog riêng của chúng, có thể là ghi giá trị 0 vào thanh ghi đếm của watchdog, có thể là tác động lên một bit nào đó, cũng có loại cung cấp sẵn một lệnh reset watchdog trong tập lệnh của nó... Đương nhiên chúng ta phải tính toán (chọn tần số clock, vị trí đặt lệnh reset watchdog...) để luôn reset watchdog trước khi nó tràn. Mục đích chính của việc sử dụng watchdog là chống lại các tình huống lỗi do phần mềm, khi mà vi điều khiển thực hiện một vòng lặp chết (dead loop), không thoát ra được. Khi đó do không thực hiện được các lệnh reset watchdog nên nó sẽ tràn, tự động reset lại hệ thống, thoát khỏi tình trạng "bị treo" trong vòng lặp chết.
      Không hổ danh là Bắc Hiệp, ngày xưa luyện kiếm nối Back' Khoa võ đường, rồi ẩn cư ở SEEN cốc học bí kíp võ công thượng thừa! Tại hạ cũng góp vui vài chiêu thức mong Bắc Hiệp ko chê cười:

      Hầu hết vi điều khiển PIC(AVR tui đoàn cũng vậy) đều có bộ dao động riêng(độc lập với bộ dao động hệ thống) dành riêng cho Watchdog. Điều này hay hơn, bởi các lý do:

      1-Đỡ phải chia nhiều(ví dụ bộ dao động watchdog timer của pic khỏang 8ms, có thể dùng các bộ prescale để giảm clk wdog).

      2-Wd hoạt động được ở cả chế độ "ngủ thật". Vì tại chế độ ngủ này, CLK của hệ thống ngừng hoạt động.

      3-Trong chế độ vừa ngủ vừa Watchdog enable, một số vđk đã thiết kế là: đang ngủ--> bị Watchdog timer--> nó ko khởi động lại mà là thức MCU thức dậy. PIC thiêt kế như vậy. Bởi thế có thể dùng chung chúng để tiết kiệm nguồn và vẫn có wdog để tăng độ tin cậy.

      Watchdog để reset nếu bị lỗi phần mềm:
      1-Do người lập trình.
      2-Do vi điều khiển bị treo do nhiễu tác động vài nguồn hay nhiễu kiểu điện từ trường... cường độ cao xông thẳng vào chip.

      Comment


      • #4
        Đây là 1 ví dụ về watchdog họ 8051.

        WMCON DATA 96h ; watchdog and memory control register

        orl WMCON, #00100000b ; 32-ms
        orl WMCON, #00000001b ; watchdog enable
        loop:
        .
        .
        .
        orl WMCON, #00000010b ; watchdog reset
        jmp loop

        Comment


        • #5
          Họ AT89C51 của Atmel thì có kiểu Watchdog mềm: có thể thay đổi khi đang chạy, được enable hoặc disble bằng phần mềm.
          Trong khi đó một số họ vđk như PIC lại config cứng(khi nạp), trong quá trình chạy không thể enable hoặc disble được.
          Theo tui, kiểu của PIC có vẻ an toàn hơn, bởi lẽ nếu vi điều bị nhiễu tác động đúng vào bit enable->disble thì khá nguy hiểm.

          Comment


          • #6
            Em dùng PIC, Như vậy khi dùng WatchDog thì sau một khoảng thời gian nếu không clear WatchDog thì nó sẽ Reset lại, Em muốn biết chính xác thời gian đó là bao nhiêu, đọc datasheet mãi mà chưa hiểu ? Và tính nó như thế nào ?

            Comment


            • #7
              Nguyên văn bởi 877A
              Em dùng PIC, Như vậy khi dùng WatchDog thì sau một khoảng thời gian nếu không clear WatchDog thì nó sẽ Reset lại, Em muốn biết chính xác thời gian đó là bao nhiêu, đọc datasheet mãi mà chưa hiểu ? Và tính nó như thế nào ?
              Bạn xem phần "Electrical Characteristics" của datasheet là có đó. Viết rất chi tiết.
              Watchdog Timer Time-out Period là 7-33ms, bình thường là 18ms. Trong lập trình thì nên cẩn thận coi watchdog là 7ms.
              Ngoài ra nếu dùng Prescale thì thời gian được nhân lên: 1,2,4...128 lần tùy theo việc thiết tại "OPTION_REG REGISTER"

              Comment


              • #8
                Về WDT bác BA đã giải thích rõ ràng roài, tôi thấy trong PIC tutorial của Nigel (cảm ơn ai đó đã dịch ra tiếng Việt) có nói về WDT, xin phép được post lên để chúng ta cùng tham khào :
                Watchdog Timer:
                Watchdog Timer là cái gì?
                Giả sử bạn viết một chương trình, bạn mong đợi chương trình này sẽ chạy nếu không có gì trục trặc xảy ra thì nó sẽ không bao giờ dừng lại, như vậy bạn phải làm một vòng lặp để khi chương trình chạy đến điểm cuối thì nó lại quay trở về điểm bắt đầu. Nhưng mà hãy xem một trường hợp:

                Giả sử chương trình kiểm tra một chân input, nếu nó lên mức cao thì con Pic sẽ tiếp tục kiểm tra một chân input thứ hai có lên mức cao hay không, nếu chân input thứ hai không lên mức cao, con Pic sẽ ngồi đó chờ và nó sẽ chỉ thoát ra khỏi chỗ ngồi của nó nếu chân input thứ hai lên mức cao.

                Bây giờ hãy xem một trường hợp khác, giả sử như bạn viết một chương trình, bạn compiled nó thành công, và ngay cả bạn đã cho chạy mô phỏng từng bước, từng bước một trên máy tính, bằng MPLAB chẳng hạn, có vẽ như mọi chuyện đều tốt, bạn đem nạp vào con Pic. Sau một thời gian chạy thử, con Pic thình lình bị kẹt vào nơi nào đó trong chương trình mà không thể thoát ra được trạng thái hiện tại.

                Điều gì là cần thiết để giải quyết hai trường hợp trên, reset lại hay vẫn để cho nó bị kẹt không thoát ra được ?, đó là mục đích của mạch watchdog.
                Mạch watchdog thì không phải là mới mẽ gì, có rất nhiều microprocessors và microcontrollers đã có mạch watchdog, nhưng mà nó làm việc ra sao?.

                Bên trong con Pic có một mạch RC, mạch này cung cấp 1 xung Clock độc lập với bất kỳ xung Clock nào cung cấp cho Pic. Khi Watchdog Timer (viết tắt là WDT) được cho phép (enabled), nó sẽ đếm bắt đầu từ 00 và tăng lên 1 cho đến FFh, khi nó tăng từ FFh đến 00 ( FFh+1) thì con Pic sẽ bị Reset bất kể đang làm gì, chỉ có 1 cách là ngăn không cho WDT đếm tới 00.
                Khi con Pic bị kẹt không thể thoát ra khỏi tình trạng hiện tại thì WDT vẫn tiếp tục đếm mà không bị bất kỳ điều gì ngăn cấm nó đếm tới FF và đến FF+1, vì vậy nó sẽ reset con Pic làm cho chương trình phải khởi động lại từ đầu.

                Để sử dụng WDT chúng ta cần làm 3 việc.
                Thứ nhất, cần thời gian bao lâu để reset WDT?.
                Thứ hai, làm sao xoá WDT?.
                Cuối cùng, chúng ta phải nói cho con Pic biết chương trình cho phép WDT hoạt động.

                Bây giờ bạn hãy xem từng cái một:
                Trong Datasheet của con Pic có nói rằng, WDT có thời gian từ lúc Start cho đến khi kết thúc là 18ms, tuy nhiên nó cũng phụ thuộc vào vài yếu tố, nguồn cung cấp, nhiệt độ của con Pic bởi vì mạch dao động của WDT là RC. Tuy nhiên chúng ta cũng có thể làm cho thời gian dài hơn. Bên trong con Pic có một cái gọi là Prescaler tạm dịch là đặt tỷ lệ, chúng ta có thể lập trình để chia xung Clock của mạch RC, chúng ta chia RC Clock càng
                nhiều thì thời gian WDT reset càng dài.Prescaler nằm trên thanh ghi OPTION có địa chỉ 81h từ bit0 đến bit2, bên dưới là bảng chia tỷ lệ thời gian WDT.

                Bit 2 1 0 Rate WDT Time
                0 0 0 1:1 18mS
                0 0 1 1:2 36mS
                0 1 0 1:4 72mS
                0 1 1 1:8 144mS
                1 0 0 1:16 288mS
                1 0 1 1:32 576mS
                1 1 0 1:64 1.1Seconds
                1 1 1 1:128 2.3Seconds

                Hãy nhớ rằng các khoảng thời gian này không phụ thuộc vào tần số xung Clock bên ngoài, nó xác định bằng thời gian thực chứ không phải đếm chu kỳ xung clock. Hãy xem ví dụ WDT sẽ reset con Pic trong khoảng ½ giây khi con Pic bị kẹt. Giá trị gần nhất mà ta có theo bảng trên là 576mS hoặc 0.576 seconds.
                Đầu tiên chúng ta gởi giá trị b’101’ tới thanh ghi OPTION, như sau:

                movlw b’101’ ;This is 0x05 in Hex
                movwf 81h ;This is the Option Register

                Quá đơn giản !, bây giờ, có một mẹo nhỏ.
                Mặc nhiên prescaler được gán cho một bộ định thời khác, vì vậy ta phải thay đổi toàn bộ WDT. Trước tiên phải reset một bộ đếm khác tới giá trị 0, sau đó chuyển sang Bank1 để gán prescaler cho WDT và thiết lập thời gian rồi sau đó lại quay về Bank0, đoạn code bên dưới với xx là giá trị ta sẽ chọn cho prescaler.

                Bcf STATUS,0 ;make sure we are in Bank 0
                Clrf 01h ;address of the other timer – TMR0
                Bsf STATUS,0 ;switch to Bank 1
                Clrwdt ;reset the WDT and prescaler
                movlw b’1xxx’ ;Select the new prescaler value and assign
                movwf OPTION ;it to WDT
                bcf STATUS,0 ;come back to Bank 0

                Lệnh CLRWDT là để xoá WDT, chúng ta phải làm điều này trước khi nó reset con Pic, chúng ta cần tính toán nơi nào trong chương trình mà bộ đếm của WDT sẽ tràn để đặt lệnh CLRWDT trước thời điểm này để bảo đảm con Pic không reset. Nếu chương trình của bạn dài, có thể phải đặt hơn 1 lệnh CLRWDT trong chương trình. Ví dụ bạn sử dụng giá trị default mặc nhiên là 18ms thì phải bảo đảm rằng chương trình sẽ nhìn thấy
                lệnh CLRWDT sau mỗi 18ms.

                Bây giờ chúng ta phải tìm cho ra đoạn code của chúng thực thi trong thời gian thực là bao lâu, nguyên lý thì rất đơn giản nhưng mà có thể làm cho bạn dựng cả tóc lên đấy !.

                Comment


                • #9
                  Hỏi đáp

                  Vậy cho tui hỏi khi nào thì xảy ra hiện tượng tràn bộ nhớ?
                  Khi nào thì Watchdog làm việc?
                  Tui cũng viết vài chương trình con con và chưa bao giờ thấy tràn. Có phải khi sử dụng hết 4k ROM bộ nhớ mới tràn không?
                  :rose: You can win if you want :rose:

                  Comment


                  • #10
                    Vậy cho tui hỏi khi nào thì xảy ra hiện tượng tràn bộ nhớ?
                    Bộ nhớ nào? chương trình hay dữ liệu? bộ nhớ chương trình nếu viết vượt quá dung lượng có sẵn trên chip thì khi nạp cũng báo lỗi rồi. Còn tràn bộ nhớ dữ liệu thì nguy hiểm hơn, thường là khi bạn không quản lý được dung lượng lớn nhất của stack. Trường hợp này thì toi hẳn.

                    Khi nào thì Watchdog làm việc?
                    Khi bạn cho phép nó chạy.

                    Comment


                    • #11
                      Nguyên văn bởi voanhkiem
                      Vậy cho tui hỏi khi nào thì xảy ra hiện tượng tràn bộ nhớ?
                      Khi nào thì Watchdog làm việc?
                      Tui cũng viết vài chương trình con con và chưa bao giờ thấy tràn. Có phải khi sử dụng hết 4k ROM bộ nhớ mới tràn không?
                      Chào ngươi đến từ thế giới khác
                      Đúng như BH nói rồi.
                      Việc lập trình để "tràn cả bộ nhớ chương trình" và "bộ nhớ dữ liệu" thì lỗi là do người lập trình. Bởi vậy, cần nắm rõ về con vdk bạn sử dụng.

                      Watchdog có thể reset lại khi gặp lỗi này, khi tràn RAM, Stack... nhưng ko nên lạm dụng quá vào Watchdog khi mình lập trình lỗi. Bởi watchdog chỉ khắc phục sự cố khi treo thôi. Chứ nó ko dạy cho bạn là tràn RAM phải như thế này, hay tràn ROM phải như thế kia đâu. Nói túm lại:
                      -Ko nên lạm dụng nó quá mức.
                      -Nó ko là công cụ đa năng cho mọi trường hợp lỗi. Nhất là bạn lập trình lỗi mà ko treo thì nó bó tay.
                      -------------------

                      Comment


                      • #12
                        xin hỏi ngoài luồng 1 chút.
                        Các bác xử lý phần lọc nhiễu = hardware ntn nếu MCU làm việc trong môi trường đại khái như ý 2 của bác BA
                        "2-Do vi điều khiển bị treo do nhiễu tác động vài nguồn hay nhiễu kiểu điện từ trường... cường độ cao xông thẳng vào chip."

                        Comment


                        • #13
                          Tôi nghĩ lọc nhiễu bằng các cuộn chặn, tụ điện hoặc có thể Bọc kim nếu dùng tụ lọc và cuộn dây chưa đạt yêu cầu, nếu đã bọc kim + lọc nguồn mà vẫn treo thì xem lại cái con vi điều khiển , đưa nó làm việc khác rồi mua con cao cấp hơn , chịu kháng nhiễu tốt hơn rồi đưa vào đấy .. Hè hè . Chắc là có chiêu ấy.
                          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                          Comment


                          • #14
                            Ngoài cách trả lời của các bạn, có một cách giải thích về WD thế này. Trên buồng lái tàu hỏa hiện nay, để tránh người lái tàu ngủ gật, người ta đã đặt một cái mạch đếm (lùi hay tiến gì đấy). Nếu người lái tầu không thường xuyên đưa tay ấn cái nút qui định, lập tức sẽ có chuông báo (và có thể sẽ bị trừ tiền thưởng). Đấy là hình ảnh về sự làm việc của watchdog timer.
                            Sống: Rượu ngon và gái đẹp
                            Chết: vì Tổ Quốc

                            Comment


                            • #15
                              Nguyên văn bởi Viet Anh
                              Ngoài cách trả lời của các bạn, có một cách giải thích về WD thế này. Trên buồng lái tàu hỏa hiện nay, để tránh người lái tàu ngủ gật, người ta đã đặt một cái mạch đếm (lùi hay tiến gì đấy). Nếu người lái tầu không thường xuyên đưa tay ấn cái nút qui định, lập tức sẽ có chuông báo (và có thể sẽ bị trừ tiền thưởng). Đấy là hình ảnh về sự làm việc của watchdog timer.
                              Hoặc là thế này.
                              Một người đi xe máy liên tục ko nghỉ trên 1 con đường vô tận, nếu chạy liên tục thì cứ sau 10 tiếng đồng hồ sẽ hết xăng.--->T watchdog=10 h. Bởi vậy để an toàn khi chạy , cứ khoảng vài tiếng anh lái xe lại dừng lại đổ đầy bình xăng. (Vì nếu ko, quá 10h liên tục anh ta ko đổ xăng thì tai nạn giao thông có thể xảy ra do xe chạy tốc độ cao hết xăng đột ngột)
                              -------------------

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X