?? g1.c
字號:
/*
* Copyright (c) 2005,
* All rights reserved.
*
* 文件名稱:GSM900.C
* 文件標(biāo)識:見配置管理計劃書
* 摘 要:選頻+功放模塊的監(jiān)控數(shù)據(jù)處理
*
* 當(dāng)前版本:1.1
*/
#include"g1.h"
void main()
{
delay_unit(10000);
init_mcu();
init_menu();
init_serial();
init_eeprom();
for( ; ; )
{
sign_collect();
serial_data();
if (chushi>=0x0d6b)//定時器1產(chǎn)生3435次中斷,每次終端時間為65.5*8=524ms,3435次中斷約為半個小時
{
init_sign_ctl();
chushi=0;
}
}
}
void init_mcu()
/********************************************************************
初始化項目:
1、WDT
2、ADC
3、SSP(只初始化端口方向,其他的在具體使用的時候初始化)
4、TMR1
5、USART
6、中斷資源
7、端口方向
********************************************************************/
{
TRISA = 0x3f; //initialize the direction of the ports
TRISB = 0x35;//RB3為DSALE1
TRISC = 0x81;
TRISD = 0xef;
TRISE = 0x07;
porta_wbuf = 0x00;
portb_wbuf = 0x00;
portc_wbuf = 0x00;
portd_wbuf = 0x00;//modify
porte_wbuf = 0x00;
// 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;
RCSTA = 0x90;
OPTION = 0x8f;
INTCON = 0xc0;
PIE1 = 0x21;
PIR1 = 0x00;
PIE2 = 0x00;
PIR2 = 0x00;
PCON = 0x03;
//定時器設(shè)置
TMR1L = 0x00; //initialize TMR1,65.5ms
TMR1H = 0x00;
T1CON = 0x31;//使能定時器工作,TMR1ON=1;8分頻65.5*8=524ms;
}
void init_menu()
{
dog_soft = 0;
dog();
// delay_Tad(300);
chushi=0;
Prmter1.ATT1 = rrom(att1add);
Prmter1.ATT2 = rrom(att2add);
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.VGS4_L = rrom(vgs4add);
Prmter1.VGS4_H = rrom(vgs4add+1);
Prmter1.PC1 = rrom(pc1add);
Prmter1.PC1U_L = rrom(pc1uadd);
Prmter1.PC1U_H = rrom(pc1uadd+1);
Prmter1.PC2 = rrom(pc2add);
Prmter1.PC2U_L = rrom(pc2uadd);
Prmter1.PC2U_H = rrom(pc2uadd+1);
Prmter1.FREQ1_L = rrom(freq1add);
Prmter1.FREQ1_H = rrom(freq1add+1);
FR1=Prmter1.FREQ1_H *256+Prmter1.FREQ1_L ;
Prmter1.FREQ3_L = rrom(freq3add);
Prmter1.FREQ3_H = rrom(freq3add+1);
FR3=Prmter1.FREQ3_H *256+Prmter1.FREQ3_L ;
Prmter1.BUTTON1= rrom(but1add);
Prmter1.BUTTON2= rrom(but2add);
Prmter1.POFFSET1=rrom(poff1add);
Prmter1.POFFSET2=rrom(poff2add);
Prmter1.POFFSET3=rrom(poff3add);
Prmter1.POFFSET4=rrom(poff4add);
// Prmter1.PROTL_ETN = 0x02;//協(xié)議版本
Prmter1.ADDR = rrom(mod_add_add);
tempcheck=0;
tran_flag=0x00;//轉(zhuǎn)義標(biāo)志,=0為沒有轉(zhuǎn)義,=1為轉(zhuǎn)義過了
headend_flag=0x00;
}
/**********************************************************
** 功能說明: 串口初始化函數(shù)
** 輸入?yún)?shù): 無
** 輸出參數(shù):
** 返 回 值: 無
** 引用函數(shù):
*********************************************************/
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 & 0xef;
PORTD = portd_wbuf;
}
/**********************************************************
** 功能說明: 初始化eeprom函數(shù)
** 輸入?yún)?shù):
** 輸出參數(shù):
** 返 回 值: 無
** 引用函數(shù):
***********************************************************/
void init_eeprom(void)
{
uint i;
uchar j;
TRISD1 = 0;
TRISC2 = 0;
err_eeprom=0;
dog();
j = rrom(0x07ff);
if(j!=0xab)
{
for(i=0;i<0x07ff;i++)
{
wrom(i,0x00);
dog();
}
wrom(0x07ff,0xab);
// wrom(mod_idadd,0x00);//寫入模塊ID號地址低字節(jié)
// wrom(mod_idadd+1,0xf0);//寫入模塊ID號地址高字節(jié)
//
// wrom(mod_add_add,0x02);//寫入模塊地址的地址低字節(jié)
// wrom(mod_add_add+1,0xf0);//寫入模塊地址的地址高字節(jié)
//
// wrom(product_add,0x19);//寫入生產(chǎn)序列號參數(shù)地址低字節(jié)
// wrom(product_add+1,0xf0);//寫入生產(chǎn)序列號參數(shù)地址高字節(jié)
}
}
void dog()
{
asm("CLRWDT");
OPTION = 0x8f;
}
void delay_unit(uint buf)
{
auto uint i;
for(i = 0;i < buf ;i++)
{
asm("nop");
}
}
void delay_Tad(uchar j)
{
auto uchar i;
for(i=0;i<j;i++)
{
asm("nop");
asm("nop");
asm("nop");
}
}
/**********************************************************
** 功能說明: 增益1、2控制初始化控制函數(shù)
** 輸入?yún)?shù): tempnumb 類型:uchar :溫度補償?shù)趲讉€參數(shù)
attnumb 類型:uchar :標(biāo)稱值補償?shù)趲讉€參數(shù)
fqnumb 類型:uchar :頻響補償?shù)趲讉€參數(shù)
fr 類型:uint :本振信道數(shù)值
attbuf 類型:uchar :衰減數(shù)值
** 輸出參數(shù):
** 返 回 值: 無
** 引用函數(shù):
*********************************************************/
void init_att(uchar tempnumb ,uchar attnumb,uchar fqnumb,uint fr,uchar attbuf)//
{
uchar buf;
Prmter1.GCUTPBC=TEMP(tempnumb);
Prmter1.GCUBC=ATTBU(attbuf,attnumb);
fr=fr>>1;
Prmter1.FQGCUBC=FREQBU(fr,fqnumb);
dog();
buf=attbuf+Prmter1.GCUTPBC+Prmter1.GCUBC+Prmter1.FQGCUBC;
if(buf>=0x80)//衰減<0.
{
buf=0;
}
if(buf>=63)//衰減不可以超過31.5DB.
{
buf=63;
}
if(tempnumb==1)
{
Prmter1.ACTATT1=buf;
ATT(buf,0x20);
}
else
{
Prmter1.ACTATT2=buf;
ATT(buf,0x02);
}
return;
}
/**********************************************************
** 功能說明: 輸出功率1、2和四個柵壓控制初始化控制函數(shù)
** 輸入?yún)?shù): CHANNEL 類型:uchar :AD5318轉(zhuǎn)換管道號
tempnumb 類型:uchar :溫度補償?shù)趲讉€參數(shù)
buf_H 類型:uchar :數(shù)值的高字節(jié)
buf_L 類型:uchar :數(shù)值的低字節(jié)
** 輸出參數(shù):
** 返 回 值: 無
** 引用函數(shù):
*********************************************************/
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-3;
Prmter1.ACTVPL[numb]=vbuf.buf2[0];
Prmter1.ACTVPH[numb]=vbuf.buf2[1];
DAC(channel,vbuf.buf2[1],vbuf.buf2[0]);
return;
}
/**********************************************************
** 功能說明: 模塊檢測函數(shù)
** 輸入?yún)?shù): 無
** 輸出參數(shù):
** 返 回 值: 無
** 引用函數(shù):
*********************************************************/
void sign_collect()
{
dog();
CHECK_TEMP();
CHECK_VTE28v();
CHECK_PWR1();//選頻電路I輸出功率檢測
CHECK_PWR2();//選頻電路II輸出功率檢測
CHECK_id1();//功放管I第一級電流檢測
CHECK_id2();//功放管II第一級電流檢測
CHECK_id3();//功放管I第二級電流檢測
CHECK_id4();//功放管II第二級電流檢測
CHECK_PLL1();//鎖相環(huán)1檢測
CHECK_PLL3();//鎖相環(huán)3檢測
}
/**********************************************************
** 功能說明: 模塊控制函數(shù)
** 輸入?yún)?shù): 無
** 輸出參數(shù):
** 返 回 值: 無
** 引用函數(shù):
*********************************************************/
void init_sign_ctl()
{
//DAC(0x0,0x02,0x64);
// TRISC0 = 0x00;//LO3LE
// set_pll(FR3,0,0x01,0x01);//最后一個數(shù)1代表選用PORTC端口
// TRISC0 = 0x01;
//
// TRISB5 = 0x00;//LO1LE
// set_pll(FR1,0,0x20,0x02);//最后一個數(shù)2代表選用PORTB端口
// TRISB5 = 0x01;
// ATT(Prmter1.ATT2, 0x02);
//
// ATT(Prmter1.ATT1, 0x20);
//
//
// if(Prmter1.BUTTON2==0)
// {
// DAC(0x03,0);//第一個管子第一級柵壓
// DAC(0x02,0);//第一個管子第二級柵壓
// }
// else
// {
// DAC(0x02,Prmter1.VGS4_L);
// DAC(0x03,Prmter1.VGS3_L);
//
// }
//
// if(Prmter1.BUTTON1==0)
// {
// DAC(0x05,0);//第二個管子第一級柵壓
// DAC(0x04,0);//第二個管子第二級柵壓
// }
// else
// {
// DAC(0x05,Prmter1.VGS1_L);
// DAC(0x04,Prmter1.VGS2_L);
//
// }
// DAC(0x06,Prmter1.PC1U);//選頻電路1最大輸出功率
//
// DAC(0x01,Prmter1.PC2U);//選頻電路2最大輸出功率
// init_att1();//
// init_att2();//
//delay_unit(1000);
TRISB5 = 0x00;//LO1LE
//init_freq1();//
//init_freq(9,0x20,0x02,FR1);
set_pll(FR1,0,0x20,0x02);//最后一個數(shù)2代表選用PORTB端口
TRISB5 = 0x01;//LO1LE
TRISC0 = 0x00;//LO3LE
//init_freq3();//
// init_freq(10,0x01,0x01,FR3);
set_pll(FR3,0,0x01,0x01);//最后一個數(shù)1代表選用PORTC端口
TRISC0 = 0x01;//LO3LE
//init_pcu1();//
// init_pcu2();//
init_vgsandpcu(6 ,7,Prmter1.PC1U_H,Prmter1.PC1U_L);
init_vgsandpcu(1 ,8,Prmter1.PC2U_H,Prmter1.PC2U_L);
// DAC(0x06,Prmter1.PC1U_H,Prmter1.PC1U_L);//選頻電路1最大輸出功率
// DAC(0x01,Prmter1.PC2U_H,Prmter1.PC2U_L);//選頻電路2最大輸出功率
if(Prmter1.BUTTON2==0)
{
DAC(0x03,0,0);//第一個管子第一級柵壓
DAC(0x02,0,0);//第一個管子第二級柵壓
}
else
{
// init_vgs3();//
// init_vgs4();//
init_vgsandpcu(3 ,5,Prmter1.VGS3_H,Prmter1.VGS3_L);
init_vgsandpcu(2 ,6,Prmter1.VGS4_H,Prmter1.VGS4_L);
}
if(Prmter1.BUTTON1==0)
{
DAC(0x05,0,0);//第二個管子第一級柵壓
DAC(0x04,0,0);//第二個管子第二級柵壓
}
else
{
// init_vgs1();//
// init_vgs2();//
init_vgsandpcu(5 ,3,Prmter1.VGS1_H,Prmter1.VGS1_L);
init_vgsandpcu(4 ,4,Prmter1.VGS2_H,Prmter1.VGS2_L);
}
init_att(1 ,1,1,FR1,Prmter1.ATT1);
// init_att(1 ,1,1,FR1,Prmter1.ATT1);
//dog();
init_att(2 ,2,2,FR3,Prmter1.ATT2);
}
/**********************************************************
** 功能說明: adc數(shù)據(jù)的采集輸出
** 輸入?yún)?shù): buf 類型:uchar :管道號
** 輸出參數(shù): adcbuf 類型:uchar :數(shù)字量
** 返 回 值: 無
** 引用函數(shù):
***********************************************************/
uchar adc_read(uchar buf)
{
uchar adcbuf;
ADCON1 = 0x00;
buf = buf & 0x07;
buf = buf << 3;
ADCON0 = buf | 0x41;
// delay_Tad(5);//16f877采用
delay_Tad(2);
ADGO = 0x01;
while(ADGO)
{
;
}
#if defined(_16F77)
adcbuf = ADRES;
#endif
#if defined(_16F877A)
adcbuf = ADRESH;
#endif
ADON = 0x00;
ADIF = 0x00;
return adcbuf;
}
/**********************************************************
** 功能說明: 增益實際值補償函數(shù)
** 輸入?yún)?shù): attin 類型:uchar :標(biāo)稱值
attnb 類型:uchar :=1,代表第1個增益,=2,代表第2個增益等
** 輸出參數(shù):
** 返 回 值: 無
** 引用函數(shù):
*********************************************************/
uchar ATTBU(uchar attin,uchar attnb)
{
uchar i;
uchar buf;
//buf=attin;//如果比較沒有結(jié)果,則返回標(biāo)稱值原值
buf=0;//如果比較沒有結(jié)果,則返回標(biāo)稱值原值
for (i=0;i<bcnumb;i++)
{
dog();
B[0]=rrom(bczcszd+zyn*i+attnb-1);//參數(shù)值首地址+偏置
if (attin==i)
{
//buf=B[0]+buf4;
buf=B[0];
break;
}
}
B[0]=0;
return buf;
}
/**********************************************************
** 功能說明: 頻響實際值補償函數(shù)(其實是增益補償)DB/2
關(guān)于頻率值計算,設(shè)信道號為X,頻點寬為100K,二分頻,則頻率值=信道0時頻率值+信道×0.025
** 輸入?yún)?shù): freqin 類型:uchar :信道值
freqnb 類型:uchar :代表第幾個本振器件。
** 輸出參數(shù):
** 返 回 值: 頻響補償實際值 buf,如果返回值為0,則為沒有補償值
** 引用函數(shù):
*********************************************************/
uchar FREQBU(uint freqin,uchar freqnb)
{
uchar i;
uchar buf;
uchar buff;
uchar buf1;
uchar buf2;
union buf_union Pbuf1;
union buf_union Pbuf2;
// uchar P[2];//EEPROM中信道值1byte
buf=0;//如果比較沒有結(jié)果,則返回0
for (i=0;i<fnumb;i++)//頻率
{
dog();
// P[0]=rrom(freqd+i);
Pbuf1.buf2[0]=rrom(freqd+i);
Pbuf1.buf2[1]=rrom(freqd+i+1);
i++;
if (i<(fnumb-1))
{
//P[1]=rrom(freqd+i+1);
Pbuf2.buf2[0]=rrom(freqd+i+1);
Pbuf2.buf2[1]=rrom(freqd+i+2);
}
else
{
Pbuf2.buf1=Pbuf1.buf1;
}
if (freqin==Pbuf1.buf1)
{
B[0]=rrom(freqcszd+pn*i+freqnb-1);
buf=B[0];
break;
}
else if((freqin>Pbuf1.buf1)&&(freqin<Pbuf2.buf1))
{
B[0]=rrom(freqcszd+pn*i+freqnb-1);
B[1]=rrom(freqcszd+pn*(i+1)+freqnb-1);
buff=B[1]-B[0];
buf2=Pbuf2.buf1-Pbuf1.buf1;
buf1=freqin-Pbuf1.buf1;
if(buff<0x80)
{
buf1=(B[1]-B[0])*buf1;
}
else if(buff>=0x80)
{
buf1=(B[0]-B[1])*buf1;
}
buf1=buf1/buf2;
//B[2]=B[0]+(((B[1]-B[0])*(freqin-P[0]))/(P[1]-P[0]));
B[2]=B[0]+buf1;
buf=B[2];
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -