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

📄 main.c

📁 本文档用于描述一体化组合模块485监控板监控对象
💻 C
字号:
#include <ioavr.h>
#include <intrinsics.h>
#include "init.h"
#include "main.h"
#include "variable.h"
#include "tabcode.h"
#include "ad.h"
#include "eeprom.h"
#include "uart.h"
#include "pll.h"
#include "spi.h"
#include "eeprom_data.h"

void main(void)
{    
  init_devices();
  Check_EEPROM_data();
  Init_UART0();
  Init_PLL();
  init_parameters();

  while(1)
  {
  #if(UARTEN > 0)   
    UART_receive_loop();
  #endif
    
  #if(WDTEN > 0)
    if(WDT_time > 50)
    {
      Clear_WDT();
      WDT_time=0;
    }
  #endif
  
  #if(ADEN > 0)
    Start_AD();
  #endif
    
  #if(EEPROMEN > 0)
    Write_EEPROM();
  #endif
    
  #if(SPIEN > 0)
    Write_SPI();
  #endif
   
  #if(DEVICE==1)
    Check_PLL_unlock();
  #endif

  #if(TIMEEN > 0)
    if(LED_time > 200)
    {
      LED_time=0;
      
      Check_EEPROM_data();

      if((PORTD & 0x80) == 0x80)    //LED
        PORTD &= ~LED;
      else
        PORTD |= LED;
    }

    if(TransactionTime>100)
    {
      Deal_AD_data();
      //Check_Temp();
      TransactionTime=0;
    }
  #endif
  }
    
}

void Delay(unsigned char time)
{
  U16 i;
  for(i=0;i<time;i++)
    ;
}

void Clear_WDT(void)
{/*
  PORTD |= WDT;

  Delay(50);

  PORTD &=~ WDT;
  */
  
  if(((PORTD>>6)&0x01)==0)
    PORTD |= WDT;
  else
    PORTD &=~ WDT;
    
  
}

void Deal_AD_data(void)
{
	U8 i;
        U8 max;
        U8 min;
        U8 k;
	U16 sum=0;

	max=min=ADDesc.ADData[2][0];
	for(i=0;i<AD_SIZE;i++)
	{
		sum += ADDesc.ADData[2][i];

		if(max<ADDesc.ADData[2][i])
			max=ADDesc.ADData[2][i];

		if(min>ADDesc.ADData[2][i])
			min=ADDesc.ADData[2][i];
	}

	sum = (sum -min - max) / (AD_SIZE - 2);
	VariableDesc.LnaLevel=sum * 200 /51;

        i=0;
	if(LnaTabDesc.Len!=0)				
	{
		while( (VariableDesc.LnaLevel>LnaTabDesc.Limit[i])
			&& (i < (LnaTabDesc.Len-1)) )
			++i;

		VariableDesc.LnaValue=LnaTabDesc.Value[i];
        }
////LNA power AD/////////
/////////////////////////////////////////////////////////////////////////////
	sum=0;							
	max=min=ADDesc.ADData[0][0];
	for(i=0;i<AD_SIZE;i++)
	{
		sum += ADDesc.ADData[0][i];
		
		if(max<ADDesc.ADData[0][i])
			max=ADDesc.ADData[0][i];
		
		if(min>ADDesc.ADData[0][i])
			min=ADDesc.ADData[0][i];
	}
	sum = (sum -min - max) / (AD_SIZE - 2);
	VariableDesc.PaOutLevel = sum * 200 /51;

        i=0;
	if(PaOutTabDesc.Len!=0)	
	{
		while( (VariableDesc.PaOutLevel > PaOutTabDesc.Limit[i])
			&& (i < (PaOutTabDesc.Len-1)) )
			++i;
	
		VariableDesc.PaOutValue=PaOutTabDesc.Value[i];
  	}
        ///////////////////////////add 09-04-08
        if(VariableDesc.PaOutLevel < PaOutTabDesc.Level[0]-5)
            VariableDesc.PaOutValue = 10;
        ///////////////////////////////////////
        
////PA out power AD/////////
///////////////////////////////////////////////////////////////////////
	sum=0;						
	max=min=ADDesc.ADData[3][0];
	for(i=0;i<AD_SIZE;i++)
	{
		sum += ADDesc.ADData[3][i];
	
		if(max<ADDesc.ADData[3][i])
			max=ADDesc.ADData[3][i];
		
		if(min>ADDesc.ADData[3][i])
			min=ADDesc.ADData[3][i];
	}
	
	sum=(sum-min-max)/(AD_SIZE-2);
	VariableDesc.TempLevel=sum * 100 /51;

	VariableDesc.TempValue = VariableDesc.TempLevel-50;

	VariableDesc.TempValue -= 5;
        
////Temperature AD//////////////        
////////////////////////////////////////////////////////////////////////	
	sum=0;

	max=min=ADDesc.ADData[1][0];
	for(i=0;i<AD_SIZE;i++)
	{
		sum += ADDesc.ADData[1][i];

		if(max<ADDesc.ADData[1][i])
			max=ADDesc.ADData[1][i];

		if(min>ADDesc.ADData[1][i])
			min=ADDesc.ADData[1][i];
	}
	
	sum=(sum-min-max)/(AD_SIZE-2);
	VariableDesc.InvertLevel= sum * 200 /51;
	
        i=0;
	if(InvertTabDesc.Len!=0)				
	{
		while( (VariableDesc.InvertLevel > InvertTabDesc.Level[i])
			&& (i < (InvertTabDesc.Len-1)) )
			++i;

		VariableDesc.InvertValue=InvertTabDesc.Value[i];		
        }

	if(VariableDesc.InvertValue<VariableDesc.PaOutValue)
		k = VariableDesc.PaOutValue-VariableDesc.InvertValue;
	else
		k=0;
	
	i=0;
	while( (k > InvertRateTabDesc[0][i])
		&& (i < (INVERT_TAB_SIZE-1)) )
		++i;

	VariableDesc.InvertRateValue=InvertRateTabDesc[1][i];

	if (VariableDesc.PaOutValue < PA_OUT_MIN)
	{
		VariableDesc.InvertRateValue = 13;
	}
////Invert power AD////////////////
//////////////////////////////////////////////////////////////////////////
      Deal_alarm();	
}

