?? lna3.c
字號:
/*
* Copyright (c) 2004,
* All rights reserved.
*
* 文件名稱:lna.c
* 文件標識:見配置管理計劃書
* 摘 要:低噪放模塊的監控數據處理
*
* 當前版本:1.2
*/
#include "lna3.h"
void main()
{
delay_unit(10000);//上電后延遲一段時間,防止剛上電電壓過大,亂操作。
init();
for( ; ; )
{
sign_collect();
serial_data();
if (chushi>=0x0d6b)//定時器1產生3435次中斷,每次終端時間為65.5*8=524ms,3435次中斷約為半個小時
{
init_sign_ctl();
chushi=0;
}
}
}
void init()
{
init_mcu(); //初始化端口方向、ADC、TMR1、波特率、USART、中斷、SSP、WDT
init_menu();//初始化各控制參數
init_serial();//初始化各串口部分
init_eeprom();//初始化EEPROM
// CHECK_temp();//獲取溫度值,為初始化控制做補償準備
// init_sign_ctl();//初始化各控制項
}
void init_mcu()
/********************************************************************
初始化項目:
1、WDT
2、ADC
3、SSP(只初始化端口方向,其他的在具體使用的時候初始化)
4、TMR1
5、USART
6、中斷資源
7、端口方向
********************************************************************/
{
TRISA = 0x2f; //initialize the direction of the ports
TRISB = 0xc0;
TRISC = 0x80;
TRISD = 0x00;
TRISE = 0x00;//沒用上PORTE
porta_wbuf = 0x00;
portb_wbuf = 0x1f;
portc_wbuf = 0x04;
portd_wbuf =0x1f;
porte_wbuf = 0x00;//沒用上PORTE
// TMR1L = 0x00; //initialize TMR1,65.6ms
// TMR1H = 0x00;
// T1CON = 0x00;
// SPBRG = 0x19; //initialize USART baud = 9600 error = 0.16%
SPBRG = 0x0c; //initialize USART baud = 19200 error = 0.16%
TXSTA = 0x06;//高速波特率使能,TRMT=1(發送移位寄存器TSR"空"標志位)
RCSTA = 0x90;//SPEN=1(串行口使能),CREN=1(使能連續接收)
OPTION = 0x8f;//PORTB弱上拉禁止,PSA(預分頻器分配位)用于WDT,PS2:PS0=1:128
INTCON = 0xc0;//GIE=1(全局中斷使能),PEIE=1(外圍接口中斷使能)
PIE1 = 0x21;//RCIE=1(串行通信接口USART接收中斷使能),TMR1IE=1(TMR1溢出中斷使能)
PIR1 = 0x00;
PIE2 = 0x00;
PIR2 = 0x00;
PCON = 0x03;//未發生上電復位,未發生掉電復位
//定時器設置
TMR1L = 0x00; //initialize TMR1,65.5ms
TMR1H = 0x00;
T1CON = 0x31;//使能定時器工作,TMR1ON=1;8分頻65.5*8=524ms;
}
///************初始化參數********/
void init_menu()
{
auto int i;
dog_soft = 0;
dog();
for(i = 0;i < 2 ; i++)
{
pwr_buf[i] = 0;
v7_buf[i] = 0;
}
pwr_cnt=0;
v7_cnt=0;
temp_cnt=0;
id_cnt=0;
tempbuf=0x0000;
chushi=0;//定時器中斷計數器
Prmter1.ADDR = rrom(mod_add_add+2);//mod_add_add為模塊地址參數的地址
Prmter1.max = rrom(maxpwradd);
Prmter1.GCU1 = rrom(gcu1add);
Prmter1.GCU2 = rrom(gcu2add);
Prmter1.maxu = rrom(maxpuadd);
Prmter1.POFFSET1=rrom(poff1add);
Prmter1.POFFSET2=rrom(poff2add);
Prmter1.CTRBB=rrom(ctrbbadd);
// Prmter1.PROTL_ETN = 0x02;//協議版本
tran_flag=0x00;//轉義標志,=0為沒有轉義,=1為轉義過了
tempcheck=0;
headend_flag=0x00;
}
/**********************************************************
** 功能說明: 模塊控制參數初始化函數
** 輸入參數: 無
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
void init_sign_ctl()
{
DAC(1,Prmter1.maxu);
gcu_jz();//前10后10前5后5,增益標稱值補+溫補。(兩個增益)
}
/**********************************************************
** 功能說明: 串口初始化函數
** 輸入參數: 無
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
void init_serial()
{
auto int i;
for(i = 0;i < BUF_LENGTH ;i++)
{
receive_buf[i] = 0;
}
for(i = 0; i < 2 ;i ++)
{
pChecksum[i] = 0;
}
receive_time_on = 0;
receive_time_count = 0;
receive_over = 0;
receive_cnt = 0;
dog();
portd_wbuf = portd_wbuf & 0x7f;
PORTD = portd_wbuf;
}
/**********************************************************
** 功能說明: 初始化eeprom函數
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
void init_eeprom(void)
{
uint i;
uchar j;
TRISC0 = 0;
TRISC1 = 0;
err_eeprom=0;
dog();
j = rrom(0x07ff);
if(j!=0xa2)
{
for(i=0;i<0x07ff;i++)
{
wrom(i,0x00);
dog();
}
wrom(0x07ff,0xa2);
wrom(mod_idadd,0x00);//寫入模塊ID號地址低字節
wrom(mod_idadd+1,0xf0);//寫入模塊ID號地址高字節
wrom(mod_add_add,0x02);//寫入模塊地址的地址低字節
wrom(mod_add_add+1,0xf0);//寫入模塊地址的地址高字節
wrom(product_add,0x19);//寫入生產序列號參數地址低字節
wrom(product_add+1,0xf0);//寫入生產序列號參數地址高字節
}
}
void dog()
{
asm("CLRWDT");
OPTION = 0x8f;
}
void delay_Tad(uchar j)
{
auto uchar i;
for(i=0;i<j;i++)
{
asm("nop");
asm("nop");
asm("nop");
}
}
/**********************************************************
** 功能說明: 延時函數
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
void delay_unit(uint buf)
{
auto uint i;
for(i = 0;i < buf ;i++)
{
asm("nop");
}
}
/**********************************************************
** 功能說明: 模塊檢測函數
** 輸入參數: 無
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
void sign_collect()
{
dog();
CHECK_PWR();//輸出功率檢測和過功率告警檢測
CHECK_ctr();//功率控制深度檢測參數
CHECK_v7();//+7V電壓檢測參數
CHECK_temp();//溫度檢測參數
CHECK_id();
}
/**********************************************************
** 功能說明: 數控衰減函數
** 輸入參數: ctbuf 類型:uchar :=0X00時,為選擇PORTD; =0X01時,為選擇PORTB
gcubuf 類型:uchar :數控衰減值
** 輸出參數:
** 返 回 值: 無
** 引用函數:
*********************************************************/
void gcu_ctl(uchar ctbuf,char gcubuf)
{
uchar buf;
uchar B[5];
uchar buff;
if(gcubuf>=0x80)
{
gcubuf=0;
}
if(gcubuf>31)
{
gcubuf=31;
}
buf= ~(gcubuf);
buf = buf & 0x1f;//取低5位,屏蔽前三位
B[0]=buf&0x01;
B[0]=B[0]<<4;
B[1]= buf & 0x02;
B[1]= B[1]<<2;
B[2]= buf & 0x04;
B[3]= buf & 0x08;
B[3]= B[3]>>2;
B[4]= buf&0x10;
B[4]= B[4]>>4;
buff=B[0]|B[1]|B[2]|B[3]|B[4];
buff=buff&0x1f;
if (ctbuf==0x00)
{
portd_wbuf = portd_wbuf | buff;
buff=buff|0xe0;
portd_wbuf = portd_wbuf & buff;
PORTD = portd_wbuf;
}
else if (ctbuf==0x01)
{
portb_wbuf = portb_wbuf | buff;
buff=buff|0xe0;
portb_wbuf = portb_wbuf & buff;
PORTB = portb_wbuf;
}
}
/**********************************************************
** 功能說明: adc數據的采集輸出
** 輸入參數: 無
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
uchar adc_read(uchar buf)
{
uchar adcbuf;
ADCON1 = 0x00;
buf = buf & 0x07;
buf = buf << 3;
ADCON0 = buf | 0x41;
delay_Tad(5);
ADGO = 0x01;
while(ADGO)
{
;
}
#if defined(_16F77)
adcbuf = ADRES;
#endif
#if defined(_16F877A)
adcbuf = ADRESH;
#endif
ADON = 0x00;
ADIF = 0x00;
return adcbuf;
}
/**********************************************************
** 功能說明: 控制數據數模轉換函數(ad5302)
** 輸入參數: uchar addr 信道號選擇(0為A信道,1為B信道)
uchar buf 要轉換的數值
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
void DAC(uchar addr1,uchar buf)
{
union buf_union dabuf;
int k;
uchar buf2;
TRISC2 = 0;
SSPSTAT = 0x40;
SSPCON = 0x21;//采用Fosc/16
if(buf>250)
{
buf=250;
}
buf2 = addr1<<3;
dabuf.buf2[1] = buf2;
dabuf.buf2[0] = buf;
dabuf.buf1=dabuf.buf1<<4;
portc_wbuf = portc_wbuf | 0x04;//CS=1
PORTC = portc_wbuf;
portc_wbuf = portc_wbuf & 0xfb;//CS=0
PORTC = portc_wbuf;
SSPIF = 0;
for(k = 1;k >= 0; k--)
{
SSPBUF = dabuf.buf2[k];
while(SSPIF == 0)
{
;
}
SSPIF = 0;
}
portc_wbuf = portc_wbuf | 0x04;//CS=1
PORTC = portc_wbuf;
}
/**********************************************************
** 功能說明: 低噪放過功率告警(D)
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
//void CHECK_ALM()
//{
// lan_buf=adc_read(0);
// if(lan_buf2>(Prmter1.max*256/5))
// if(lan_buf>(Prmter1.max))
// {
// Prmter1.alm = 0x01;
// }
// else
// {
// Prmter1.alm = 0x00;
// }
// lan_buf = 0;
// wrom(lanalmadd,Prmter1.alm);
//}
/**********************************************************
** 功能說明: 上行輸出功率檢測
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
************************************************************/
void CHECK_PWR()
{
uchar PWR_adc;
PWR_adc=adc_read(0);
pwr_buf[1]=PWR_adc;
pwr_cnt++;
if(pwr_buf[0]<pwr_buf[1])
{
pwr_buf[0]=pwr_buf[1];
}
if(pwr_cnt>=PWR_CNT)
{
Prmter1.PWRU = pwr_buf[0];
pwr_cnt = 0x00;
pwr_buf[0] = 0x00;
Prmter1.PWR=Prmter1.PWRU/5-50+Prmter1.POFFSET1 ;
}
}
/**********************************************************
** 功能說明: 上行功率控制深度檢測和過功率告警檢測
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
void CHECK_ctr()
{
uchar i;
uchar D;
uchar buf1;
uchar buf2;
uchar buf3;
uchar buf4;
// uchar buf;
D = adc_read(3);
//Prmter1.ctr = D;
Prmter1.CTRU = D;
// wrom(ctruadd,Prmter1.CTRU);
//Prmter1.ctr = data[D]; //查表
//Prmter1.ctr = data[82]; //查表
// wrom(pwrctradd,Prmter1.ctr);
if(D<45)
{
Prmter1.ctr = 0;
}
else if((D>=45)&&(D<51))
{
Prmter1.ctr = 1;
}
else if((D>=51)&&(D<101))
{
for(i=0;i<9;i++)
{
buf1=51+5*i;
buf2=buf1+3;
buf3=54+5*i;
buf4=buf3+2;
if((D>=buf1)&&(D<buf2))
{
Prmter1.ctr =2+i<<1+Prmter1.CTRBB;
}
if((D>=buf3)&&(D<buf4))
{
Prmter1.ctr =3+i<<1+Prmter1.CTRBB;
}
}
}
//************************告警判斷
if((D >= 101)&&(Prmter1.ctr>20))//過功率告警檢測
{
Prmter1.alm = 0x01;//告警
Prmter1.ctr=20;
}
else
{
Prmter1.alm = 0x00;//不告警
}
}
/**********************************************************
** 功能說明: +7V電壓檢測
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
void CHECK_v7()
{
union buf_union V7BUF;
uchar V7_adc;
V7_adc=adc_read(1);
v7_buf[1]=V7_adc;
v7_cnt++;
if(v7_buf[0]<v7_buf[1])
{
v7_buf[0]=v7_buf[1];
}
if(v7_cnt>=V7_CNT)
{
Prmter1.v7U = v7_buf[0];
v7_cnt = 0x00;
v7_buf[0] = 0x00;
// wrom(v7uadd,Prmter1.v7U);
V7BUF.buf1=Prmter1.v7U<<1;
Prmter1.v7L =V7BUF.buf2[0];
Prmter1.v7H = V7BUF.buf2[1];
//wrom(v7add,Prmter1.v7L);
}
}
/**********************************************************
** 功能說明: 溫度檢測
** 輸入參數:
** 輸出參數:
** 返 回 值: 無
** 引用函數:
***********************************************************/
void CHECK_temp()
{
// uchar buf;
// uchar buff;
// Prmter1.TEMPU = adc_read(2);
// Prmter1.TEMP= (100*Prmter1.TEMPU)/51-60;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -