www.pudn.com > main_zkf.rar > main_zkf.c
#include "pic18.h"
#include "math.h"
/******************************************************************
端口定义
******************************************************************/
/*control<2>=p3=A2_5=RD0
control<1>=p4=A1_5=RD1
control<0>=p7=A0_5=RD2
control="000"时,控制上行衰减
control="001"时,控制下行衰减
control="010"时,控制BIAS,BIAS={data_in,2'b00}
control="011"时,不检测
data_in输入范围为0~31
data_in<4>=p20=D4_5=RD7
data_in<3>=p19=D3_5=RD6
data_in<2>=p13=D2_5=RD5
data_in<1>=p11=D1_5=RD4
data_in<0>=p10=D0_5=RD3*/
//DA端口定义
//A:末级功放偏压A2
//B:末级功放偏压A1
//C:末级功放偏压B2
//D:末级功放偏压B1
unsigned char display_buffer[]={0x00,0x00,0x00,0x00,0xff};
unsigned char number_table[]={'0','1','2','3','4','5','6','7','8','9'};
#define dacdata RE2
#define dacclk RE3
#define dacload RE4
#define dacldac RE5
#define control_att_up 0x00
#define control_att_dn 0x01
#define control_bias 0x02 //010
#define control_backward_bias 0x03 //011
#define slot_number_inform 0x06 //110
#define control_no_detect 0x04 //100
#define control_only_up 0x05 //101
#define delay_value 5000
unsigned char B2=0;//末级功放偏压B2阈值
unsigned char B1=0;//末级功放偏压B1阈值
unsigned char A2=0;//末级功放偏压A2阈值
unsigned char A1=0;//末级功放偏压A1阈值
/******************************************************************
AD模块相关变量定义
******************************************************************/
unsigned char AD_Flag=0; //AD转换完成标志,AD_Flag=1表示有新的AD数据转换完成
volatile unsigned int ADResult;
volatile unsigned int ADResult12[12];//AD转换结果数组
int ADResult0[3];//末级功放偏压B2
int ADResult1[3];//末级功放偏压B1
int ADResult2[3];//末级功放偏压A2
int ADResult3[3];//末级功放偏压A1
int ADResult4[3];//下行启动门限
int ADResult5[3];//反射功率检测
int ADResult6[3];//上行输出功率检测
int ADResult7[3];//下行输入功率检测
int ADResult8[3];//下行输出功率检测
int ADResult9[3];//末级温度检测
int ADResult10[3];//环境温度检测
int ADResult11[3];//电源电压检测
unsigned char ADCounter;//AD计数器
/******************************************************************
串口通信模块相关变量定义
******************************************************************/
unsigned char recdata; //接收数据寄存器
unsigned char SciReceiveFlag=0; //=1表示接收到新数据,=0表示未接收到新数据
unsigned char DownStartLevel;//下行启动电平
unsigned char Ts0;//下行输入功率
unsigned char Ts1;//下行输入功率
unsigned char Ts2;//下行输入功率
unsigned char Ts3;//下行输入功率
unsigned char Ts4;//上行输入功率
unsigned char Ts5;//上行输入功率
unsigned char Ts6;//上行输入功率
unsigned int Ts0_latch,Ts0_out_latch; //下行输入功率和输出功率锁存
unsigned int Ts1_latch,Ts1_out_latch; //上行输入功率和输出功率锁存
unsigned int Ts2_latch,Ts2_out_latch; //上行输入功率和输出功率锁存
unsigned int Ts3_latch,Ts3_out_latch; //上行输入功率和输出功率锁存
unsigned int Ts4_latch,Ts4_out_latch; //下行输入功率和输出功率锁存
unsigned int Ts5_latch,Ts5_out_latch; //下行输入功率和输出功率锁存
unsigned int Ts6_latch,Ts6_out_latch; //下行输入功率和输出功率锁存
unsigned int Ts0_out_latch0; //下行输入功率和输出功率锁存
unsigned int Ts1_out_latch0; //上行输入功率和输出功率锁存
unsigned int Ts2_out_latch0; //上行输入功率和输出功率锁存
unsigned int Ts3_out_latch0; //上行输入功率和输出功率锁存
unsigned int Ts4_out_latch0; //下行输入功率和输出功率锁存
unsigned int Ts5_out_latch0; //下行输入功率和输出功率锁存
unsigned int Ts6_out_latch0; //下行输入功率和输出功率锁存
unsigned int Ts0_out_latch1; //下行输入功率和输出功率锁存
unsigned int Ts1_out_latch1; //上行输入功率和输出功率锁存
unsigned int Ts2_out_latch1; //上行输入功率和输出功率锁存
unsigned int Ts3_out_latch1; //上行输入功率和输出功率锁存
unsigned int Ts4_out_latch1; //下行输入功率和输出功率锁存
unsigned int Ts5_out_latch1; //下行输入功率和输出功率锁存
unsigned int Ts6_out_latch1; //下行输入功率和输出功率锁存
unsigned int Ts0_out_latch2; //下行输入功率和输出功率锁存
unsigned int Ts1_out_latch2; //上行输入功率和输出功率锁存
unsigned int Ts2_out_latch2; //上行输入功率和输出功率锁存
unsigned int Ts3_out_latch2; //上行输入功率和输出功率锁存
unsigned int Ts4_out_latch2; //下行输入功率和输出功率锁存
unsigned int Ts5_out_latch2; //下行输入功率和输出功率锁存
unsigned int Ts6_out_latch2; //下行输入功率和输出功率锁存
unsigned int Ts0_out_latch3; //下行输入功率和输出功率锁存
unsigned int Ts1_out_latch3; //上行输入功率和输出功率锁存
unsigned int Ts2_out_latch3; //上行输入功率和输出功率锁存
unsigned int Ts3_out_latch3; //上行输入功率和输出功率锁存
unsigned int Ts4_out_latch3; //下行输入功率和输出功率锁存
unsigned int Ts5_out_latch3; //下行输入功率和输出功率锁存
unsigned int Ts6_out_latch3; //下行输入功率和输出功率锁存
unsigned char Att_total_up; //上行缩减总量=人为衰减+自动衰减
unsigned char Att_total_dn; //下行缩减总量=人为衰减+自动衰减
unsigned char Gain_dn; //下行增益,按照每次的时隙更新
unsigned char Gain_up; //上行增益,按照每次的时隙更新
volatile unsigned char SW_latch;//Standing Wave
volatile unsigned char address_right;
//设置值按照8bit整形存储,在串口通信时外送标准格式
unsigned int Ts1_threhold = 0x004D; //上行功率门限1 --E2PROM位置0x11,大概0.7v
unsigned int Ts2_threhold = 0x004D; //上行功率门限2 --E2PROM位置0x12
unsigned int Ts3_threhold = 0x004D; //上行功率门限3 --E2PROM位置0x13
unsigned int Ts4_threhold = 0x0311; //下行功率门限5 --E2PROM位置0x15
unsigned int Ts5_threhold = 0x0311; //下行功率门限4 --E2PROM位置0x14
unsigned int Ts6_threhold = 0x0311; //下行功率门限0 --E2PROM位置0x10
unsigned int Ts0_threhold = 0x0011; //下行功率门限6 --E2PROM位置0x16
#define below_threhold 0x0010 //实际应该是1dB
#define over_threhold 0x0010 //实际应该是1dB
unsigned int Ts4_low_threhold; //下行功率门限4 --E2PROM位置0x14
unsigned int Ts5_low_threhold; //下行功率门限5 --E2PROM位置0x15
unsigned int Ts6_low_threhold; //下行功率门限6 --E2PROM位置0x16
unsigned int Ts0_low_threhold; //下行功率门限0 --E2PROM位置0x10
unsigned char Att_manual_up = 0; //上行手动缩减量--E2PROM位置0x17
unsigned char Att_manual_dn = 0; //下行手动缩减量 --E2PROM位置0x18
unsigned char Forward_dn = 0; //us,下行同步开关前沿量--E2PROM位置0x19
unsigned char Backward_dn = 0; //us,下行同步开关前沿量--E2PROM位置0x19
unsigned char switch_in_shut = 0;
unsigned char Open_threhold_dn = 0x2D; //下行同步启动门限量 --E2PROM位置0x20, 大概0.2v
//unsigned char B2= 0x03;//末级功放偏压B2阈值 --E2PROM位置0x21
//unsigned char B1= 0x03;//末级功放偏压B1阈值 --E2PROM位置0x22
//unsigned char A2= 0x03;//末级功放偏压A2阈值 --E2PROM位置0x23
//unsigned char A1= 0x03;//末级功放偏压A1阈值 --E2PROM位置0x24
unsigned char Channel_Choice; //这个是指示当前的时隙位置
unsigned char Channel_Choice_next; //这个是指示next时隙位置
unsigned char uart_rec_data[2]={0,0};//,0,0,0,0,0,0};
unsigned char setup_data[2]; //这个是打算设置的数据
unsigned char uart_send_data[9]; //这个数据需要和uart_send_tag_data配合组成串口发送数据
//unsigned char uart_send_tag_data[2];
unsigned char recdata;
unsigned char package_data_count =0;
unsigned char data_width,end_data_width;
unsigned char data_addr; //地址信息
unsigned char r_w =0xff; ////对本系统读标志
unsigned char INT0_Flag=0; //IO中断标志
unsigned char INT0_att=0;
unsigned char RC_flag=0; //UART中断标志
unsigned char Att_value[7]={31,31,31,31,31,31,31};//时隙0至7的衰减量数组,这个为自动衰减量
//unsigned char Att_signal[31]={0x00,0x01,0x02,0x03,31,31,31};//时隙0至7的衰减量数组,这个为自动衰减量
unsigned char LastChannel=0;//上一次衰减的时隙
unsigned char int_cnt=0;
unsigned char state=0;
/******************************************************************
IO中断相关变量定义
******************************************************************/
//volatile unsigned char UpDownFlag;//上下行标志
unsigned char UpDownFlag;//上下行标志
/******************************************************************
函数声明
******************************************************************/
void adc_initial(void);
void Deal_AD(void);
void uart_initial(void);
//void uart_send(void);
void dacdelay(unsigned int x);
void dacck(void);
void writedac(unsigned char dat,unsigned char channel,unsigned char rng);
void INT0_initial(void);
void data_converter(unsigned char *p,unsigned int value);
void send_data(unsigned char *p);
void send_adc12_data(void);
void Compare(void);
void Calculate(void);
void SendPortD(unsigned char channel,unsigned char data);
void Att(unsigned char channel, unsigned char data);
void uart_rec_process (void);
//eeprom_write(addr,data);第一个参数为地址,第二个参数为数据
//eeprom_read(addr);参数为地址,返回值为数据
main()
{
uart_initial();//串口初始化
adc_initial();//AD转换初始化
INT0_initial();
TRISD=0X00;//设置D口为输出方式
TRISB=0XFF;//设置B口为输入方式,中断输入
PORTD=0;
TRISE=0x00;//设置E口为输出方式
//eeprom_write(0x10,100);//往地址0x10写数据
//eeprom_read(0);
//Ts0_threhold = eeprom_read(0x10);
//Ts1_threhold = eeprom_read(0x11);
//Ts2_threhold = eeprom_read(0x12);
//Ts3_threhold = eeprom_read(0x13);
//Ts4_threhold = eeprom_read(0x14);
//Ts5_threhold = eeprom_read(0x15);
//Ts6_threhold = eeprom_read(0x16);
//Att_manual_up = eeprom_read(0x17);
//Att_manual_dn = eeprom_read(0x18);
//Forward_dn = eeprom_read(0x19);
//Backward_dn
//Open_threhold_dn = eeprom_read(0x??);
//B2 = eeprom_read(0x??);
//B1 = eeprom_read(0x??);
//A2 = eeprom_read(0x??);
//A1 = eeprom_read(0x??);
Att_value[1] = Att_manual_up; //这个应该在串口接到手动修改时再进行一次
Att_value[2] = Att_manual_up; //这个应该在串口接到手动修改时再进行一次
Att_value[3] = Att_manual_up; //这个应该在串口接到手动修改时再进行一次
Att_value[4] = Att_manual_dn; //这个应该在串口接到手动修改时再进行一次
Att_value[5] = Att_manual_dn; //这个应该在串口接到手动修改时再进行一次
Att_value[6] = Att_manual_dn; //这个应该在串口接到手动修改时再进行一次
Att_value[0] = Att_manual_dn; //这个应该在串口接到手动修改时再进行一次
SendPortD (control_att_up,0x1f); //开机衰减成最大
SendPortD (control_att_dn,0x1f);
SendPortD (control_bias,Forward_dn);
SendPortD (control_backward_bias,Backward_dn);
while(1)
{
//TXREG1='2';
//TXREG1=eeprom_read(0x10);
// if (AD_Flag==1) //表示AD转换完成
// {
//
// Deal_AD();
// AD_Flag=0; //消除AD转换完成标志
// }
//TXREG1=Att_value[6]; //Only for test for 下行输chu
//SendPortD (control_att_up,Att_manual_up); //正常工作时初始衰减手动植
//SendPortD (control_att_dn,Att_manual_dn);
//if (ADResult12[4]> Open_threhold_dn)//下行启动门限
// {
SendPortD (control_only_up,0x00); //表示打开下行同步功能,因为下行输入信号
// if(INT0_att == 1)
// {
// //INT0IE = 0;
// Att(Channel_Choice ,Att_value[Channel_Choice] );
// //SendPortD (control_att_dn,Att_value[Channel_Choice]);
// //TXREG1=Channel_Choice;
//
// //INT0IE = 1;
//
// INT0_att = 0;
// }
Compare(); //DA结果处理主要部分
//writedac(B2,2,1); //将功放偏流写入
//writedac(B1,3,1);
//writedac(A2,0,1);
//writedac(A1,1,1);
// }
// else //下行启动门限没有达到
// {
// SendPortD (control_only_up,0xff); //表示关闭下行同步功能,因为下行输入信号太弱
// }
//uart_rec_process(); //串口接收数据处理
} //while
}
/******************************************************************
** 函 数 名: interrupt HI_ISR()
** 功能描述: 高优先级中断子程序----AD转换中断
******************************************************************/
void interrupt HI_ISR()
{
unsigned char i =0;
if (RC1IF==1) //RS232接收中断
{
recdata=RCREG1; //接收数据并存储
//uart_rec_data[5]=uart_rec_data[4]; //移位寄存
//uart_rec_data[4]=uart_rec_data[3];
// uart_rec_data[3]=uart_rec_data[2];
// uart_rec_data[2]=uart_rec_data[1];
uart_rec_data[1]=uart_rec_data[0];
uart_rec_data[0]=recdata;
// while (TX1IF== 0); //Only for test
// TXREG1=uart_rec_data[1]; //Only for test
// while (TX1IF== 0); //Only for test
RC1IF=0; //清接收中断标志
RC_flag = 1;
}//if (RC1IF==1)
else if(INT0IF==1)//外部中断0发生
{
TRISD=0XFF;//设置D口为输入方式
UpDownFlag=(PORTD&0xf8)>>3;//读取D口状态
UpDownFlag=(PORTD&0xf8)>>3;//读取D口状态
UpDownFlag=(PORTD&0xf8)>>3;//读取D口状态
Channel_Choice = UpDownFlag; //记住当前时隙,去掉了第5位标示
state = UpDownFlag;
ADIE=1;//A/D转换中断允许
ADCON0=ADCON0|0x02;//启动AD转换
// Att(Channel_Choice,Att_value[Channel_Choice] );
//Compare();
INT0_Flag = 1;
// Txreg1=='2';
// while (TX1IF== 0);
//TXREG1=Channel_Choice; //为了串口测试使用
// while (TX1IF== 0);
// dacdelay(delay_value);
/*
int_cnt++;
if(int_cnt==2)
int_cnt = 0;
//TXREG1=int_cnt;
if(int_cnt == 1) //奇数中断
{
ADIE=1;//A/D转换中断允许
ADCON0=ADCON0|0x02;//启动AD转换
//Att(Channel_Choice,Att_value[Channel_Choice] );
//Compare();
INT0_Flag = 1;
}
else if(int_cnt == 0) //偶数中断
{
ADIE=0;//A/D转换中断禁止
ADCON0=ADCON0&0xfd;//禁止AD转换
//Att(Channel_Choice,0);
// Channel_Choice_next = Channel_Choice + 1;
// if(Channel_Choice_next == 7 )
// Channel_Choice_next = 0;
//Att(Channel_Choice,Att_value[Channel_Choice] );
// TXREG1=Att_value[0];
INT0_att = 1;
}
*/
TRISD=0X00;//设置D口为输出方式
//TXREG1=Channel_Choice;
//SendPortD (slot_number_inform,Channel_Choice);
//SendPortD (slot_number_inform,Channel_Choice);
//Att(Channel_Choice ,Att_value[Channel_Choice] );
INT0IF=0; //清中断标志
}
}
/******************************************************************
** 函 数 名: interrupt low_priority LOW_ISR()
** 功能描述: 低高优先级中断子程序----串口接收中断
******************************************************************/
void interrupt low_priority LOW_ISR()
{
//INT0IE=0;
if(ADIF==1) //AD转换完成
{
ADIF=0; //清中断标志
Deal_AD();
//send_adc12_data();
AD_Flag=1; //置AD转换完成标志
}
//INT0IE=1;
//TXREG1=uart_rec_data[0]; //Only for test
//while (TX1IF== 0); //Only for test
//TXREG1=' '; //Only for test
//while (TX1IF== 0); //Only for test
//recdata=recdata<<3;
//PORTD=recdata|0x04;
}
/******************************************************************
** 函 数 名: Deal_AD(void) 功能描述: AD转换结果处理
******************************************************************/
void Deal_AD(void)
{
//
// ADResult=ADRESL+(ADRESH<<8); //读取并存储AD转换结果(10位,高6位为0)
// ADResult12[ADCounter]=ADResult;//保存AD转换结果,这里可以通过设置来达到模拟AD的目的
// ADCounter++;
// ADCON0=0x01|(ADCounter<<2);//通道选择
// if (ADCounter==11)
// {
// ADCounter=0;
// }
//AD_Flag=0; //AD转换完成标志清零
ADCON0=ADCON0&0xfd;//禁止AD转换
ADCON0=0x01|0x20;//8通道,使能AD
ADResult=ADRESL+(ADRESH<<8); //读取并存储AD转换结果(10位,高6位为0)
ADResult12[8]=ADResult;//保存AD转换结果,这里可以通过设置来达到模拟AD的目的
ADCON0=ADCON0|0x02;//启动AD转换
// ADCON0= 0x20; //8通道,禁止AD
// while (TX1IF== 0); //Only for test
// TXREG1=ADCounter; //Only for test for 下行输入
// while (TX1IF== 0); //Only for test
// TXREG1=ADResult12[8]; //Only for test for 下行输chu
// while (TX1IF== 0); //Only for test
//TXREG1=ADRESH;
}
/******************************************************************
** 函 数 名: adc_initial(void)
** 功能描述: AD初始化
******************************************************************/
void adc_initial(void)
{
ADCounter=0;//AD转换次数清零
ADCON0=0x01|0x20;//8通道,使能AD
//ADCON0=0x01;//选择0通道,打开AD转换
ADCON1=0;//VREF+=VDD,VREF-=VSS,AN0~AN11配置为模拟输入
ADCON2=0x89;//ADFM=1,AD结果右对齐;ACQT2:ACQT0=001,采样时间为2倍TAD;
//ADCS2:ADCS0=001,AD转换时钟为Fosc/8
// ADIP=1;//设AD转换中断为高优先级中断
ADIP=0;//设AD转换中断为低优先级中断
ADIF=0;//清A/D中断标志
//ADIE=0;//A/D转换中断禁止
ADIE=1;//A/D转换中断允许
//ADCON0=ADCON0|0x02;//启动AD转换
ADCON0=ADCON0&0xfd;//禁止AD转换
}
void Compare(void)
{
// while (TX1IF== 0); //Only for test
//TXREG1=ADResult12[4]; //Only for test for 下行输chu
// while (TX1IF== 0); //Only for test
////////////////////////////这里是处理部分/////////////////////////
if((INT0_Flag==1)&&(AD_Flag==1)) //这个是外部中断处理结束,并且AD转变完成
{ //int_cnt = 1;
ADCON0=ADCON0&0xfd;//禁止AD转换
ADIE=0;//A/D转换中断禁止
INT0_Flag = 0;
AD_Flag=0;
TXREG1=Channel_Choice;
SendPortD (slot_number_inform,Channel_Choice);
SendPortD (slot_number_inform,Channel_Choice);
// Att(Channel_Choice ,Att_value[Channel_Choice] );
//ADCON0= ADCON0&0xfe; // 禁止AD
// while (TX1IF== 0); //Only for test
//Only for test for 下行输chu
// while (TX1IF== 0); //Only for test
// while (TX1IF== 0); //Only for test
// TXREG1=Channel_Choice; //Only for test for 下行输chu
// while (TX1IF== 0); //Only for test
if (Channel_Choice==1) //上行,Ts1时隙
{
//Ts1_latch = ADResult12[5]; //记住上行,Ts1时隙的输入数据
Ts1_out_latch = ADResult12[6]; //记住上行,Ts1时隙的输出数据
//Gain_up = Ts1_out_latch /Ts1_latch; //更新上行增益
if(Ts1_out_latch < Ts1_threhold- below_threhold)
{
if(Att_value[1]>0)
Att_value[1]--; //第1时隙
//Att_total_up = Att_value[1]+ Att_manual_up;
//if(Att_total_up > 31)
// Att_total_up = 31;
// Att(1,Att_total_up); //衰减TS1
}
else if(Ts1_out_latch > Ts1_threhold+ over_threhold)
{
if(Att_value[1]<31)
Att_value[1]++; //第1时隙
//Att_total_up = Att_value[1]+ Att_manual_up;
//if(Att_total_up > 31)
// Att_total_up = 31;
// Att(1,Att_total_up); //衰减TS1
}
// while (TX1IF== 0); //Only for test
//TXREG1=Att_total_up; //Only for test for 下行输chu
// while (TX1IF== 0); //Only for test
}
if (Channel_Choice==2) //上行,Ts2时隙
{
//Ts2_latch = ADResult12[5]; //记住上行,Ts2时隙的输入数据
Ts2_out_latch = ADResult12[6]; //记住上行,Ts2时隙的输出数据
//Gain_up = Ts2_out_latch /Ts2_latch; //更新上行增益
if(Ts2_out_latch < Ts2_threhold- below_threhold)
{
if(Att_value[2]>0)
Att_value[2]--; //第2时隙
//Att_total_up = Att_value[2]+ Att_manual_up;
//if(Att_total_up > 31)
// Att_total_up = 31;
// Att(2,Att_total_up); //衰减TS2
}
else if(Ts2_out_latch > Ts2_threhold+ over_threhold)
{
if(Att_value[2]<31)
Att_value[2]++; //第2时隙
// Att_total_up = Att_value[2]+ Att_manual_up;
// if(Att_total_up > 31)
// Att_total_up = 31;
// Att(2,Att_total_up); //衰减TS2
}
// while (TX1IF== 0); //Only for test
//TXREG1=Att_total_up; //Only for test for 下行输chu
// while (TX1IF== 0); //Only for test
}
if (Channel_Choice==3) //上行,Ts3时隙
{
//Ts3_latch = ADResult12[5]; //记住上行,Ts3时隙的输入数据
Ts3_out_latch = ADResult12[6]; //记住上行,Ts3时隙的输出数据
//Gain_up = Ts3_out_latch /Ts3_latch; //更新上行增益
if(Ts3_out_latch < Ts3_threhold- below_threhold)
{
if(Att_value[3]>0)
Att_value[3]--; //第3时隙
//Att_total_up = Att_value[3]+ Att_manual_up;
//if(Att_total_up > 31)
// Att_total_up = 31;
//Att(3,Att_total_up); //衰减TS3
}
else if(Ts3_out_latch > Ts3_threhold+ over_threhold)
{
if(Att_value[3]<31)
Att_value[3]++; //第3时隙
//Att_total_up = Att_value[3]+ Att_manual_up;
//if(Att_total_up > 31)
// Att_total_up = 31;
//Att(3,Att_total_up); //衰减TS3
}
// while (TX1IF== 0); //Only for test
//TXREG1=Att_total_up; //Only for test for 下行输chu
// while (TX1IF== 0); //Only for test
}
if (Channel_Choice==4) //下行,Ts4时隙
{
// TXREG1=Att_value[4];
//Ts4_latch = ADResult12[7]; //记住下行,Ts4时隙的输入数据
Ts4_out_latch = ADResult12[8]; //记住下行,Ts4时隙的输出数据
Ts4_out_latch1 = Ts4_out_latch0;
Ts4_out_latch2 = Ts4_out_latch1;
Ts4_out_latch3 = Ts4_out_latch2;
//Ts4_out_latch = (Ts4_out_latch0+Ts4_out_latch1+Ts4_out_latch2+Ts4_out_latch3)>>2;
// Gain_dn = Ts4_out_latch /Ts4_latch; //更新下行增益
//Gain_dn = Ts4_out_latch /Ts4_latch; //更新下行增益
//SW_latch = Ts4_out_latch / ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入
if(Ts4_out_latch < Ts4_threhold- below_threhold)
{
if(Att_value[4]>0)
Att_value[4]--; //第4时隙
// Att_total_dn = Att_value[4]+ Att_manual_dn;
// if(Att_total_dn > 31)
// Att_total_dn = 31;
// Att(4,Att_total_dn); //衰减TS4
// Att(4,0); //衰减TS0
}
else if(Ts4_out_latch > Ts4_threhold+ over_threhold)
{
if(Att_value[4]<31)
Att_value[4]++; //第4时隙
// Att_total_dn = Att_value[4]+ Att_manual_dn;
// if(Att_total_dn > 31)
// Att_total_dn = 31;
// Att(4,Att_total_dn); //衰减TS4
//Att(4,31); //衰减TS0
}
//TXREG1=Att_value[4]; //Only for test for 下行输chu
//Att(4,Att_value[4]);
// Att(5,Att_value[5] );
}
if (Channel_Choice==5) //下行,Ts5时隙
{
if(Ts5_threhold- below_threhold > 0)
Ts5_low_threhold = Ts5_threhold- below_threhold;
else
Ts5_low_threhold = 0;
//Ts5_latch = ADResult12[7]; //记住下行,Ts5时隙的输入数据
Ts5_out_latch = ADResult12[8]; //记住下行,Ts5时隙的输出数据
Ts5_out_latch1 = Ts5_out_latch0;
Ts5_out_latch2 = Ts5_out_latch1;
Ts5_out_latch3 = Ts5_out_latch2;
//Ts5_out_latch = (Ts5_out_latch0+Ts5_out_latch1+Ts5_out_latch2+Ts5_out_latch3)>>2;
// Gain_dn = Ts5_out_latch /Ts5_latch; //更新下行增益
// SW_latch = Ts5_out_latch / ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入
if(Ts5_out_latch < Ts5_threhold- below_threhold)
{
if(Att_value[5]>0)
Att_value[5]--; //第5时隙
// Att_total_dn = Att_value[5]+ Att_manual_dn;
// if(Att_total_dn > 31)
// Att_total_dn = 31;
// Att(5,Att_total_dn); //衰减TS5
// Att(5,0); //衰减TS0
}
else if(Ts5_out_latch > Ts5_threhold+ over_threhold)
{
if(Att_value[5]<31)
Att_value[5]++; //第5时隙
//Att_total_dn = Att_value[5]+ Att_manual_dn;
//if(Att_total_dn > 31)
// Att_total_dn = 31;
//Att(5,Att_total_dn); //衰减TS5
//Att(5,31); //衰减TS0
}
//TXREG1=Att_value[5];
//Att(5,Att_value[5] );
//Att(6,Att_value[6] );
}
if (Channel_Choice==6) //下行,Ts6时隙
{
// Ts6_latch = ADResult12[7]; //记住下行,Ts6时隙的输入数据
Ts6_out_latch = ADResult12[8]; //记住下行,Ts6时隙的输出数据
Ts6_out_latch1 = Ts6_out_latch0;
Ts6_out_latch2 = Ts6_out_latch1;
Ts6_out_latch3 = Ts6_out_latch2;
//Ts6_out_latch = (Ts6_out_latch0+Ts6_out_latch1+Ts6_out_latch2+Ts6_out_latch3)>>2;
// Gain_dn = Ts6_out_latch /Ts6_latch; //更新下行增益
// SW_latch = Ts6_out_latch / ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入
if(Ts6_out_latch < Ts6_threhold- below_threhold)
{
if(Att_value[6]>0)
Att_value[6]--; //第6时隙
// Att_total_dn = Att_value[6]+ Att_manual_dn;
// if(Att_total_dn > 31)
// Att_total_dn = 31;
// Att(6,Att_total_dn); //衰减TS6
// Att(6,0); //衰减TS0
}
else if(Ts6_out_latch > Ts6_threhold + over_threhold)
{
if(Att_value[6]<31)
Att_value[6]++; //第6时隙
// Att_total_dn = Att_value[6]+ Att_manual_dn;
// if(Att_total_dn > 31)
// Att_total_dn = 31;
// Att(6,Att_total_dn); //衰减TS6
// Att(6,31); //衰减TS0
}
//TXREG1=Att_value[6];
//Att(6,Att_value[6] );
// Att(0,Att_value[0] );
}
if (Channel_Choice==0) //下行,Ts0时隙
{
//TXREG1=Att_value[0];
//dacdelay(delay_value);
//Ts0_latch = ADResult12[7]; //记住下行,Ts0时隙的输入数据
Ts0_out_latch = ADResult12[8]; //记住下行,Ts0时隙的输出数据
Ts0_out_latch1 = Ts0_out_latch0;
Ts0_out_latch2 = Ts0_out_latch1;
Ts0_out_latch3 = Ts0_out_latch2;
//Ts0_out_latch = (Ts0_out_latch0+Ts0_out_latch1+Ts0_out_latch2+Ts0_out_latch3)>>2;
// Gain_dn = Ts0_out_latch /Ts0_latch; //更新下行增益
//Gain_dn = Ts0_out_latch - Ts0_latch; //更新下行增益
// SW_latch = Ts0_out_latch - ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入
if(Ts0_out_latch < Ts0_threhold- below_threhold)
{
if(Att_value[0]>0)
Att_value[0]--; //第0时隙
//Att_total_dn = Att_value[0]+ Att_manual_dn;
//if(Att_total_dn > 31)
// Att_total_dn = 31;
//Att(0,Att_total_dn); //衰减TS0
// Att(0,0); //衰减TS0
}
else if(Ts0_out_latch > Ts0_threhold + over_threhold)
{
if(Att_value[0]<31)
Att_value[0]++; //第0时隙
//Att_total_dn = Att_value[0]+ Att_manual_dn;
//if(Att_total_dn > 31)
// Att_total_dn = 31;
//Att(0,Att_total_dn); //衰减TS0
// Att(0,31); //衰减TS0
}
//while (TX1IF== 0); //Only for test
// TXREG1=Att_value[0]; //Only for test for 下行输chu
//TXREG1=Ts0_out_latch;
// while (TX1IF== 0); //Only for test
// while (TX1IF== 0); //Only for test
//Att(0,Att_value[0] );
}
//INT0_Flag = 0;
ADCON0=ADCON0|0x02;//启动AD转换
ADIE=1;//A/D转换中断允许
} //if(INT0_Flag==1)
// if (ADResult12[5]>)//反射功率,上行输入功率
//if (ADResult12[6]>)//上行输出功率
// if ((ADResult12[7]> Open_threhold_dn))//下行输入超过门限
// if (ADResult12[8]>)//下行输出功率应该超过一定值,否则减小衰减
////待写////if (ADResult12[9]>)//末级温度
////待写////if (ADResult12[10]>)//环境温度
////待写////if (ADResult12[11]>)//电源电压
}
/******************************************************************
** 函 数 名: uart_initial(void)
** 功能描述: 232串行通讯初始化子程序,设置低优先级中断接收,使能232收和发
******************************************************************/
void uart_initial(void)
{
TXSTA1=0x04; //选择异步高速方式传输8位数据 BRGH=1
RCSTA1=0x80; //允许串行口工作使能SOEN=1,CREN=1
TRISC=TRISC|0X80; //PIC18F6722:将RC7(RX)设置为输入方式
TRISC=TRISC&0Xbf; //RC6(TX)设置为输出
SPBRG1=0x47; //11.0592M晶振时波特率为9600,Baundrate=11059200/[16(X+1)]
RC1IE=1; //使能接收中断
IPEN=1; //使能中断优先级
INTCON=INTCON|0xc0; //GIE|PEIE;//开全局中断,开外围模块中断
PIR1=0x00; //清中断标志
PIE1=PIE1|0x20; //允许串行通讯接口接收中断使能
// RC1IP=0; //设置SCI接收中断为低优先级中断
RC1IP=1; //设置SCI接收中断为高优先级中断
CREN1=1; //允许串口接收数据
TXEN1=1; //允许串口发送数据
}
/******************************************************************
** 函 数 名: uart_send(void)
** 功能描述: RS232中断发送子程序
******************************************************************/
/*void uart_send(void)
{
while (TXIF==0); //TXIF=0表示发送缓冲区不为空
TXREG=
}*/
/******************************************************************
** 函 数 名: dacdelay(unsigned char x)
** 功能描述: 延时函数
******************************************************************/
void dacdelay(unsigned int x)
{
unsigned int i;
for(i=0;i>1;//发送通道地址的高位
dacck();
/*if (channel==1||channel==3)
{
dacdata=1;
}
else
{
dacdata=0;
}*/
dacdata=channel&0x01;//发送通道地址的低位
dacck();
dacdata=rng;
dacck();
for (i=0; i<8; i++)
{
if (ch&0x80)
dacdata=1;
else
dacdata=0;
ch=ch<<1;
dacck();
}
dacload=0;
dacdelay(2);
dacload=1;
dacdelay(2);
}
/******************************************************************
** 函 数 名: INT0_initial(void)
** 功能描述: 外部中断0初始化函数
******************************************************************/
void INT0_initial(void)
{ //外部中断0总是处于高优先级
INT0IE=1; //使能外部INT0中断
INT0IF=0; //清中断标志
INTEDG0=1;//外部中断设为上升沿中断
}
//**********************************************************************************
void data_converter(unsigned char *p,unsigned int value) //数据变换
{
unsigned int m,n,j=0;
p[0]=number_table[value/1000];
m=value%1000;
p[1]=number_table[m/100];
n=m%100;
p[2]=number_table[n/10];
j=n%10;
p[3]=number_table[j/1];
}
//**********************************************************************************
//串行口发送数组
void send_data(unsigned char *p)
{unsigned int n;
for(n=0;n<4;n++)//p[n]!=0xff;n++)
{
while (TX1IF== 0); // TXIF=0表示发送缓冲区不为空
TXREG1 = p[n];
}
while (TX1IF== 0); // TXIF=0表示发送缓冲区不为空
TXREG1=' ';
}
void send_adc12_data(void)
{
data_converter(display_buffer,ADResult); //数据变换
send_data(display_buffer); //发送数据
}
void Calculate(void)
{
//eeprom_write(0,1);
//eeprom_read(0);
}
//////////////////////衰减函数///////
void Att(unsigned char channel, unsigned char data)
{
if (channel==1||channel==2||channel==3)//上行
{
SendPortD (control_att_up,data);
}
else if (channel==0||channel==4||channel==5||channel==6)//下行
{
SendPortD (control_att_dn,data);
}
}
void SendPortD(unsigned char control_choice,unsigned char data) //FPGA与CPU之间的一般数据传递
{
PORTD=control_choice|(data<<3);
}
///////////////串口接收处理///////////////
void uart_rec_process (void)// 模拟发送设置数据包0x7E,0x03,0xff, 0x01, 0x04,0x44,0x00,Forward_dn,0x7E
{ // 模拟发送查询数据包0x7E,0x02,0xff, 0x01, 0x04,0x44,0x00,Forward_dn,0x7E
unsigned int n;
if(RC_flag ==1) //串口接收中断处理结束
{
RC_flag = 0;
if(package_data_count == 0)
{
if(uart_rec_data[0]==0x7E) //开始数据包
{
package_data_count = 1;
uart_send_data[8] = uart_rec_data[0];
}
else
{
package_data_count = 0;
uart_send_data[8] =0;
}
}
else if(package_data_count == 1)
{
if(uart_rec_data[0]==0x02) //即出现1xxxxxxx,对本系统的读操作,即查询
{
r_w = 1; //对本系统读标志
uart_send_data[7] =uart_rec_data[0];
package_data_count ++;
}
else if (uart_rec_data[0]==0x03) //设置
{
r_w = 0; //对本系统写标志
uart_send_data[7] =uart_rec_data[0];
package_data_count ++;
}
else
{
package_data_count = 0;
uart_send_data[7]=0;
r_w = 0xff;
}
}
else if(package_data_count == 2)
{
if((uart_rec_data[0]==0xFF)&&(r_w==0))
{
//uart_send_data[6] =0;
package_data_count ++;
}
else if((uart_rec_data[0]==0xFF)&&(r_w==1)) //上位机读取时也是FF
{
//uart_send_data[6] =0;
package_data_count ++;
}
else
{
package_data_count = 0;
uart_send_data[6] =0xaa;
}
}
else if(package_data_count == 3)
{
data_width = uart_rec_data[0];
uart_send_data[5] =uart_rec_data[0]; //记住数据字节数
if(data_width > 2)
{
uart_send_data[6] =0xaa; //操作字节数超支
data_width = 0;
}
package_data_count ++;
}
else if((package_data_count == 4)||(package_data_count == 5))
{
package_data_count++;
uart_send_data[9-package_data_count]= uart_rec_data[0];
}
/*////////////////////////////----------------((package_data_count == 6) ||(package_data_count == 7))开始-----------------///////////////////////////////////*/
else if((package_data_count == 6) ||(package_data_count == 7))
{
package_data_count++;
/*////////////////////////////----------------读开始-----------------///////////////////////////////////*/
if(r_w==1) //读
{
////////////这里是Forward_dn开始///////////////////
if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x44))
{
uart_send_data[2]= 0;
uart_send_data[1]= Forward_dn; //只有一个字节的高位为全0
address_right= 1;
}
//////////////////////这里是Forward_dn截止////////////////
////////////这里是Backward_dn开始///////////////////
else if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x45))
{
uart_send_data[2]= 0;
uart_send_data[1]= Backward_dn; //只有一个字节的高位为全0
address_right= 1;
}
//////////////////////这里是Backward_dn截止////////////////
////////////这里是控制上下行通道关闭开始///////////////////
else if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x46))
{
uart_send_data[2]= 0;
uart_send_data[1]= switch_in_shut; //只有一个字节的高位为全0
address_right= 1;
}
//////////////////////这里是控制上下行通道关闭截止////////////////
else
{
address_right= 0; //读取数据地址错误
}
}//(r_w==1) //读
/*////////////////////////////----------------读结束-----------------///////////////////////////////////*/
/*////////////////////////////----------------写开始-----------------///////////////////////////////////*/
else if(r_w==0) //写
{
uart_send_data[9-package_data_count]=uart_rec_data[0]; //只有一个字节的高位为全0
setup_data[8-package_data_count]=uart_rec_data[0];
////////////这里是Forward_dn开始///////////////////
if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x44))
{
if(package_data_count == 7)
eeprom_write(0x19,0); //写入E2PROM
else if(package_data_count==8)
{
eeprom_write(0x19,uart_rec_data[0]); //写入E2PROM
Forward_dn= eeprom_read(0x19);
if(Forward_dn == uart_rec_data[0])
{
uart_send_data[6] =0;
SendPortD (control_bias,Forward_dn);
}
else
{
uart_send_data[6] =0xaa;
}
}
address_right= 1;
}
//////////////////////这里是Forward_dn截止////////////////
////////////这里是Backward_dn开始///////////////////
else if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x45))
{
if(package_data_count == 7)
eeprom_write(0x20,0); //写入E2PROM
else if(package_data_count==8)
{
eeprom_write(0x20,uart_rec_data[0]); //写入E2PROM
Forward_dn= eeprom_read(0x20);
if(Forward_dn == uart_rec_data[0])
{
uart_send_data[6] =0;
SendPortD (control_backward_bias,Backward_dn);
}
else
{
uart_send_data[6] =0xaa;
}
}
address_right= 1;
}
//////////////////////这里是Backward_dn截止////////////////
////////////这里是控制上下行通道关闭开始///////////////////
else if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x46))
{
if(package_data_count == 7)
eeprom_write(0x21,0); //写入E2PROM
else if(package_data_count==8)
{
eeprom_write(0x20,uart_rec_data[0]); //写入E2PROM
switch_in_shut= eeprom_read(0x21);
if((switch_in_shut == uart_rec_data[0])&&((switch_in_shut == 0x00)||(switch_in_shut == 0xff)))
{
uart_send_data[6] =0;
SendPortD (control_no_detect,switch_in_shut);
}
else
{
uart_send_data[6] =0xaa;
}
}
address_right= 1;
}
//////////////////////这里是控制上下行通道关闭截止////////////////
else
{
address_right = 0; //写入数据地址错误
}
} //(r_w==0) //写
/*////////////////////////////----------------写结束-----------------///////////////////////////////////*/
} //(package_data_count == 6) ||(package_data_count == 7)
/*////////////////////////////----------------((package_data_count == 6) ||(package_data_count == 7))结束-----------------///////////////////////////////////*/
else if(package_data_count == 8)
{
if(uart_rec_data[0]==0x7E) //结束数据包
{
uart_send_data[0] = 0x7E;
}
else
{
uart_send_data[6] =0xaa;
uart_send_data[0] = 0x7E;
}
for(n=0;n<9;n++)//p[n]!=0xff;n++)
{
while (TX1IF== 0); // TXIF=0表示发送缓冲区不为空
TXREG1 = uart_send_data[8-n];
}
while (TX1IF== 0); // TXIF=0表示发送缓冲区不为空
package_data_count = 0;
}
while (TX1IF== 0); //Only for test
TXREG1=package_data_count; //Only for test
while (TX1IF== 0); //Only for test
} // if(RC1IF==0)
}
/******************************需要设置的参量**********************************************/
//同步开关前沿量(前沿提前量) Forward_dn,读写整数(1)
//同步开关后沿量 (后沿延时量)Backward_dn,读写整数(1)
//下行输出过功率门限(启控电平 下行输出) Ts0_threhold,Ts4_threhold,Ts5_threhold,Ts6_threhold,读写有符号整数(2)
//上行输出过功率门限 (启控电平 上行输出)Ts1_threhold,Ts2_threhold,Ts3_threhold,读写有符号整数(2)
//
//上行人为衰减(上行衰减)Att_manual_up,读写整数(1)
//下行人为衰减(下行衰减)Att_manual_dn,读写整数(1)
//
//启动门限量 Open_threhold_dn,浮点数 ,读写(单位伏特)
//
//末级功放偏压 A1,A2,B1,B2, 写(滑条)浮点数
//
//末级功放偏压显示 A1_latch,A2_latch,B1_latch,B2_latch, 读(数据框)浮点数
//下行输入功率电平:Ts0_latch, Ts4_latch,Ts5_latch,Ts6_latch,只读有符号整数(2)
//下行输出功率电平:Ts0_out_latch, Ts4_out_latch,Ts5_out_latch,Ts6_out_latch,只读有符号整数(2)
//上行输入功率电平:Ts1_latch, Ts2_latch,Ts3_latch,只读有符号整数(2)
//上行输出功率电平:Ts1_out_latch, Ts2_out_latch,Ts3_out_latch,只读有符号整数(2)
//
//下行实际增益 Gain_dn,只读浮点数
//下行驻波比值 SW_latch,只读浮点数
//
//电源电压 只读浮点数 (单位伏特)
//环境温度 只读浮点数
//末级温度 只读浮点数
/****************************************************************************/