📄 cdma800.c.bak
字号:
/*
* Copyright (c) 2005,深圳市国人通信有限公司综合网管部
* All rights reserved.
*
* 文件名称:cdma800.c
* 文件标识:见配置管理计划书
* 摘 要:cdma800模块的监控数据处理
*
* 当前版本:1.1
* 作 者:陈璐
* 完成日期:
*
* 取代版本:
* 原作者 :
* 完成日期:
*/
#include"cdma800.h"
void main()
{
delay_unit(10000);
init();
do
{
sign_collect();
serial_data();
if (chushi>=0x0d6b)//定时器1产生3435次中断,每次终端时间为65.5*8=524ms,3435次中断约为半个小时
{
init_sign_ctl();
chushi=0;
}
}while(1);
}
void init()
{
init_mcu();
init_menu();
init_serial();
init_eeprom();
//CHECK_TEMP();
//init_sign_ctl();
}
void init_mcu()
/********************************************************************
初始化项目:
1、WDT
2、ADC
3、SSP(只初始化端口方向,其他的在具体使用的时候初始化)
4、TMR1
5、USART
6、中断资源
7、端口方向
********************************************************************/
{
//char x;
// x=-2;
delay_unit(250);
TRISA = 0x2f; //initialize the direction of the ports
TRISB = 0xd0;
TRISC = 0x83;
TRISD = 0x20;
TRISE = 0x07;
porta_wbuf = 0x00;
portb_wbuf = 0x00;
portc_wbuf = 0x04;
portd_wbuf = 0x00;//modify
porte_wbuf = 0x00;
// TMR1L = 0x00; //initialize TMR1,65.6ms
// TMR1H = 0x00;
// T1CON = 0x00;//未用
SPBRG = 0x0c; //initialize USART baud = 9600 error = 0.16%
TXSTA = 0x06;
RCSTA = 0x90;
OPTION = 0x8f;
INTCON = 0xc0;
PIE1 = 0x21;
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;
}
/**********************************************************
** 功能说明: 初始化模块内部参数函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005-06-06
***********************************************************/
void init_menu()
{
dog_soft = 0;
dog();
Prmter1.ATT = rrom(attadd);
Prmter1.VGS1_L = rrom(vgs1add);
Prmter1.VGS1_H = rrom(vgs1add+1);
Prmter1.VGS2_L = rrom(vgs2add);
Prmter1.VGS2_H = rrom(vgs2add+1);
Prmter1.VGS3_L = rrom(vgs3add);
Prmter1.VGS3_H = rrom(vgs3add+1);
Prmter1.PC = rrom(pcadd);
Prmter1.PCU_L = rrom(pcuadd);
Prmter1.PCU_H = rrom(pcuadd+1);
Prmter1.BUTTON1= rrom(but1add);
Prmter1.POFFSET1=rrom(poff1add);
Prmter1.POFFSET2=rrom(poff2add);
Prmter1.POFFSET3=rrom(poff3add);
// Prmter1.ID_L = MOD_ID_L;
// Prmter1.ID_H = MOD_ID_H;
// Prmter1.PROTL_ETN = 0x08;
chushi=0;
Prmter1.ADDR = rrom(mod_add_add);
tempcheck=0;
tran_flag=0x00;//转义标志,=0为没有转义,=1为转义过了
headend_flag=0x00;
}
/**********************************************************
** 功能说明: 初始化串口数组函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void init_serial()
{
auto uchar 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 & 0xef;
PORTD = portd_wbuf;
}
/**********************************************************
** 功能说明: 初始化看门狗函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void dog()
{
asm("CLRWDT");
OPTION = 0x8f;
}
/**********************************************************
** 功能说明: 延时函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void delay_unit(uint buf)
{
auto uint i;
for(i = 0;i < buf ;i++)
{
asm("nop");
}
}
/**********************************************************
** 功能说明: 延时函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void delay_Tad(uchar j)
{
auto uchar i;
for(i=0;i<j;i++)
{
asm("nop");
asm("nop");
asm("nop");
}
}
/**********************************************************
** 功能说明: 初始化eeprom函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005-7-16
***********************************************************/
void init_eeprom(void)
{
uchar j;
uint i;
TRISC0 = 0;
TRISC1 = 0;
err_eeprom=0;
j = rrom(0x07ff);
if(j!=0xaa)
{
for(i=0;i<0x07ff;i++)
{
wrom(i,0x00);
dog();
}
wrom(0x07ff,0xaa);
}
}
/**********************************************************
** 功能说明: 模块检测函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2004/12/13
*********************************************************/
void sign_collect()
{
dog();
CHECK_TEMP();//温度检测
CHECK_POF();//输出功率检测
CHECK_POR();//反向输出功率检测
CHECK_CTR();//过功率检测\控制深度检测
CHECK_v28v();//28V检测
CHECK_ID1();//推动级电流检测id4
CHECK_ID2();//末级I电流检测id5
CHECK_ID3();//末级II电流检测id6
}
/**********************************************************
** 功能说明: 模块控制参数初始化函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/10/25
*********************************************************/
void init_sign_ctl()
{
if(Prmter1.BUTTON1==0)
{
DAC(2,0,0);//推动极第二个管子第二级栅压
DAC(1,0,0);//末级第一个管子栅压
DAC(0,0,0);//末级第二个管子栅压
}
else
{
init_vgsandpcu(2 ,2,Prmter1.VGS1_H,Prmter1.VGS1_L);
init_vgsandpcu(1 ,3,Prmter1.VGS2_H,Prmter1.VGS2_L);
init_vgsandpcu(0 ,4,Prmter1.VGS3_H,Prmter1.VGS3_L);
}
init_vgsandpcu(3 ,5,Prmter1.PCU_H,Prmter1.PCU_L);//功放输出功率
init_att(1 ,1,Prmter1.ATT);
}
/**********************************************************
** 功能说明: 输出功率1、2和四个栅压控制初始化控制函数
** 输入参数: CHANNEL 类型:uchar :AD5318转换管道号
tempnumb 类型:uchar :温度补偿第几个参数
buf_H 类型:uchar :数值的高字节
buf_L 类型:uchar :数值的低字节
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/09/04
*********************************************************/
void init_vgsandpcu(uchar channel ,uchar tempnumb,uchar buf_H,uchar buf_L)
{
uint bcbuf;
uchar numb;
Prmter1.VTPBC=TEMP(tempnumb);
vbuf.buf2[0]=buf_L;
vbuf.buf2[1]=buf_H;
if(Prmter1.VTPBC<0x80)
{
bcbuf=Prmter1.VTPBC;
bcbuf=bcbuf&0x00ff;
vbuf.buf1=vbuf.buf1+bcbuf;
}
//else if ((Prmter1.VTPBC>=0x80)&&(vbuf.buf1>=((-Prmter1.VTPBC)+(-Prmter1.VTPBC))))
else if (Prmter1.VTPBC>=0x80)
{
bcbuf=256-Prmter1.VTPBC;
bcbuf=bcbuf&0x00ff;
vbuf.buf1=vbuf.buf1-bcbuf;
}
if(vbuf.buf1>0x03fc)
{
vbuf.buf1=0x0000;
}
if (vbuf.buf1>=0x03dd)//电压超过4。8V
{
vbuf.buf1=0x03dd;
}
// else
// {
// vbuf.buf1=0x0000;
// }
numb=tempnumb-2;
Prmter1.ACTVPL[numb]=vbuf.buf2[0];
Prmter1.ACTVPH[numb]=vbuf.buf2[1];
DAC(channel,vbuf.buf2[1],vbuf.buf2[0]);
return;
}
/**********************************************************
** 功能说明: 增益1、2控制初始化控制函数
** 输入参数: tempnumb 类型:uchar :温度补偿第几个参数
attnumb 类型:uchar :标称值补偿第几个参数
attbuf 类型:uchar :衰减数值
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/09/01
*********************************************************/
void init_att(uchar tempnumb ,uchar attnumb,uchar attbuf)//
{
Prmter1.GCUTPBC=TEMP(tempnumb);
Prmter1.GCUBC=ATTBU(attbuf,attnumb);
//Prmter1.FQGCUBC=FREQBU(fr/2,fqnumb);
dog();
attbuf=attbuf+Prmter1.GCUTPBC+Prmter1.GCUBC;
if(attbuf>=0x80)//衰减<0.
{
attbuf=0;
}
if(attbuf>=63)//衰减不可以超过31.5DB.
{
attbuf=63;
}
Prmter1.ACTATT=attbuf;
ATT(attbuf);
return;
}
/**********************************************************
** 功能说明: 增益实际值补偿函数
** 输入参数: attin 类型:uchar :标称值
attnb 类型:uchar :=1,代表第1个增益,=2,代表第2个增益等
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/06/09
*********************************************************/
char ATTBU(char attin,uchar attnb)
{
uchar i;
char buf;
buf=0;//如果比较没有结果,则返回0
for (i=0;i<bcnumb;i++)
{
B[0]=rrom(bczcszd+zyn*i+attnb-1);//参数值首地址+偏置
if (attin==i)
{
//buf=B[0]+buf4;
buf=B[0];
break;
}
}
B[0]=0;
return buf;
}
/**********************************************************
** 功能说明: 频响实际值补偿函数(其实是增益补偿)DB/2
关于频率值计算,设信道号为X,频点宽为100K,二分频,则频率值=信道0时频率值+信道×0.025
** 输入参数: freqin 类型:uchar :信道值
freqnb 类型:uchar :代表第几个本振器件。
** 输出参数:
** 返 回 值: 频响补偿实际值 buf,如果返回值为0,则为没有补偿值
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/06/07
*********************************************************/
uchar FREQBU(uchar freqin,uchar freqnb)
{
uchar i;
uchar buf;
uchar P[2];//EEPROM中信道值1byte
buf=0;//如果比较没有结果,则返回0
for (i=0;i<fnumb;i++)//频率
{
P[0]=rrom(freqd+i);
if (i<(fnumb-1))
{
P[1]=rrom(freqd+i+1);
}
else
{
P[1]=P[0];
}
if (freqin==P[0])
{
B[0]=rrom(freqcszd+pn*i+freqnb-1);
buf=B[0];
break;
}
else if((freqin>P[0])&&(freqin<P[1]))
{
B[0]=rrom(freqcszd+pn*i+freqnb-1);
B[1]=rrom(freqcszd+pn*(i+1)+freqnb-1);
if (B[1]>B[0])
{
B[2]=B[0]+(((B[1]-B[0])*(freqin-P[0]))/(P[1]-P[0]));
}
else
{
B[2]=B[0]-(((B[0]-B[1])*(freqin-P[0]))/(P[1]-P[0]));
}
buf=B[2];
break;
}
}
return buf;
}
/**********************************************************
** 功能说明: 温度补偿函数(温补参数占1个字节,补偿电压为mV单位,增益为DB/2单位等)
** 输入参数: // buf3 类型:uchar :buf3=1,表示温补参数占1个字节;buf3=2,表示温补参数占2个字节
tempnb 类型:uchar :在温补表中是第几个参数,=1,是第1个参数;=2,第2个参数
// buf7 类型:uchar :在tn中参数是第几个字节开始的参数
// buff: 类型:uchar :=0:温度补偿函数是△值,=1:温度补偿函数是实际值
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/06/09
*********************************************************/
uchar TEMP(uchar tempnb)
{
uchar i;
uchar buf;
char T[2];//EEPROM?D???è?μ
uchar buff;
uchar buf1;
uchar buf2;
uchar buf3;
buf=0;//è?1?±è????óD?á1?£??ò·μ??0
buf3=0;
for (i=0;i<tpnumb;i++)
{
dog();
T[0]=rrom(tempd+i);
if(i<tpnumb-1)
{
T[1]=rrom(tempd+i+1);
}
else
{
T[1]=T[0];
}
if (Prmter1.TEMP==T[0])
{
B[0]=rrom(tempcszd+tn*i+tempnb-1);
buf=B[0];
break;
}
if ((Prmter1.TEMP>T[0])&&(Prmter1.TEMP<T[1]))
{
buf3=1;
}
if ((Prmter1.TEMP>T[0])&&(Prmter1.TEMP>T[1])&&(T[1]<0x80)&&(T[0]>0x80))
{
buf3=1;
}
if(buf3==1)
{
B[0]=rrom(tempcszd+tn*i+tempnb-1);
B[1]=rrom(tempcszd+tn*(i+1)+tempnb-1);
buff=B[1]-B[0];
if (buff<0x80)
{
buf1=(Prmter1.TEMP-T[0]);
buf2=T[1]-T[0];
buf1=(B[1]-B[0])*buf1;
buf1=buf1/buf2;
buf1=buf1;
B[2]=B[0]+buf1;
}
else
{
buf1=(Prmter1.TEMP-T[0]);
buf2=T[1]-T[0];
buf1=(B[0]-B[1])*buf1;
buf1=buf1/buf2;
buf1=buf1;
B[2]=B[0]-buf1;
}
buf=B[2];
break;
}
}
return buf;
}
/**********************************************************
** 功能说明: 模拟SPI方式设置衰减函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004/12/13
*********************************************************/
void ATT(uchar buf1)
{
uchar i;
RCIE=0;
CREN=0;
T1CON=0x00;
// if(buf1>0x80)
// {
// buf1=0x00;
// }
// if(buf1>0x3f)
// {
// buf1=0x3f;
// }
buf1 = buf1 << 2;
portb_wbuf = portb_wbuf & 0xf3;//clock & LE置低电平
PORTB = portb_wbuf;
for(i=6;i>=1;i--)
{
if(buf1&0x80)//衰减值的设置
{
portb_wbuf = portb_wbuf | 0x02;//RB1
PORTB = portb_wbuf;
}
else
{
portb_wbuf = portb_wbuf & 0xfd;
PORTB = portb_wbuf;
}
portb_wbuf = portb_wbuf | 0x04;//clock置高电平
PORTB = portb_wbuf;
_nop();
_nop();
portb_wbuf = portb_wbuf & 0xfb;//clock置低电平
PORTB = portb_wbuf;
_nop();
_nop();
buf1 = buf1<< 1;
}
_nop();
portb_wbuf = portb_wbuf | 0x08;//LE置高电平
PORTB = portb_wbuf;
_nop();
portb_wbuf = portb_wbuf & 0xf7;//LE置低电平
PORTB = portb_wbuf;
T1CON=0x31;
CREN=1;
RCIE=1;
}
/**********************************************************
** 功能说明: 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -