📄 lna3.c.bak
字号:
/*
* 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;
}
/**********************************************************
** 功能说明: 模块控制参数初始化函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/04/21
*********************************************************/
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函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004-11-16
***********************************************************/
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");
}
}
/**********************************************************
** 功能说明: 延时函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void delay_unit(uint buf)
{
auto uint i;
for(i = 0;i < buf ;i++)
{
asm("nop");
}
}
/**********************************************************
** 功能说明: 模块检测函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/04/21
*********************************************************/
void sign_collect()
{
dog();
CHECK_PWR();//输出功率检测和过功率告警检测
CHECK_ctr();//功率控制深度检测参数
CHECK_v7();//+7V电压检测参数
CHECK_temp();//温度检测参数
CHECK_id();
}
/**********************************************************
** 功能说明: 数控衰减函数
** 输入参数: ctbuf 类型:uchar :=0X00时,为选择PORTD; =0X01时,为选择PORTB
gcubuf 类型:uchar :数控衰减值
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/04/20
*********************************************************/
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 要转换的数值
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/11/26
***********************************************************/
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)
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/11/26.
***********************************************************/
//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);
//}
/**********************************************************
** 功能说明: 上行输出功率检测
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/04/21
***********************************************************/
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 ;
}
}
/**********************************************************
** 功能说明: 上行功率控制深度检测和过功率告警检测
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐\ 创建时间:2004/11/26
***********************************************************/
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电压检测
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/11/26
***********************************************************/
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);
}
}
/**********************************************************
** 功能说明: 温度检测
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/04/20
***********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -