⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 checkmode.c

📁 电能表源码
💻 C
字号:
/*************************************************************************************

	文件类型:
	文件作用:对flash进行擦除操作
	修改权限:
	文件相关:
	
	创 建 人:chenbo
	创建日期:2007.11.24
	当前版本:Ver0.1
	
	版本信息:Ver0.1					

**************************************************************************************/
#include "Tiger.h"
extern unsigned char recover_item(unsigned int flashaddr,unsigned int ramaddr,unsigned char num);
extern void Recover_meter(void);
struct check_struct                            //参数地址列表
{  unsigned int flashaddr;                     //参数在flash中的地址
   unsigned int id_data;                       //ID号
   unsigned char num;                          //参数在flash中的长度
};

const struct check_struct code check_addrtalbe[]=
{ {FL_canshu01+130,ID_PRIOXUL ,3},                        //需量参数
  {FL_canshu01+133,ID_CHANGSHU,4},                        //脉冲常数
  {FL_canshu01+137,ID_BANTRATA,2},                        // 波特率
  {FL_canshu01+139,ID_COMADDR,7},                         //表号
  {FL_canshu01+146,ID_GATCUTPOW,4},                      //是呀门限
  {FL_canshu01+150,ID_GATLOSTCUR,4},                     //失流门限
  {FL_canshu01+154,ID_TIMERETUN,2},                      //轮显时间
  {FL_canshu01+156,ID_PRIOCOSENG,2}                      //功率因数计量周期
};  

//======================================================================
//函数功能:对check模块进行初始化
//
//======================================================================
void Ini_checkmode(void)
{ unsigned char i;
  flag_runcheckmode=0;
  flag_mincheck=RTCTIME.rMinute;
  for(i=0;i<16;i++)
      count_flagereas[i]=0;                    //清零页擦除等待计数器 
  times_pllerror=0;
  flag_errorflash01.byte=0;
}

//==================================================================
//函数功能:对pll进行渐次
//
//==================================================================

void check_pll(void)  
{ unsigned char xdata *p;
  p=0x28d3;
  if(*p!=0x01)
     { times_pllerror++;
	   if(times_pllerror>3)
	      { times_pllerror=0;
		    SetPLL();                   //开pll电路
		  }
 	 }
  else
      times_pllerror=0;
}

//==========================================================
//函数功能:对flash页状态进行检测
//备注:检测到页损坏,置位相应的标志位
//==========================================================
void check_flashpage(void)
{ unsigned char i,temp_flag;
  temp_flag=flag_ereasflash01.byte;
  for(i=0;i<8;i++)
     { if((temp_flag&0x01)==0x01)                         //如果该页擦除标志位置位
	      count_flagereas[i]++;                        //计数器累加
	   else
	      count_flagereas[i]=0;                         //如果每置位,则清零标志位
	   
	   if(count_flagereas[i]>10)                           //如果擦除标志位10钟尚未相应,则该页错误
	      { flag_errorflash01.byte=flag_errorflash01.byte|set_bittable[i];    //置位页损坏标志位
		    count_flagereas[i]=0;
		  }

	   temp_flag=temp_flag>>1; 
	 }
/*
   temp_flag=flag_ereasflash02.byte;
   for(i=0;i<3;i++)
     { if(temp_flag&0x01==0x01)                         //如果该页擦除标志位置位
	      count_flagereas[i+8]++;                         //计数器累加
	   else
	      count_flagereas[i+8]=0;                         //如果每置位,则清零标志位
	   
	   if(count_flagereas[i+8]>10)                           //如果擦除标志位10钟尚未相应,则该页错误
	      { flag_errorflash02.byte=flag_errorflash02.byte|set_bittable[i];    //置位页损坏标志位
		    count_flagereas[i+8]=0;
		  }

	   temp_flag=temp_flag>>1;   
	 }
 */   
}

//==========================================================================
//函数功能:程序自检,对个参数和flash页的状态进行自检
//
//==========================================================================
void check_mode(void)
{ static unsigned char i;
  if(flag_runcheckmode==1)
     { flag_runcheckmode=0;
	   check_flashpage();                       //flash每秒检测一次,确定页有没有损坏
       check_pll();                             //pll电路每秒检测一次
	   if(flag_mincheck!=RTCTIME.rMinute)       //参数每1分钟检测一次
	      {  if(i<8)                            //分8次测试数据
		         { i++;
				 }
             else
			     { i=0;
                   flag_mincheck=RTCTIME.rMinute;
                 }
             if(i<8)
                { addr_baseonIDandtype(RAM,check_addrtalbe[i].id_data);                  //取指针
 		          recover_item(check_addrtalbe[i].flashaddr,(*ID_coretalbpoint[0]).dataaddr,check_addrtalbe[i].num);
		        }
             else
                Recover_meter();        
		  }
      
	 }
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -