📄 sf07p07v00.c
字号:
/***********************************************************************/
/* */
/* FILE :test.c */
/* DATE :Thu, Apr 26, 2007 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :H8/38024F */
/* */
/* This file is generated by Renesas Project Generator (Ver.3.0). */
/* */
/***********************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
void abort(void);
#ifdef __cplusplus
}
#endif
#define MAINSYS_GLOBALS
#include "includes.h"
const INT8U AdjustmentCoefficientOfTemperature[]=
{
0, 0, 0, 0, 0, 0, 0, 128-1, 128-1, 128-1,
128-1, 128-1, 128-2, 128-2, 128-2, 128-3, 128-3, 128-3, 128-4, 128-4,
128-5, 128-5, 128-6, 128-6, 128-7, 128-7, 128-8, 128-8, 128-9, 128-10,
128-10, 128-11, 128-12, 128-12, 128-13, 128-14, 128-15, 128-16, 128-17, 128-17,
128-18, 128-19, 128-20, 128-21, 128-22, 128-23, 128-24, 128-25, 128-26, 128-28,
128-29, 128-30, 128-31, 128-32, 128-33, 128-35, 128-36, 128-37, 128-39, 128-40,
128-41, 128-43, 128-44, 128-46, 128-47, 128-48, 128-50, 128-52, 128-53, 128-55,
128-56, 128-58, 128-59, 128-61
};
void main(void)
{
set_imask_ccr(1);
DelayXms(100);
ClearWatchDog;
DelayXms(100);
ClearWatchDog;
DelayXms(100);
ClearWatchDog;
DelayXms(100);
ClearWatchDog;
DelayXms(100);
ClearWatchDog;
DelayXms(100);
ClearWatchDog;
CheckPower();
ClearWatchDog;
//底层硬件初始化
IOInit();
LcdInit();
TimerInit();
ADInit();
//软件功能初始化
Clock8025Init();
CommunicateInit();
Tcn75Init();
DataInit();
MultiRateInit();
EnergyDataPowerOnInit();
DisplayInit();
set_imask_ccr(0);
for(;;)
{
ClearWatchDog;
if(_PowerDown==0)
{
if(_Span10msTask)
Span10msTask();
ClearWatchDog;
}
// else
// CLOSE_PERIPHERY_PART;
if(_PowerDown==0)
{
if(_SpanSecondTask)
SpanSecondTask();
ClearWatchDog;
}
// else
// CLOSE_PERIPHERY_PART;
if(_PowerDown==0)
{
if(_SpanMinuteTask)
SpanMinuteTask();
ClearWatchDog;
}
// else
// CLOSE_PERIPHERY_PART;
if(_PowerDown==0)
{
if(_EnergyAccum)
ActiveEnergyCalculate();
if(_ReverseEnergyAccum)
ReverseEnergyCalculate();
ClearWatchDog;
}
// else
// CLOSE_PERIPHERY_PART;
if(_PowerDown)
PowerDownTask();
ClearWatchDog;
if(_PowerDown==0)
{
if(_CommunicateReceiveEnableTask)
CommunicateReceiveEnable();
ClearWatchDog;
}
// else
// CLOSE_PERIPHERY_PART;
if(_PowerDown==0)
{
if(_DatagramDeal)
DatagramDealTask();
ClearWatchDog;
}
// else
// CLOSE_PERIPHERY_PART;
if(_PowerDown==0)
{
if(_ProgramRecord)
WriteProgramRecord();
}
// else
// CLOSE_PERIPHERY_PART;
}
}
void abort(void)
{
}
void CloseWatchdog(void)
{
HB_TCSRW=0x9c;HB_TCSRW=0x9c;/*对于38104,TCSRW初始值为0xae,经过设置后,值变成0x9c*/
HB_TCSRW=0x0b2;/*由于寄存器值已经变成0x9c,经过设置后,值变成0xb2,tcw被停止*/
HB_TCSRW=0x08f;/*在值已为0xb2的条件下,经过设置后,值变成0x8a,完成了停止看门狗的功能*/
nop();
}
void EnableWatchdog(void)
{
HB_TCSRW=0x9c;HB_TCSRW=0x9c;/*对于38104,TCSRW初始值为0xae,经过设置后,值变成0x9c*/
HB_TCSRW=0x0b7;/*由于寄存器值已经变成0x9c,经过设置后,值变成0xb6,tcw被启动*/
HB_TCSRW=0x08f;/*在值已为0xb6的条件下,经过设置后,值变成0x8E,完成了启动看门狗的功能*/
}
void IOInit(void)
{
PCR3Buf=Gcst_PCR3Ini;HB_PCR3=PCR3Buf;
PCR4Buf=Gcst_PCR4Ini;HB_PCR4=PCR4Buf;
PCR7Buf=Gcst_PCR7Ini;HB_PCR7=PCR7Buf;
FENG_LED_OFF;
HB_PCR5=0x01;
}
void CheckPower(void)
{
INT8U GuB_SysTmp;
for(;;)
{
ClearWatchDog;
ADInit();
nop();
GuB_SysTmp=0;
HF_ADSR_ADSF=1;
while(HF_ADSR_ADSF)
{
GuB_SysTmp--;
nop();
if(GuB_SysTmp<1)
{
break;
}
}
AdResult=HW_ADRR;
AdResult>>=8;
if(AdResult>VoltageRstLve)
VoltageLowCnt++;
else
VoltageLowCnt=0;
if(VoltageLowCnt>200)
{
VoltageLowCnt=0;
break; //电源稳定,退出循环
}
}
}
void ADInit(void)
{
HB_AMR=0x0b6;
}
void TimerInit(void)
{
HB_CKSTPR1=Gcst_CKSTPR1Ini;//各种模块的工作时钟开关/
HB_CKSTPR2=Gcst_CKSTPR2Ini;
/*initialize timer A*/
HF_IENR1_IENTA=1; /*enable timer A interrupt*/
HB_TMA=0x16; /*set the clock in timer A is interval 1/32*/
/*initialize timer F*/
HB_TCRF=0x46;/*Divide Timer F into two timers*/
HB_TCSRF=0x11; /*enable match TCFL clearing*/
/*enable match TCFH clearing*/
HB_OCRF_L=16;/*The crystal is 10M TH is used on IR modulation*/
}
void DataInit(void)
{
INT8U i,j,k;
INT8U InitSign=0;
TaskSign.BYTE=0;
StateSign.BYTE=0X01;
for(i=0;i<3;i++)
{
for(k=EEPROM_INIT_SIGN_ID0;k<EEPROM_INIT_SIGN_ID2+1;k++)
{
if(ReadEepromData(k,TempBufOfMain))
{
InitSign=1;
for(j=0;j<14;j++)
{
if(TempBufOfMain[j]!=0x55)
{
InitSign=0;
break;
}
}
}
if(InitSign)
break;
}
if(InitSign)
break;
}
if(InitSign)
{
ClearWatchDog;
for(i=EEPROM_INIT_SIGN_ID0;i<LAST_BROADCAST_TIME_ID+1;i++)
{
if(!ReadEepromData(i,TempBufOfMain))
{
if(!ReadEepromData(i,TempBufOfMain))
{
if(!ReadEepromData(i,TempBufOfMain))
InitEepromData(i);
}
}
InitRamData(i);
ClearWatchDog;
}
if(!ReadEepromData(ENERGY_PULSE_ID,TempBufOfMain))
{
if(!ReadEepromData(ENERGY_PULSE_ID,TempBufOfMain))
{
PulseSample.PulseNum[0]=0;
PulseSample.PulseNum[1]=0;
PulseSample.PulseNum[2]=0;
PulseSample.PulseNum[3]=0;
WriteEepromData(ENERGY_PULSE_ID,TempBufOfMain);
return;
}
}
InitRamData(ENERGY_PULSE_ID);
}
else
{
InitNewEeprom();
}
}
void Span10msTask(void)//跨10MS任务
{
_Span10msTask=0;
if(RecTmr)
{
RecTmr--;
if(RecTmr==0)
_CommunicateReceiveEnableTask=1;
}
if(Com485Cnt>0)
Com485Cnt--;
/*****************软时钟处理**********************/
/*****************报文发送处理*********************/
if(_DataSend_)
{
SendDelayCnt++;
if(SendDelayCnt>1)
{
SendDelayCnt=0;
if(PreCharactorCnt)
{
HB_TDR=0xfe;
PreCharactorCnt--;
}
else
{
if(SendLen>0)
{
HB_TDR=SendBuf[SendPnt];
SendLen--;
SendPnt++;
}
else
{
_DataSend_=0;
UartTransmitDisable;
_CommunicateReceiveEnableTask=1;
}
}
}
}
}
void SpanSecondTask(void)//跨秒任务
{
INT8U i;
_SpanSecondTask=0;
CurrentTime.Second++;
if((CurrentTime.Second&0x0f)>0x09)
CurrentTime.Second+=0X06;
if(CurrentTime.Second>=0X60)
{
_SpanMinuteTask=1;
CurrentTime.Second=0X00;
OldCurrentTime.Year=CurrentTime.Year;
OldCurrentTime.Month=CurrentTime.Month;
OldCurrentTime.Day=CurrentTime.Day;
OldCurrentTime.Hour=CurrentTime.Hour;
OldCurrentTime.Minute=CurrentTime.Minute;
for(i=0;i<3;i++)
{
GetCurrentDateAndTime();
if(CheckTime(&CurrentTime.Second)&&CheckDate(&CurrentTime.Day)&&(CurrentTime.Weekday<0x07))
break;
}
if(OldCurrentTime.Hour!=CurrentTime.Hour)//跨时
{
//转存处理
if((MonthStoreDate[1]==CurrentTime.Day)&&(CurrentTime.Hour==MonthStoreDate[0]))
EnergyMonthStore();
//广播校时允许处理
if(_BroadCalibrateTimeAllow_==0)
{
if(IsBroadCalibrateTimePermit())
_BroadCalibrateTimeAllow_=1;
}
}
if(OldCurrentTime.Day!=CurrentTime.Day)//跨日
{
MultiRateInit();
}
else if(OldCurrentTime.Minute!=CurrentTime.Minute)
{
RateNormalRunningTask();
}
}
/////////////////////////
RATESHOW();
/////////////////////////
if(_BroadCalibrateTimeAllow_)
{
MeterRunningState|=0x20;
}
else
{
MeterRunningState&=0xdf;
}
//通讯正在进行指示
if(CommunicateCnt)
{
CommunicateCnt--;
if(CommunicateCnt==0)
_Communicate_=0;
}
Display();
EnergyReverseDeal();
}
void SpanMinuteTask(void)//跨分任务
{
_SpanMinuteTask=0;
_PowerTest_=0;//启动电池检测
if(_TCN75Err_==0)
TemperatureCompensate();
if(HardwareErrState.BYTE)
MeterRunningState|=0x02;
else
MeterRunningState&=0xfd;
}
void TemperatureCompensate(void)
{
INT8U i;
INT8S TempVar;
for(i=0;i<3;i++)
{
ReadTCN75(TEMPERTURE_REG_ADR,TempBufOfMain,1);
ReadTCN75(TEMPERTURE_REG_ADR,&TempBufOfMain[1],1);
if(TempBufOfMain[0]==TempBufOfMain[1])
break;
}
TempVar=(INT8S)(TempBufOfMain[0]);
TempVar-=25;
if(TempVar<0)
{
TempVar=~TempVar+1;
}
if(TempVar>73)
TempVar=73;
TempVar=AdjustmentCoefficientOfTemperature[TempVar];
if(TempVar!=OldCompensateValue)
{
OldCompensateValue=TempVar;
AdjustClockPrecision(TempVar);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -