📄 pmmain.c
字号:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.2c Standard
Project :
Version :
Date : 2005-4-16
Author : JerryYoung
Company :
Comments:
Chip type : ATmega128
Program type : Application
Clock frequency : 12.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
#include "PMmain.h"
#include "button.h"
#include "usart.h"
#include "MAX1282.h"
#include "DAC.h"
#include "LED.h"
#include "protocal.h"
unsigned int BAUD=9600; //9600//波特率采用38400bps
//UBRR0 设置参数,double speed
unsigned int BAUD_SETTING;//=(unsigned int)((unsigned long)CRYSTAL/(8*(unsigned long)BAUD)-1);
extern ACK *pACK;
extern STATE *pSTATE;
extern DATA *pDATA;
extern char dashPos;
//------------------------------------------
flash unsigned char MAX1282_CHANNEL[4]={0X01,0X05,0X02,0X06};//CHANNEL0~3
char startupString[]={"Welcome to use YAMEI PowerMeter 2422\n\r"};
BOOL flag_10ms=FALSE,flag_1s=FALSE,startZero=FALSE;
unsigned char Mode=ZERO;
unsigned char Range=RANGE5;
unsigned int atten=10000;// 1, 10, 100, 1000, 10000
unsigned int queue[MAX_MID_FILTER];//队列用于 中值滤波
unsigned int queue2[MAX_MID_FILTER2];//队列用于 中值滤波
unsigned int gZeroRef;
void main(void)
{
unsigned char i=0;
unsigned char point_pos=2;//小数点位置从右到左1,2,3,4,
//0表示不显示小数点
unsigned char K;
unsigned int power_value,ndBmPower_value;
float fdBmPower_value=0.0,last_fPower_value,last_fdBmPower_value;
BOOL dBmIsNeg=FALSE,start_remote=FALSE;
unsigned int temp;
unsigned char smallCnt=0;
//usart
unsigned char command;
#asm("cli");
Port_Init();
Init_Unused();
BAUD_SETTING=(unsigned int)((unsigned long)CRYSTAL/(8*(unsigned long)BAUD)-1);
Usart_Init(BAUD_SETTING);//setting baudrate
SPIInit(); //for max1282
Button_Init();
LED_Init();
DacInit();
#asm("sei");
//#if USART_ON==1
Usart_printf(startupString,sizeof(startupString));
//#endif
LED_dispNumber(2422,0);
delay_ms(1000);
SetAtten(atten);
Light_LED(BULB_ZEROING);
LED_dispDash();
startZero=TRUE;
AutoZero2();
startZero=FALSE;
LED_dispAllDash();
//Light_LED(0) ;
delay_ms(20);
i=0;
while(TRUE)
{
//if(flag_10ms==TRUE)
{
{
//调整atten和range
// atten= 10000, 1000, 100, 10, 1
//对应RANGE=RANGE5, RANGE4, RANGE3, RANGE2, RANGE1
//如果采用方案二增加下面代码////////////
//Range=RANGE5;/////////////////////////////////////////
//atten=10000;///////////////////////////////////////////
//SetAtten(atten);////////////////////////////////////////
/////////////////////////////////////////////////////
if(flag_1s==TRUE)
{
flag_1s=FALSE;
ZeroEnable();
//startZero=TRUE;
//#asm("sei");
//Light_LED(BULB_ZEROING);
//AutoZero3();
//Mode=WATT;
//startZero=FALSE;
//LED_dispAllDash();
delay_ms(1);//时间可以改小点
ZeroDisable();
}
for(i=0;i<MAX_MID_FILTER;i++)
{
power_value=Filter();//0~1000
power_value=FilterMid(power_value);
}
//temp=FilterAver();
while(power_value<MIN_RANGE)
{
if(atten>=10)
{
Range--;
atten=atten/10;
SetAtten(atten);
// WaitKey();///test
}
else
{
break;
}
//delay_ms(10);
for(i=0;i<MAX_MID_FILTER;i++)
{
power_value=Filter();//0~1000
power_value=FilterMid(power_value);
}
}
// while(temp>MAX_RANGE)
while((PINB.6==1)||(PINB.6==1)||(power_value>MAX_RANGE))
{
if(atten<=1000)
{
Range++;
atten=atten*10;
SetAtten(atten);
// WaitKey();///test
}
else
{
break;
}
for(i=0;i<MAX_MID_FILTER;i++)
{
power_value=Filter();//0~1000
power_value=FilterMid(power_value);
}
}
if(power_value<=90) power_value=0;
switch(Range)
{
case RANGE1://3//3uw~10uw
power_value=Filter3(power_value);
//if(power_value<220) ((unsigned long) power_value*(MAX_RANGE-10))/MAX_RANGE;
if(power_value>220&&power_value<400)
power_value=(long int)((long int)power_value*316)/348;
else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1065;
break;
case RANGE2:
if(power_value>200&&power_value<400)
power_value=(long int)((long int)power_value*316)/328;
else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1065;
break;
case RANGE3:
if(power_value>200&&power_value<400)
power_value=(long int)((long int)power_value*316)/322;
else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1062;
break;
case RANGE4:
if(power_value>200&&power_value<400)
power_value=(long int)((long int)power_value*316)/322;
else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1058;
break;
case RANGE5:
if(power_value>200&&power_value<400)
power_value=(long int)((long int)power_value*316)/335;
else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1136;
if(power_value>1100) Light_LED(BULB_OVERRANGE);
break;
default:break;
}
/////ctrl pin8,9,10
if(Range==RANGE1) CTR1();
else if(Range==RANGE2) CTR2();
else if(Range==RANGE3||Range==RANGE4||Range==RANGE5) CTR345();
//++++++++++++以下负责显示+++++++++++++++++++//
if(Mode==ZERO)
{
ZeroEnable();
startZero=TRUE;
//#asm("sei");
Light_LED(BULB_ZEROING);
AutoZero2();
Mode=WATT;
startZero=FALSE;
LED_dispAllDash();
ZeroDisable();
}
else if(Mode==WATT)
{
if(Range==RANGE1) {point_pos=3;}
else if(Range==RANGE4) {point_pos=3;}
else if(Range==RANGE2||Range==RANGE5) point_pos=2;
else if(Range==RANGE3) point_pos=4;
LED_dispNumber(power_value,point_pos);
if(Range==RANGE1||Range==RANGE2) //uW
Light_LED(BULB_uW);
else Light_LED(BULB_mW);
//////////
}
else if(Mode==dBm)
{
//fmwPower_value=(float)power_value/10.0;
if(power_value==0)
{
LED_dispNumber(11000,0);
continue;
}
else fdBmPower_value=10*log10((float)power_value);
switch(Range)
{
case RANGE1: //负dBm
fdBmPower_value-=50;//-20-30
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(10*fdBmPower_value);
point_pos=2;
break;
case RANGE2: //负dBm
fdBmPower_value-=40;//-10-30
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(10*fdBmPower_value);
point_pos=2;
break;
case RANGE3:
fdBmPower_value-=30;//
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
break;
case RANGE4:
fdBmPower_value-=20;//
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
break;
case RANGE5:
fdBmPower_value-=10;//
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
break;
default:break;
}
if(dBmIsNeg==TRUE)
{
LED_dispNumber(ndBmPower_value+10000,point_pos);//10000为显示-
}
else {
LED_dispNumber(ndBmPower_value,point_pos);
}
Light_LED(BULB_dBm);
}
else if(Mode==dBREF)
{
//fmwPower_value=(float)power_value/10.0;
if(power_value==0)
{
LED_dispNumber(11000,0);
continue;
}
else
{
fdBmPower_value=10*log10((float)power_value);
}
fdBmPower_value-=last_fdBmPower_value;
/*
//=============
switch(Range)
{
case RANGE1:
fdBmPower_value-=50;//dBm
break;
case RANGE2:
fdBmPower_value-=40;
break;
case RANGE3:
fdBmPower_value-=30;
break;
case RANGE4:
fdBmPower_value-=20;
case RANGE5:
fdBmPower_value-=10;
break;
default:break;
}
if(fdBmPower_value<=-10.00)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
ndBmPower_value=(unsigned int)(10*fdBmPower_value);
point_pos=2;
}
else if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
ndBmPower_value=(unsigned long)(100*fdBmPower_value);
point_pos=3;
}
else if((fdBmPower_value<50)&&(fdBmPower_value>=0))
{
dBmIsNeg=FALSE;
ndBmPower_value=(unsigned long)(100*fdBmPower_value);
point_pos=3;
}
//============
*/
switch(Range)
{
case RANGE1: //负dBm
fdBmPower_value-=50;//-20-30
//得到要显示的值
if(fdBmPower_value<-9.9999)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
ndBmPower_value=(unsigned int)(10*fdBmPower_value);
point_pos=2;
}
else if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
}
else {
dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
}
break;
case RANGE2: //负dBm
fdBmPower_value-=40;//-10-30
//得到要显示的值
if(fdBmPower_value<-9.99999)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
ndBmPower_value=(unsigned int)(10*fdBmPower_value);
point_pos=2;
}
else if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
}
else if(fdBmPower_value>=0)
{
dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
}
break;
case RANGE3:
fdBmPower_value-=30;//
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
break;
case RANGE4:
fdBmPower_value-=20;//
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
break;
case RANGE5:
fdBmPower_value-=10;//
//得到要显示的值
if(fdBmPower_value<0)
{
fdBmPower_value=(-1)*fdBmPower_value;
dBmIsNeg=TRUE;
}
else dBmIsNeg=FALSE;
ndBmPower_value=(unsigned int)(100*fdBmPower_value);
point_pos=3;
break;
default:break;
}
if(dBmIsNeg==TRUE)
{
LED_dispNumber(ndBmPower_value+10000,point_pos);//10000为显示-
}
else {
LED_dispNumber(ndBmPower_value,point_pos);
}
Light_LED(BULB_dBREF);
}
}
flag_10ms=FALSE;
}
K=getkey();
if(K!=KEY_NULL)
{
switch(K)
{
case KEY_ZERO:
Mode=ZERO;
break;
case KEY_WATT_dBm:
if(Mode==WATT) Mode=dBm;
else if(Mode==dBm) Mode =WATT;
else Mode=WATT;
break;
case KEY_dBREF:
last_fPower_value=(float)power_value;
last_fdBmPower_value=10*log10((float)power_value);
switch(Range)
{
case RANGE1:
last_fdBmPower_value-=50;//dBm
break;
case RANGE2:
last_fdBmPower_value-=40;
break;
case RANGE3:
last_fdBmPower_value-=30;
break;
case RANGE4:
last_fdBmPower_value-=20;
case RANGE5:
last_fdBmPower_value-=10;
break;
default:break;
}
Mode=dBREF;
break;
default:break;
}
}
//usart
if(start_remote==FALSE)
{
if(Usart_getchar()==HEADER_R)
{
start_remote=TRUE;
}
}
if(start_remote==TRUE)
{
command=Usart_getchar();
if(command==TAIL1||command==TAIL2) start_remote=FALSE;
else
{
switch(command&0XF0)
{
case CMD_REMOTE:
pACK->header=HEADER_L;
pACK->answer=CMD_REMOTE;
pACK->valid=VALID;
pACK->tail1=TAIL1;
pACK->tail2=TAIL2;
Usart_printf((unsigned char *) pACK, sizeof(ACK));
break;
case CMD_LOCAL:
pACK->header=HEADER_L;
pACK->answer=CMD_LOCAL;
pACK->valid=VALID;
pACK->tail1=TAIL1;
pACK->tail2=TAIL2;
Usart_printf((unsigned char *) pACK, sizeof(ACK));
break;
case CMD_SETBAUD:
#asm("cli");
if((command&0x0f)>0)
{
BAUD=(unsigned int)(command&0x0F)*2400;
BAUD_SETTING=(unsigned int)((unsigned long)CRYSTAL/(8*(unsigned long)BAUD)-1);
Usart_Init(BAUD_SETTING);
}
pACK->header=HEADER_L;
pACK->answer=CMD_SETBAUD;
pACK->valid=VALID;
pACK->tail1=TAIL1;
pACK->tail2=TAIL2;
Usart_printf((unsigned char *) pACK, sizeof(ACK));
#asm("sei");
break;
case CMD_ZERO:
Mode=ZERO;
pACK->header=HEADER_L;
pACK->answer=CMD_ZERO;
pACK->valid=VALID;
pACK->tail1=TAIL1;
pACK->tail2=TAIL2;
Usart_printf((unsigned char *) pACK, sizeof(ACK));
break;
case CMD_WATT_OR_DB:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -