📄 hart1151.c
字号:
EEP_RamT.Xmo=-10100;
EEP_RamT.Xso=-18000;
Character_OF=Character_PF=1;
Cal_para();
}*/
/*------------------------------------------------------------------
-------------------------------------------------------------------*/
void iniad_ini(void)
{
//ADC12CTL0 = ADC12ON+REFON+REF2_5V+SHT0_6; // Setup ADC12, ref., sampling time
ADC12CTL1 = SHP; // Use sampling timer
ADC12MCTL0 = INCH_10+SREF_1; // Select channel A10, Vref+
ADC12IE = 0x01; // Enable ADC12IFG.0
}
//---------------------------------------
interrupt[ADC_VECTOR] void ADC12ISR (void)
{
ADCresult = ADC12MEM0; // Move results, IFG is cleared
//_BIC_SR_IRQ(LPM0_bits); // Clear LPM0
}
//float a,b,b1,c,d;
//float Temp;
//---------------------------------------
void main(void)
{
unsigned int k=0;
unsigned char waittime=0;
osc_init();
osc_test();
//------------------------------
//------------------------------
//iniad_ini();
main_init();
periphery_init();
Defualt_init();
link_init();
dsp_init();
SDA_SET();
SCL_SET();
WDTCTL = WDT_ARST_250; //看门狗时间为1秒
IE1 |=WDTIE; //开看门狗中断
DA_DataOut(1000);
DA_DataOut(1000);
DA_DataOut(1000);
DA_DataOut(1000);
DA_DataOut(1000);
_EINT();
TempCompensate();
/*{
a=0;b=0;c=0;
//解一元二次方程
c=EEP_Ram.TempFullD-EEP_RamT.Xs;
b=EEP_Ram.TempFullC*EEP_Ram.TempFullC;
b=b-4*c*EEP_Ram.TempFullB;
a=sqr_t(b);
a=a-EEP_Ram.TempFullC;
a=a/2;//a=a<<1;?
a=a/EEP_Ram.TempFullB;
//a=-100;
if(0.0<a&a<1.0)
{
d=0;
}
else
{
a=0;b=0;c=0;
//解一元二次方程
c=EEP_Ram.TempFullD-EEP_RamT.Xs;
b=EEP_Ram.TempFullC*EEP_Ram.TempFullC;
b=b-4*c*EEP_Ram.TempFullB;
a=sqr_t(b);
a=-EEP_Ram.TempFullC-a;
a=a/2;//a=a<<1;?
a=a/EEP_Ram.TempFullB;
d=1;
//a=a*110-30;
}
}*/
//IniTemp_ReDA(3);
//IniTemp_Re(1);
//Temp=10.0;
//Temp=sqr_t(Temp-4)+4;//开方输出
//ZXC=0.25;
//PVatafold=(ZXC*EEP_Ram.UpSensorLimit);//667
//PVataf=EEP_Ram.k*PVatafold+EEP_Ram.b;
for(;;)
{
/*if(EEP_RamT.BurstSwitch==1)
{
mainifg|=Burst;
TimeLimit=0;
TACCTL1=CCIE+CCIFG;//立即突发
}
else
{
mainifg&=~Burst;
TACCTL1&=~(CCIE+CCIFG);
}*/
KillDog();
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
//-------------
/*if(needwrite_modulus==0)
{
if(needwrite_parameter==0)
{
needwrite=0;
EEP_RamT.Swith=10;
}
}*/
//-------------
if(needwrite_modulus==1)
{
Flash_Clear(modulus);
//Write_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,unsigned char num)
Write_Modulus(modulus,(unsigned char*)&EEP_Ram,(unsigned char*)&tag,sizeof(EEP_Ram));
Read_Modulus(modulus,(unsigned char*)&EEP_Ram,sizeof(EEP_Ram),(unsigned char*)&tag);//源地址、写字节大小
needwrite_modulus=0;
needwrite=1;
//Flash_Clear(modulus_re);
//Write_Modulus(modulus_re,(unsigned char*)&EEP_Ram,(unsigned char*)&tag_re,sizeof(EEP_Ram));
//Read_Modulus(modulus_re,(unsigned char*)&EEP_Ram_re,sizeof(EEP_Ram_re),(unsigned char*)&tag_re);//源地址、写字节大小
}
else if(needwrite_parameter==1)
{
Flash_Clear(parameter);
Write_Parameter(parameter,(unsigned char*)&EEP_RamT,(unsigned char*)&tag_p,sizeof(EEP_RamT));
//Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
needwrite_parameter=0;
needwrite=1;
//Flash_Clear(parameter_re);
//Write_Parameter(parameter_re,(unsigned char*)&EEP_RamT,(unsigned char*)&tag_rep,sizeof(EEP_RamT));
//Read_Modulus(parameter_re,(unsigned char*)&EEP_RamT_re,sizeof(EEP_RamT_re),(unsigned char*)&tag_rep);//源地址、写字节大小
}
else
{
//}
//---------------------
if(mainiv&ADrst_iv)//AD是否复位
{
mainiv&=~ADrst_iv;
RstOk=1;
ADS_com_ini();
}
else if(mainiv&drdy_iv)//AD准备好了
{
mainiv&=~drdy_iv;
if(IsADSCal())ADS_Calibration();
else
{
//if(IsADSOk())
if(1)
{
if(CharacterS==1)
{
AData=ADS_DataIn(AData);
ADataf=adtof(AData);
}
else
{
mainifg&=~ADErr;
ADRstCnt=3;
if(CharacterS==0)
{
if(ADC_Num<100)
{
AData=ADS_DataIn(AData);
ADataf=adtof(AData);
_NOP();//数据处理
//Thesta=1;
DANum++;
if(DANum>EEP_RamT.DADelay+1)
{
DANum=0;
}
AD_DA();
ADC_Num++;
}
else if(ADC_Num==100)
{
ADchange_temp();
ADC_Num++;
Nowis_Temp=1;
}
else if(ADC_Num<105)
{
AData2=ADS_DataIn(AData2);
ADataf2=adtof(AData2);//空采
ADC_Num++;
}
else if(ADC_Num<115)
{
AData2=ADS_DataIn(AData2);
ADataf2=AData2;
ADGet_TEMP();
ADC_Num++;
}
else if(ADC_Num==115)
{
ADchange_pv();
ADC_Num++;
}
else if(ADC_Num<120)
{
AData=ADS_DataIn(AData);
ADataf=adtof(AData);//空采
ADC_Num++;
}
else if(ADC_Num==120)
{
ADC_Num=0;
Nowis_Temp=0;//结束两个通道采集,重新开始下一个周期采集
Thesta=0;
}
else
{
}
}
}
}
else
{
AD_SOFT_RST();
ADwdtCnt=1;
}
}
_NOP();
}
else ;//LPM0; // CPU of //使用XT2,只能使用LPM0
}
}
}
void osc_init(void)
// 选择时钟源
{
WDTCTL=WDTPW+WDTHOLD;// stop watchdog
IFG2=0;IFG1=0;
//-------------------
//设置SMCLK输出460.8KHz频率
//P1SEL|=BIT4;
//P1DIR|=BIT4;
P3SEL|=BIT2;
P3DIR|=BIT2;
P5SEL|=BIT5;
P5DIR|=BIT5;//打开晶振*/
BCSCTL1&=~XT2OFF;/* use XT2 */
ModemPowerOut;//out
ModemPowerOn;//hi out
ADC12CTL0 |= (REFON); // 1.5v out
//This loop will wait till high frequency crystal is stable
do
{
IFG1&=~OFIFG;
}while(IFG1&OFIFG);
//OFIE
//BCSCTL1|=RSEL1+RSEL0;// DIVA_0
BCSCTL2|=SELS+SELM_2+DIVS_2; // MCLK = XT2 (safe)+DIVM_3
}
//-------------------------------------------------
void osc_test(void)
{
}
//-------------------------------------------------
//interrupt [NMI_VECTOR] void osc_nmi(void)
//{
//}
//-------------------------------------------------
void main_init(void)
{
mainiv=0;
mainifg=0;
}
void Flash_Clear(volatile char *WriteAddress)
{
//unsigned char *p;
//p=WriteAddress;
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
_DINT(); //关中断
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL3=0XA500; //清除LOCK位
FCTL2=(FWKEY+FSSEL_1+FN2); //mclk 2div
FCTL1=0XA502; //选择段擦除
*WriteAddress=0; //选择擦除段号
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待擦除完成
FCTL1=0XA500; //禁止编程
FCTL3=(0XA500+LOCK); //LOCK位置1
_EINT(); //关中断
}
//void Write_Flash(char *WriteAddress,unsigned char *Tagaddress,unsigned char *OriginAddress,unsigned char WriteNum)//目的地址、文件头地址、源地址、大小
void Write_Flash(unsigned char WriteNum)//目的地址、文件头地址、源地址、大小
{
int i;
unsigned char *p,*p1,*p2;
p=(unsigned char*)&tag;
p1=(unsigned char*)&EEP_RamT.Messenger[0];
p2=(unsigned char*)&testflashtem[0];
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
_DINT(); //关中断
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL3=0XA500; //清除LOCK位
FCTL1=0XA540; //允许编程
FCTL1=0XA502; //选择段擦除
*modulus=0; //选择擦除段号
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待擦除完成
FCTL1=0XA540; //允许编程
for(i=0;i<TagLength;i++)
{
*(modulus+i)=*(p+i); //写入FLASH中
*(p2+i)=*(p+i);
}
for(i=TagLength;i<WriteNum+TagLength;i++)
{
*(modulus+i)=*(p1+i-TagLength); //写入FLASH中
*(p2+i)=*(p1+i);
}
while((FCTL3 & (0X9600+BUSY))==0X9601); //flash忙则等待
FCTL1=0XA500; //禁止编程
FCTL3=(0XA500+LOCK); //LOCK位置1
_EINT(); //重开中断
WDTCTL = WDT_ARST_1000; //看门狗时间为1秒
}
//----------------------------------
void WriteTest(void)
{
//Write_Flash(48);
}
//-----------------------
void ReadFlash(void)
{
unsigned char *p,*p1;
int i;
p=(unsigned char*)&tag;
//p1=(unsigned char*)&fortest[0];
p1=(unsigned char*)&EEP_RamT.Messenger[0];
for(i=0;i<TagLength;i++)
{
*(p+i)=*(modulus+i);
}
for(i=TagLength;i<48+TagLength;i++)
{
*(p1+i-TagLength)=*(modulus+i);
}
}
//-----------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -