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

📄 manage_rtc.c

📁 关于时钟功能的软件
💻 C
字号:
////////////////////////////////////////////////////
#include	"manage_RTC.h"
////////////////////////////////////////////////////
rom const unsigned char DBL_PARA[]=		//双备份数据长度表
{
	59,8,4,6,42,0
};
////////////////////////////////////////////////////
void	manage_RTC(void)						//RTC管理模块
{
	union UNI_UINT16	uni1;
	signed char	temp;
	unsigned char	i,j,pt[3],para[2];
	unsigned int	addr;
	
	if (!_UINT8_RSTflagbits.RTC)
	{																
		//模块初始化
		_UINT8_RSTflagbits.RTC=1;							//置RTC管理模块复位标志
		_UINT8_CLOCK[UINT8_RTC][0]=0x50;					//清零RTC管理模块时钟
		_UINT8_CLOCK[UINT8_RTC][1]=0;
	}
	
	//模块正常运行
	_UINT8_SLEEPflagbits.RTC=0;
	if (_UINT8_CLOCK[UINT8_RTC][0]>=0x25)
	{
		//250ms读一次RTC
		Read_RTC();
		//历史数据转存
		if 	(!_UINT8_RTC[0] && !_UINT8_RTC[1])
		{
			ReadFRAM(FRAM1_AMRD,para,2);	//读自动抄表日时
			if (_UINT8_RTC[2]>=para[0] && _UINT8_RTC[4]>=para[1])
			{
				j=_UINT8_RTC[5];
				ReadFRAM(FRAM2_HKWHPT1,pt,2);		//读当前历史记录指针
				if (j!=pt[0])
				{
					//数据转存
					pt[1]%=3;
					//转存电能记录
					SaveHistory(FRAM1_PKWH,FRAM2_HKWH1+pt[1]*32,32);
					pt[0]=j;
					pt[1]=(pt[1]+1)%3;
					WriteFRAM(FRAM2_HKWHPT1,pt,2);		//写当前历史记录指针
				}
			}
		}
		
			//零点1分进行双份数据的校验、修正
		if (!_UINT8_RTC[0] && _UINT8_RTC[1]==1 && !_UINT8_RTC[2])
		{
			i=0;
			j=0;
			addr=FRAM1_AVRMSGAIN;
			while (DBL_PARA[i])
			{
				ReadFRAM(addr,pt,DBL_PARA[i]);
				uni1.uint16=table_crc(pt,DBL_PARA[i]-2);
				if (uni1.low!=pt[DBL_PARA[i]-2] || uni1.high!=pt[DBL_PARA[i]-1]) j|=0b00000001;	//第1份错误
				ReadFRAM(addr+FRAM1_OFFSET,pt,DBL_PARA[i]);
				uni1.uint16=table_crc(pt,DBL_PARA[i]-2);
				if (uni1.low!=pt[DBL_PARA[i]-2] || uni1.high!=pt[DBL_PARA[i]-1]) j|=0b00000010;	//第2份错误
				if (j==0b00000001)
				{
					WriteFRAM(addr,pt,DBL_PARA[i]);	//用第2份修复第1份
				}
				if (j==0b00000010)
				{
					ReadFRAM(addr,pt,DBL_PARA[i]);
					WriteFRAM(addr+FRAM1_OFFSET,pt,DBL_PARA[i]);	//用第1份修复第2份
				}
				addr+=DBL_PARA[i];
				i++;
			}
		}

		_UINT8_CLOCK[UINT8_RTC][0]=0;					//清零RTC管理模块时钟
		_UINT8_CLOCK[UINT8_RTC][1]=0;
	}
}
////////////////////////////////////////////////////
void	SaveHistory(unsigned int addr1,unsigned int addr2,unsigned char len)	//历史数据转存
{
	unsigned char pt[32];
	ReadFRAM(addr1,pt,len);
	WriteFRAM(addr2,pt,len);
}

⌨️ 快捷键说明

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