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

📄 hart1151.c

📁 Hart源代码.HART协议简介下载30次,HART协议由Rosemount公司开发且已向每个使用者开放HART协议采用标准的频移键控.
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -