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

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3841|回复: 0
打印 上一主题 下一主题

PICC中断养狗喂狗演示

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-14 15:13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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中断服务
--------------------------------------------*/
  }
/*-------------------------------------------
   其他任务处理
--------------------------------------------*/
}//中断结束并返回
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-12-25 22:20 , Processed in 0.055991 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表