void Deal_alarm(void)
{
	if(((PINE>>3)&0x01) != 1)       //PA ALARM        
		VariableDesc.Alarm |= 0x01;
	else
		VariableDesc.Alarm &= ~0x01;

	if(((PINE>>5)&0x01) != 1)       //PA ALC ALARM
		VariableDesc.Alarm &= ~0x02;
	else
		VariableDesc.Alarm |= 0x02;

        
	if((PINC & 0x01) != 1)          //LNA ALARM
		VariableDesc.Alarm |= 0x04;
	 else
	 	VariableDesc.Alarm &= ~0x04;

	if(((PINC>>1)&0x01) != 1)        //LNA ALC ALARM
		VariableDesc.Alarm |= 0x08;
	 else
	 	VariableDesc.Alarm &= ~0x08;

	if(VariableDesc.TempValue>PropertyDesc.PA_TemperatureUpperLimit)     //TEMPERATURE ALARM
		VariableDesc.Alarm |= 0x10;
	 else
	 	VariableDesc.Alarm &= ~0x10;
        
	if(((PINC>>2)&0x01) != 1)        //PLL UNLOCK ALARM
		VariableDesc.Alarm |= 0x20;
	 else
	 	VariableDesc.Alarm &= ~0x20;
        
	if(VariableDesc.InvertValue>PropertyDesc.InvertLimit)      //INVERT RATE ALARM
		VariableDesc.Alarm |= 0x40;
	 else
	 	VariableDesc.Alarm &= ~0x40;

        	
}

void Check_PLL_unlock(void)
{

  if(Check_time > 50)
  {
    Check_time = 0;
    if( ((PINC&0x04) != 0x04) && (DEVICE==1) )      //if unlocked, reset pll
    {
      PLL_routine(VariableDesc.Frequence+VariableDesc.TempFre);
    }
  }
}

void Check_Temp(void)
{
        U8 i;
        
        i=0;
	while( (VariableDesc.TempValue > TempTab[i])&&(i < (ADJUST_TAB_SIZE-1)) )
	    ++i;

	DADesc.Adjust_1=AdjustTab[0][i];
        DADesc.Adjust_3=AdjustTab[1][i];
        
        SpiDesc.Status[0] = 1;
        SpiDesc.Buff[0] = 0x2000+(U16)(DADesc.Adjust_1 << 4);
        
        SpiDesc.Status[2] = 1;
        SpiDesc.Buff[2] = 0xA000+(U16)(DADesc.Adjust_3 << 4);  
      
}

