Interfacing with a MAX690A Watch Dog Timer


/* Program WATCHDOG.C
**
** Illustrates an interface with a MAX690A Watch Dog Timer.  If
** the MAX690A does not receve a state change on WDI within nominally
** 1.6 secs, the reset goes low for 200 ms, rebooting the Flashlite.
**
** Flashlite V25                 MAX690
**
** P1.7 ------------------------> Watchdog Input
** RESET <----------------------- Reset
**
** In the program, an LED on P2.0 is pulsed on and off for an ever
** increasing time.  Without the call to watchdog() in pause(), the
** MAX690A resets the processor.  Note that the implementation of the
** watchdog() function is one of simply toggling P1.7
**
** copyright, Peter H. Anderson, Baltimore, MD, October, '00
*/

#include <stdio.h>
#include <dos.h>

typedef unsigned char byte;

#define SEG 0xf000

#define P1_OFFSET 0xff08
#define PM1_OFFSET 0xff09
#define PMC1_OFFSET 0xff0a

#define P2_OFFSET 0xff10
#define PM2_OFFSET 0xff11
#define PMC2_OFFSET 0xff12

void pause(int dt);
void watchdog(void);

/* note global */
byte far *p1, far *pm1, far *pmc1;
byte far *p2, far *pm2, far *pmc2;

void main(void)
{
   int delay_time=10;

   p1=MK_FP(SEG, P1_OFFSET);
   pm1=MK_FP(SEG, PM1_OFFSET);
   pmc1=MK_FP(SEG, PMC1_OFFSET);

   p2=MK_FP(SEG, P2_OFFSET);
   pm2=MK_FP(SEG, PM2_OFFSET);
   pmc2=MK_FP(SEG, PMC2_OFFSET);

   *pmc1 = 0x00;
   *pmc2 = 0x00;

   *pm1 = 0x7f;   /* most sig bit is an input */
   *pm2 = 0xfe;   /* least sig bit an imput */

   while(1)
   {
      *p2 = 0x01;
      pause(delay_time);
      *p2 = 0x00;
      pause(delay_time);
      delay_time += 10;
   }
}

void pause(int dt)
{
   int n;
   for (n=0; n<dt; n++)
   {
      delay(5);
      watchdog();       /* call to reset the MAX690 */
   }
}

void watchdog(void)
{
   *p1 = *p1 ^ 0x80;    /* toggle most sign bit */
}