Thứ Tư, 28 tháng 11, 2018

Bài 5. PIC 18F450 Chế Độ WatchDog Timer

Giới thiệu

  • Watchdog Timer (WDT) có thể hữu ích để tự động thiết lập lại hệ thống bất cứ khi nào một thời gian chờ xảy ra.
  • Yêu cầu đặt lại hệ thống để ngăn chặn sự cố của hệ thống trong trường hợp lỗi phần cứng hoặc lỗi chương trình.
  • Có rất nhiều ứng dụng mà hệ thống không thể đủ khả năng để bị mắc kẹt tại một điểm (thậm chí không cho một khoảng thời gian nhỏ). Ví dụ, trong một hệ thống radar, nếu hệ thống treo trong 5 phút, nó có thể dẫn đến hậu quả nghiêm trọng (một máy bay địch hoặc tên lửa có thể không bị phát hiện dẫn đến tổn thất rất lớn).
  • Hệ thống phải đủ mạnh để tự động phát hiện lỗi nhanh chóng và tự thiết lập lại để phục hồi từ các lỗi và hoạt động bình thường mà không có lỗi.
  • Người ta có thể tự thiết lập lại hệ thống để phục hồi từ lỗi. Nhưng nó không phải là luôn luôn khả thi để tự thiết lập lại hệ thống, đặc biệt là một khi nó đã được triển khai.
  • Để khắc phục những vấn đề như vậy, một bộ đếm thời gian giám sát là cần thiết để tự động thiết lập lại hệ thống mà không cần sự can thiệp của con người.

Watchdog Timer hoạt động như thế nào?
  • Watchdog timer được nạp với khoảng thời gian chờ phụ thuộc vào ứng dụng.
  • Các bộ đếm thời gian watchdog bắt đầu đếm của nó độc lập của một đồng hồ hệ thống tức là nó có bộ dao động nội bộ riêng biệt để làm việc độc lập của một đồng hồ hệ thống.
  • Watchdog hẹn giờ xóa thông qua phần mềm mỗi lần trước khi khoảng thời gian chờ xảy ra.
  • Bất cứ khi nào phần mềm không thể xóa bộ đếm thời gian giám sát trước khoảng thời gian chờ của nó, thì bộ đếm giờ giám sát sẽ đặt lại hệ thống.
  • Với mục đích này, bộ đếm thời gian giám sát được sử dụng để khắc phục lỗi phần mềm trong các ứng dụng thời gian thực.
  • Watchdog timer cũng được sử dụng để đánh thức vi điều khiển từ chế độ ngủ.

Bên trong của PIC18F4550 Watchdog Timer

  • Trong PIC18F4550, bộ đếm thời gian giám sát sử dụng đồng hồ INTRC 31 kHz khác nhau và nó độc lập với đồng hồ hệ thống.
  • Watchdog Timer có thể được kích hoạt bằng hai cách thông qua Configuration Register (CONFIG2H) và thông qua WDTCON Register.
  • CONFIG2H có bit WDTEN để bật / tắt bộ đếm giờ giám sát.
  • WDTCON (thanh ghi điều khiển WDT) có bit SWDTEN được sử dụng để bật / tắt WDT thông qua phần mềm.
Dưới đây hình. cho thấy WDT hoạt động như thế nào trong PIC18F4550.
Watchdog Timer Sơ đồ mạch bên trongWatchdog Timer hoạt động


  • Khi WDT được bật, nguồn INTRC 31 kHz được khởi tạo và cung cấp đồng hồ cho bộ đếm thời gian watchdog.
  • Đồng hồ này sau đó được chia cho 128 (pre-scaler). Trình mở rộng trước này cho thời gian hết hạn danh nghĩa là 4 ms.
  • PIC18F4550 cũng có chức năng Post-scaler có thể lập trình giúp phân chia đầu ra trước khi mở rộng WDT và tăng thời gian chờ. Vì vậy, bây giờ chúng ta có thể thay đổi khoảng thời gian chờ trong khoảng từ 4ms đến 131.072 giây (2.18 phút) bằng cách sử dụng Post-scaler.

Bật và tắt WDT

Có hai cách để bật hoặc tắt WDT được cung cấp như sau:
1.      Thông qua đăng ký cấu hình:
CONFIG2H Đăng ký: Cấu hình Đăng ký 2 Cao
Cấu hình Đăng ký cho Watchdog Timer

Bit 0 - WDTEN: Watchdog Timer Bật bit
            0 = Tắt WDT (có thể kích hoạt WDT thông qua SWDTEN)
            1 = Bật WDT