void Set_attenuation()
{
	U8 j;
	U8 i;
        U8 temp=0x00;

        i=PropertyDesc.PA_Att+PropertyDesc.Temp_Compensation+PropertyDesc.Gain_Compensation+2;
        //预衰减1db
        
	if(i>63)
	{
	    i = 63;
	}
	j = 0;
        
        if (i & 0x01)
	{
	    j += 1;
	}

	if (i & 0x02)
	{
	    j += 2;
	}

	if (i & 0x04)
	{
	    j += 4;
	}	

	if (i & 0x08)
	{
            j += 8;
	}

	if (i & 0x10)
	{
	    j += 16;
	}

	if (i & 0x20)
	{
	    j += 32;
	}

	if(PropertyDesc.PA_SW!=0)
	{
		temp=PORTA | 0x3f;
	        PORTA = temp & (~j);
	}
	else
	{
		PORTA &= ~0x3f;
	}
       
/////////////////////////////////////////////////////////////////
	i=PropertyDesc.LNA_Att;
      
	if(PropertyDesc.LNA_SW!=0)
	{

            PORTB |= 0xF0;
            PORTE |= 0x50;   //set all LNA_ATT to high

            if((i&0x01)==0x01)
            {
              PORTB &= ~0x10;   //ATT 0.5
            }

            if((i&0x02)==0x02)
            {
              PORTB &= ~0x20;   //ATT 1
            }

            if((i&0x04)==0x04)
            {
              PORTB &= ~0x40;   //ATT 2
            }

            if((i&0x08)==0x08)
            {
              PORTB &= ~0x80;   //ATT 4
            }

            if((i&0x10)==0x10)
            {
              PORTE &= ~0x40;   //ATT 8
            }

            if((i&0x20)==0x20)
            {
              PORTE &= ~0x10;   //ATT 16
            }

	}
	else
	{
          PORTB &= ~0xF0;
          PORTE &= ~0x50;
          ///////set all LNA_ATT to low
	}

}


void init_parameters(void)
{	
        //U8 i;

	if(PropertyDesc.PA_SW!=0)
	        PORTA &= ~0X40;   //OPEN PA
	else
		PORTA |= 0X40;    //CLOSE PA

	if(PropertyDesc.LNA_SW!=0)
		PORTC &= ~0x40;   //OPEN LNA
	else
	        PORTC |= 0x40;    //CLOSE LNA
        
        Set_attenuation();
       
        ////////////////////////////////////////////////
        DADesc.Adjust_1=230;
        DADesc.Adjust_2=230;
        DADesc.Adjust_3=230;     //////init 4.5V ///////
        ////////////////////////////////////////////////    
        
        /////////////////////////////////////////////////
        ////////add 2009-02-23//////////////////////////////////////////////
        /*
        i = 0;
	while ((PropertyDesc.PA_ALC > PaOutCodeTabDesc.Value[i]) && (i < (PaOutCodeTabDesc.Len - 1)))
	{
		++i;
	}
	VariableDesc.PA_ALC = (U8)(PaOutCodeTabDesc.Level[i]);
        */
        
        VariableDesc.PA_ALC = 350 *51 / 100; ////init 3.5V////
        /////////////////////////////////////////////////////////////////////

        SpiDesc.Status[0] = 1;

        SpiDesc.Buff[0] = 0x2000+(U16)(DADesc.Adjust_1 << 4);

        SpiDesc.Status[1] = 1;

        SpiDesc.Buff[1] = 0x6000+(U16)(DADesc.Adjust_2 << 4);

        SpiDesc.Status[2] = 1;

        SpiDesc.Buff[2] = 0xA000+(U16)(DADesc.Adjust_3 << 4);

        SpiDesc.Status[3] = 1;

        SpiDesc.Buff[3] = 0xE000+(U16)(VariableDesc.PA_ALC << 4);
     
        VariableDesc.Frequence = FREQUENCE;
        
      #if(DEVICE==1)
        PLL_routine(VariableDesc.Frequence+VariableDesc.TempFre);
      #endif
}

⌨️ 快捷键说明

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