📄 init.c
字号:
#include "Init.h"
#include "yx_key.h"
//对定时器进行操作
void TimerInit()
{
unsigned char i;
///////////////////////////////
// P2DIR &= ~BIT6;
//////////////////////////////
FLL_CTL1 = XT2OFF ;
FLL_CTL0 |= XTS_FLL;
clr_watchdog();
FLL_CTL1 |= SELS + SELM_XT2 ; //选择高频晶振
//==========对TIMER A中断设置========================
TACTL |= TASSEL1 + TACLR + ID1 + ID0; //使用SMCLK时钟,八分频,清除TAR值
TACTL |= MC0; //增计数模式
CCR0 = 625; //定时秒,625uS
//.......................................
TBCTL |= TBSSEL1 + TBCLR+ ID1 + ID0;
TBCTL |= MC0;
TBCCR0 = 1000;
TBCCTL0 |= CCIE;
//==========对基础时钟设置============================
BTCTL = BTDIV + BTIP1; // 62.5ms interrupt
IE2 |= BTIE; // Enable BT interrupt
}
void clr_Syswtdog()
{
WDTCTL = WDTPW + WDTCNTCL + WDTSSEL; //1000ms
}
//设置 串口1 速率
void SetCOM0BT( int bt)
{
UTCTL1 |= SSEL0 + SSEL1; // UCLK = SMCLK
UCTL1 &= ~SWRST; // SWRST复位,USART允许
switch (bt)
{
case 300: UBR11=UBR10_300; UBR01=UBR00_300;
UMCTL1=UMCTL0_300; break;
case 600: UBR11=UBR10_600; UBR01=UBR00_600;
UMCTL1=UMCTL0_600; break;
case 1200: UBR11=UBR10_1200; UBR01=UBR00_1200;
UMCTL1=UMCTL0_1200; break;
case 2400: UBR11=UBR10_2400; UBR01=UBR00_2400;
UMCTL1=UMCTL0_2400; break;
case 4800: UBR11=UBR10_4800; UBR01=UBR00_4800;
UMCTL1=UMCTL0_4800; break;
case 9600: UBR11=UBR10_9600; UBR01=UBR00_9600;
UMCTL1=UMCTL0_9600; break;
}
WP_OUT ;
WP_Enable ; //1024写保护
ME2 |= URXE1 + UTXE1; // Enable USART1 TXD/RXD
IE2 |= URXIE1; // Enable USART11 RX interrupt
UCTL1 |= CHAR + PENA + PEV; // 8-bit character
P2SEL |= BIT4 + BIT5 ; //P2.4,P2.5 = USART0 TXD/RXD
P2DIR |= BIT4; //P2.4为输出
//串口0初始化
UTCTL0 |= SSEL0 + SSEL1; // UCLK = SMCLK
UCTL0 =~SWRST; // SWRST复位,USART允许
//UCTL0 &= ~SWRST; // SWRST复位,USART允许
UBR10=UBR11;UBR00=UBR01;UMCTL0=UMCTL1;
ME1 |= URXE0 + UTXE0; // Enable USART1 TXD/RXD
IE1 |= URXIE0;
UCTL0=UCTL1;
P4SEL |= BIT0 + BIT1 ; //P4.0,P4.1 = USART1 TXD/RXD
P4DIR |= BIT0;
LinkState=0x0E;
}
void SetCOM1BT( int bt)
{
P4SEL |= BIT0 + BIT1 ; //P4.0,P4.1 = USART1 TXD/RXD
P4DIR |= BIT0;
}
void ADCInit()
{
//===============ADC12设置(序列通道A0->A9多次转换)
P6SEL = 0XFF; //所有P6口线均为ADC模块
ADC12CTL0 &=~ENC; //在改变设置前首地址为ADC12MEM0 停止A/D转换
ADC12CTL0 = ADC12ON +MSC+SHT0_2 + SHT1_7; //开A/D,无转换溢出中断,无溢出中断,允许多次采样
ADC12CTL1 = CONSEQ_3 + SHP + ADC12SSEL_3; //序列通道重复,采样定时输出为采样信号(SAMPSON)
//转换存储寄存器
ADC12IE = BIT6;
ADC12MCTL0 = 0x20; //参考电压分别为AVCC,AVSS
ADC12MCTL1 = 0x21;
ADC12MCTL2 = 0x24;
ADC12MCTL3 = 0x22;
ADC12MCTL4 = 0x25;
ADC12MCTL5 = 0x23;
ADC12MCTL6 = 0x26;
ADC12MCTL7 = 0x27;
ADC12MCTL8 = 0xaa;
// ADC12CTL0 |= ENC; //允许转换开始
}
//对Port口进行设置
void Port1Init()
{
P1IE |= BIT0;
P1IES |= BIT0;
P1DIR &= ~0x1F; //除了P1.5,P1.6,P1.7其他口都不变
P1DIR |= 0xE0; //用于改变测量电流的量程
P1OUT &= ~(BIT5 + BIT6 + BIT7);
}
void Port2Init(void)
{
P2DIR &= ~BIT0; //输入
P2DIR |= BIT7; //输出
P2DIR |= BIT1 + BIT3 ;
P3DIR &= ~BIT3; //输入
P3DIR &= ~(BIT4 +BIT5) ; //输出
keyold= (P3IN & KEYBIT);
CS485OUT ;
CS485ReceiveEnable ; //485接收使能
}
void SetP1Trig(void)
{
if((P1IN&BIT1)!=0) //为高电平,则设为下降沿触发
P1IES|=BIT1;
else //低电平,设为上升沿触发
P1IES&=~BIT1;
if((P1IN&BIT2)!=0)
P1IES|=BIT2;
else
P1IES&=~BIT2;
if((P1IN&BIT3)!=0)
P1IES|=BIT3;
else
P1IES&=~BIT3;
if((P1IN&BIT4)!=0)
P1IES|=BIT4;
else
P1IES&=~BIT4;
}
//运行参数设置
void SetRunParam(void)
{
BYTE chrk,p0ok,p505ok,chk;
long t;
ReadParam(0);
Read1024(0,CHECK_PARAM,&chrk,1);
chk=GetCheckParam();
if(chk==chrk)
p0ok=1;
else p0ok=0;
ReadParam(505);
Read1024(505,CHECK_PARAM,&chrk,1);
chk=GetCheckParam();
if(chk==chrk)
p505ok=1;
else p505ok=0;
if(p0ok &&(!p505ok))
{
ReadParam(0);
CopyParam(505);
chk=GetCheckParam();
Write1024(505,CHECK_PARAM, &chk,1,TRUE);
}
if((!p0ok) &&p505ok)
{
ReadParam(505);
CopyParam(0);
chk=GetCheckParam();
Write1024(0,CHECK_PARAM, &chk,1,TRUE);
}
if((!p0ok) &&(!p505ok))
{; }
CheckData(0);
CheckData(1);
CheckData(2);
/*
t=Read1024(0,PUHIGHV,(BYTE*)&(TTU_RunParam.UHighV),6); ////UHighV;Load0; YKSelectTim
if(!t)
{ MCUState |= BIT1;
TTU_RunParam.AddrOfTTU=1; //默认参数设置
TTU_RunParam.Bauds0=4;
SetCOM0BT(2400);
return;
}
MCUState &= ~BIT1;
*/
if(TTU_RunParam.YKSelectTime<160) TTU_RunParam.YKSelectTime= 160;
if(TTU_RunParam.YKExcecuteTime<5) TTU_RunParam.YKExcecuteTime=5;
if(TTU_RunParam.PWM_SET<2) TTU_RunParam.PWM_SET=2;
if(TTU_RunParam.PWM_SET>50) TTU_RunParam.PWM_SET=50;
TxGap=TTU_RunParam.PWM_SET; ; //发送间隙
ReadPower();
clr_watchdog();
t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A0/1000;
KP_A0=(t>>4);
clr_watchdog();
t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B0/1000;
KP_B0= (t>>4);
t= (long)TTU_RunParam.KV_C * TTU_RunParam.KI_C0/1000;
KP_C0= t>>4;
clr_watchdog();
t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A1/1000;
KP_A1 = t>>4;
t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B1/1000;
KP_B1= t>>4;
clr_watchdog();
t= (long) TTU_RunParam.KV_C * TTU_RunParam.KI_C1/1000;
KP_C1= t>>4;
switch(TTU_RunParam.Bauds0) //设置波特率
{
case 1:t=300; break;
case 2:t=600; break;
case 3:t=1200;break;
case 4:t=2400;break;
case 5:t=4800;break;
case 6:t=9600;break;
default:t=2400;TTU_RunParam.Bauds0=4; TTU_RunParam.AddrOfTTU=1; break;
}
SetCOM0BT(t);
nhighV = TTU_RunParam.UHighV*10 ;
if(nhighV<2200) nhighV=2200;
if(nhighV>2700) nhighV=2700;
nlowV = TTU_RunParam.ULowV*10 ;
if(nlowV>2200) nlowV=2200;
if(nlowV<1800) nlowV=1800;
TTU_RunParam.VersionOfSoft=SOFTVERSION ;
}
//定时喂狗
void clr_watchdog()
{
if(numconst)
{
clr_Syswtdog();
P2OUT^=BIT1;
}
}
//LCD液晶显示
void LcdInit(void)
{
unsigned int d;
char *LCD = LCDMEM;
LCDCTL |=LCDON+LCD4MUX+LCDSG0_7; // Initialize LCD driver (4Mux mode)
BTCTL |= BTFRFQ1; // set LCD frame freq = ACLK
P5SEL = 0xFC; // set Rxx and COM pins for LCD
P2Counter=1;
P1Counter=1;
for(d=0;d<20;d++) // clear LCD memory to clear displa
{
LCD[d]=0;
}
}
void Init() //初始化模块
{
//=====================初始化所有的 I/O 口线==============================
Port1Init(); //P1口初始化
Port2Init(); //P2口初始化
clr_watchdog(); //喂狗
TimerInit(); //时钟初始化
ADCInit(); //AD初始化
clr_watchdog(); //喂狗
SetRunParam(); //运行参数初始化
SpecialFlag.nIdleTime=0;
CommState.DoSendLubo=0;
CommState.DoWrParm=0;
CommState.TxWait=0;
///////////////////////////////////
SpecialFlag.DoSendClass1Data=0;
///////////////////////////////////
DeviceState.Capture=0;
DeviceState.In_phase=1;
DeviceState.Cal_FFT=0;
DeviceState.doSaveHisdata = 0;
LcdInit(); //液晶显示初始化
ResumeStaticData(); //来电统计数据恢复
RunState.nResetNum ++ ;
WriteStaticsData(0);
}
int CheckData(int Flag)
{
int *P,mid,ParamMax,ParamMin,ParamMid;
if(Flag == 0)
{
P = &TTU_RunParam.KV_A;
ParamMax = 4000;
ParamMin = 2000;
ParamMid = 3200;
}
if(Flag == 1)
{
P = &TTU_RunParam.KI_A0;
ParamMax = 12000;
ParamMin = 9000;
ParamMid = 10200;
}
if(Flag == 2)
{
P = &TTU_RunParam.KI_A1;
ParamMax = 3000;
ParamMin = 1000;
ParamMid = 2400;
}
if((*P >= *(P+1)) && (*P >= *(P+2)))
{
if(*(P+1) >= *(P+2) ) { mid = *(P+1); }
if(*(P+2) >= *(P+1) ) { mid = *(P+2); }
}
if((*(P+1) >= *P) && (*(P+1) >= *(P+2)))
{
if(*P >= *(P+2) ) { mid = *P;}
if(*(P+2) >= *P ) { mid = *(P+2); }
}
if((*(P+2) >= *P) && (*(P+2) >= *(P+1)))
{
if(*P >= *(P+1) ) { mid = *P; }
if(*(P+1) >= *P ) { mid = *(P+1); }
}
//if((max - min) < 1000) return 0;
if(mid > ParamMax || mid < ParamMin) mid = ParamMid;
if(((*P ) >mid + 1000) || ((*P ) < mid - 1000) ) *P = mid;
if(((*(P+1) ) >mid + 1000) || ((*(P+1) ) < mid - 1000) ) *(P+1) = mid;
if(((*(P+2) ) >mid + 1000) || ((*(P+2) ) < mid - 1000) ) *(P+2) = mid;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -