This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Watch Dog Timer!

Hi, I need to know how to use the WDT in the P89LPC932. I have selected its internal oscillator as the clock source. However, I do not know if it would consume more power than selecting the PCLK as its clock source.
Also, how can I find out if the WDT is working fine. Do I need an infinite loop on this function? When do I call it?
I have select WDTE = 1; and WDSE = 0; in the UCFG1 register. Sorry for so many questions, but I am still a beginner on this.
Thank you


void Watch_Dog (void)
{
EA = 0;
WDCON = 0x05; //start WDT, and select WD oscillator
WDL = 0xFF;
WFEED1 = 0x0A5; //feed sequence
WFEED2 = 0x05A;
EA = 1;
}

  • for debugging purposes, I recommend that you make a macro e.g. KICK_THE_PUPPY so that you can enable the watchdog for non-debug and disable it for debug in one place (the first 'kick' enables the wd forever). A simple way to test the WD functioning during development is just to start kicking it and it must then time out.

    Erik

  • Erik, do you know where can I find samples of this function. On how to use the WDT.
    I am working on the "KICK_THE_PUPPY".
    Thank you

  • do you know where can I find samples of this function. Not a function, make a macro of the two writes (see datasheet).

    Erik

  • Erik, this is what I did. I do not understand what is going on here. cacn you explain. I am sorry, but this is more complicated than I thought. I opened the WDT peripheral, but all I see is numbers running and running. Help.

    #include <Reg932.h>
    #include <stdio.h>


    void init(void);
    void brkrst_init(void);
    void Kick_the_Puppy(void);

    void Main(void)
    {
    init();
    brkrst_init();
    Kick_the_Puppy();

    }

    void init(void)
    {
    P1M1 = 0x00; // Quasi-bidirectional
    P1M2 = 0x00;
    P2M1 = 0x00; // push pull output
    P2M2 = 0xFF;
    P0M1 = 0x00;
    P0M2 = 0xFF; //Output
    ES = 1; // enable UART interrupt
    EA = 1;
    }

    void brkrst_init(void) // This function allows ISP entry through the UART break detect
    {
    //AUXR1 |= 0x40; // enable reset on break detect, pg. 102
    SCON = 0x50; // select the BRG as UART baud rate source, pg. 60
    SSTAT = 0x00; //Timer1
    BRGR0 = 0x70; // 9600 BAUD at @ 7.373MHz internal RC oscillator
    BRGR1 = 0x04;
    BRGCON = 0x03; // enable BRG, pg. 59
    }

    void Kick_the_Puppy(void)
    {
    EA = 0;
    WDCON = 0x05; //start WDT, and select WD oscillator
    WDL = 0xFF;
    WFEED1 = 0x0A5; //feed sequence
    WFEED2 = 0x05A;
    EA = 1;
    while(1);
    }

  • Only the a5/5a load is required to keep the watchdog alive
    so the code should be

    #define KICK_THE_PUPPY WFEED1 = 0x0A5;        WFEED2 = 0x05A;
    
    void Initialize_the_Puppy(void)
    {
    EA = 0;
    WDCON = 0x05; //start WDT, and select WD oscillator
    WDL = 0xFF;
    KICK_THE_PUPPY
    EA = 1;
    while(1); // for test
    }

    now, with the above code the watchdog should reset, but how do you propose to see if it does?

    Erik

  • I have no Idea how to find out if it does reset? uhmm...what about an LED lighting after a reset? if this is a good idea, where in the code should I place that instruction...sorry, but I have no idea, but I want to learn this please.
    Thank you

  • there is/are a/some bit(s) for "reset cause"
    read up on therm and you will know how

    Erik

  • Are you talking about the Reset Pin Enable (RPE) bit or the R_EX (external reset flag)?

    Thank you

  • I am willing to help, but do not have the time to read the datasheet for you

    Erik

  • Erik, I had to go way from this question, because as you have seen I have to take care of other parts of my program like the external interrupt.
    To see if the WDT resets (i guess (meaning it is working fine)) could I cause a software reset? what about if it does not work fine...how do I do that.
    There is register called AUXR1 which has a bit for sotfware reset. This will be a good way to know if the WDT is reseting! or do you have a better idea.
    Thank you!

  • There is register called AUXR1 which has a bit for sotfware reset
    The bit is a bit more intricate than that. You must toggle it after a cold reset to get any use out of it.

    Erik

    PS in 'standard 51 language' AUXR1 is not not a register, it is a SFR.

  • I will toggle the SFR AUXR1. But do you think it will be a good exercise...?
    Let me just make sure...if the WDT resets (works fine) then a software reset should happens by if I set up AUXR1 correctly...right?
    Then toggle that pin. And this should repit.
    Right?
    Thanks

  • then a software reset should happens by if I set up AUXR1 correctly
    No, the bit - not "pin" - indicates that a sw reset took place, ir does not make it happen.

    If you just want to test the watchdog insert a while(); temporarily.

    Erik

  • OK, Erik I will do this today and let you know thank you. I still have not resolved my problem with the external interrupt and Power Down, but that will be a different question at a different time.

  • Erik below is the program I am using to test the WDT. I run it by using only the simulator and it worked fine (I think). This is the sample program "blinky" where port 2 shifts from right to left and left to right. The way I have it here is as follows: as soon as it finishes shifting from right to left, it initializes the WDT and after an overflow, occurs it resets the program.
    I am still a bit confused. What about in my real application when should I called or initialized the WDT.
    For what I understand the WDT should always overflow. If it does not (underflowing) then it means a software error while executing occured. therefore, the WDT will cause an system reset. Right?
    How can I keep a count of WDT underflowing... is there an interrupt for it, or just when it is used as a timer. If so what else should be included there. I have never worked with WDT before so this is new to me.

    Thanks for your help.

    #include <Reg932.h>
    #include <stdio.h>
    #include <String.h>
    UCFG1 = 0x88;

    void init(void);
    void brkrst_init(void);
    void Initialize_the_Puppy(void);
    #define KICK_THE_PUPPY WFEED1 = 0x0A5; WFEED2 = 0x05A;
    void delay (unsigned int cnt)
    {
    while (--cnt);
    }

    void Main(void)
    {
    brkrst_init();
    {
    unsigned char i;
    P2M1 = 0;
    for(;;)
    {
    for (i = 0x01; i; i <<= 1)
    { P2 = i; // simulate running lights
    delay (50000);
    }
    Initialize_the_Puppy();
    for (i = 0x80; i; i >>= 1)
    { P2 = i;
    delay (50000);
    }

    }
    }
    }

    void brkrst_init(void) // This function allows ISP entry through the UART break detect
    {
    //AUXR1 |= 0x40; // enable reset on break detect, pg. 102
    SCON = 0x50; // select the BRG as UART baud rate source, pg. 60
    SSTAT = 0x00; //Timer1
    BRGR0 = 0x70; // 9600 BAUD at @ 7.373MHz internal RC oscillator
    BRGR1 = 0x04;
    BRGCON = 0x03; // enable BRG, pg. 59
    }

    void Initialize_the_Puppy(void)
    {
    EA = 0;
    WDCON = 0x05; //start WDT, and select WD oscillator
    WDL = 0xFF;
    KICK_THE_PUPPY
    EA = 1;
    AUXR1 = 0x08;
    AUXR1 ^= ~0x08;
    while(1); // for test
    }