英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: PICC中断养狗喂狗演示 [打印本页]

作者: winnie    时间: 2009-4-14 15:13
标题: PICC中断养狗喂狗演示
#include <pic.h>
/*--------------------------------------------------------
              PIC疯狗演示程序
“论据”见菜地里来了一条疯狗(中断养狗喂狗演示)
---------------------------------------------------------*/
persistent unsigned int RamTest;//内存自检标志
void SystemInit(void);
void SystemIoInit(void);
void SystemTmrInit(void);
union {
  struct {
    unsigned b0: 1;
    unsigned b1: 1;
    unsigned b2: 1;
    unsigned b3: 1;
    unsigned b4: 1;
    unsigned b5: 1;
    unsigned Wdt: 1;//软件疯狗
    unsigned Work: 1;
  }Bit;
  unsigned char Bits;
}SystemFlag;//系统标志
typedef struct Systemstruct{//系统数据结构
  unsigned char T0Count;
}SystemData;
SystemData SystemBuffers;//申请系统数据结构
/*-------------------------*/

void SystemInit(void)
{
  SystemBuffers.T0Count = 0;
  SystemFlag.Bits = 0;
  if (RamTest != 0x55aa) {//内存被破坏
/*-------------------------------------
    系统上电初始化
--------------------------------------*/
RamTest = 0x55aa;
  }
  SystemIoInit();
  SystemTmrInit();
}
void SystemTimerInit(void)
{
  OPTION = 0x08;
}
void SystemIoInit(void)
{
  TRISA = 0b11111111;
  PORTA = 0b00000000;
}
void SystemTmrInit(void)
{
  TMR0 = -80;//为方便演示,随便设个值
  T0CS = 0;//TMR0工作于定时器方式
  PSA  = 1;//TMR0不用分频
}
void main(void)
{
  SystemInit();//系统初始化
  for (;;) //主循环(不运行任何程序,所有程序都在中断中处理)
  {
SystemFlag.Bit.Wdt = 1;//喂软狗(置标志)
    T0IE = 1;//开放TMR0中断
    ei();//打开总中断开关
  }
}
void interrupt ISR(void) //中断服务程序
{
  if (T0IE && T0IF) //判TMR0中断
  {
    T0IF = 0; //清除TMR0 中断标志
    TMR0 = -80;//为方便演示,随便设个值
    if ((SystemFlag.Bit.Wdt) && (RamTest == 0x55aa)) {
/*-------------------------------------------------------
    主循环中若清过软狗定时器或内存没被破坏,才能喂狗
--------------------------------------------------------*/
   CLRWDT();//在此喂这条到处挨骂的疯狗!!!
   SystemFlag.Bit.Wdt = 0;//清除软狗定时器(清标志)
    }
    else {
/*-------------------------------------------
    程序飞捕捉
--------------------------------------------*/
      di();
      PCLATH = 0;
      PCL    = 0;//goto main;
    }
/*-------------------------------------------
    在此加入TMR0中断服务
--------------------------------------------*/
  }
  if (TMR1IE && TMR1IF) //判TMR1 中断
  {
    TMR1IF = 0; //清除TMR1 中断标志
/*-------------------------------------------
    在此加入TMR1中断服务
--------------------------------------------*/
  }
/*-------------------------------------------
   其他任务处理
--------------------------------------------*/
}//中断结束并返回




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2