Bit 4: 1 - WDTPS3: WDTPS0: Watchdog Timer Chọn bit tỷ lệ
            1111 = 1: 32768
            1110 = 1: 16384
            1101 = 1: 8192
            1100 = 1: 4096
            1011 = 1: 2048
            1010 = 1: 1024
            1001 = 1: 512
            1000 = 1: 256
            0111 = 1: 128
            0110 = 1:64
            0101 = 1:32
            0100 = 1:16
            0011 = 1: 8
            0010 = 1: 4
            0001 = 1: 2
            0000 = 1: 1
1.      Thông qua đăng ký WDTCON:
WDTCON Đăng ký: Watchdog Timer Control Đăng ký
WDTCON đăng ký phần mềm WDT
Bit 0 - SWDTEN: Phần mềm Watchdog kiểm soát phần mềm Timer Kích hoạt bit
            0 = Vô hiệu hóa Watchdog Timer
            1 = Bật bộ hẹn giờ Watchdog
Bộ đếm thời gian giám sát kiểm soát phần mềm này có thể kích hoạt bộ đếm thời gian giám sát chỉ khi bit cấu hình đã vô hiệu hóa WDT.
Nếu WDTEN (bit cấu hình) được bật, thì SWDTEN không có hiệu lực.
Cách tính thời gian chờ WDT
​​​​​​​Tính toán thời gian chờ WDT
Tính toán thời gian chờ WDT

Ví dụ
Nếu chúng tôi định cấu hình WDTPS3 sau scaler : WDTPS0 = 1001 tức là 512 là Post-scaler,
31 kHz / 128 = 242,1875
Hiện nay,
Out = 242,1875 / 512 = 0,473
Khoảng thời gian chờ = 1 / 0,473 = 2,11 giây

Chương trình

  • Có hai cách để sử dụng Watchdog Timer trong PIC18F4550. Ở đây, chúng tôi nháy đèn LED liên tục và chúng bị kẹt ở giữa.
  • Sau đó, WDT đặt lại vi điều khiển PIC18F4550 sau một khoảng thời gian chờ cụ thể bắt đầu nhấp nháy của đèn LED một lần nữa. Khi đặt lại WDT xảy ra, nó hiển thị trên LCD16x2.
Lưu ý : TO 'bit trong thanh ghi RCON cho biết trạng thái xuất hiện thời gian chờ WDT.
Cấu hình đăng ký WDT được kiểm soát
#include "Configuration_Header_File.h"
#include "LCD_16x2_8-bit_Header_File.h"
#include <pic18f4550.h>

#pragma config WDT = ON         /* Watchdog Timer Enable bit (WDT enabled)*/
#pragma config WDTPS = 256      /* Watchdog Timer Postscale Select bits */


void Dummy_Stuck();

#define LED LATB
#define PORT_Direction TRISB

void main(void) 
{
    int count;
    PORT_Direction = 0;         /* set port as output port */
    OSCCON = 0x72;              /* use internal oscillator frequency, 8 MHz*/
    LCD_Init();
    if(!RCONbits.TO)            /* check for WDT reset occurense */
        LCD_String_xy(1,0,"WDT Reset");
    MSdelay(1000);
    LCD_Clear();
    count = 0;
    LED = 0;
    while(1)
    {
        LED = ~LED;             /* Toggle LED */
        MSdelay(100);              
        CLRWDT();               /* Clear Watchdog Timer */
        count++;
        if(count>20)
            Dummy_Stuck();      /* Dummy Stuck loop function */
    }
}



void Dummy_Stuck()
{
    while(1);                   /* wait till watchdog timeout and then reset system */
}
​​​​​​​
Kiểm soát phần mềm WDT
​​​​​​​
#include "Configuration_Header_File.h"
#include "LCD_16x2_8-bit_Header_File.h"
#include <pic18f4550.h>

#pragma config WDT = OFF         /* Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))*/
#pragma config WDTPS = 512       /* Watchdog Timer Postscale Select bits */


void Dummy_Stuck();

#define LED LATB
#define PORT_Direction TRISB

void main(void) 
{
    int count;
    PORT_Direction = 0;         /* set port as output port */
    OSCCON = 0x72;              /* use internal oscillator frequency, 8 MHz*/
    LCD_Init();
    WDTCONbits.SWDTEN = 1;      /* enable software controlled watchdog timer*/
    if(!RCONbits.TO)            /* check for WDT reset occurrence */
        LCD_String_xy(1,0,"WDT Reset");
    MSdelay(1000);
    LCD_Clear();
    count = 0;
    LED = 0;
    while(1)
    {
        LED = ~LED;             /* Toggle LED */
        MSdelay(100);              
        CLRWDT();               /* Clear Watchdog Timer */
        count++;
        if(count>20)
            Dummy_Stuck();      /* Dummy Stuck loop function */
    }
}

void Dummy_Stuck()
{
    while(1);                   /* wait till watchdog timeout and then reset system */
}

Code mô phỏng
Code kiểm soát phàn mềm WDT

Không có nhận xét nào:

Đăng nhận xét