📄 meterage.c
字号:
//LCDAPCTL1 = 0x00;
//LCDAVCTL0 = 0x00;// enable charge pump
//LCDAVCTL1 = 0x00;
U0CTL=0x01;//复位485通信口1
//7 6 5 4 3 2 1 0
//| | | | | | | +-SWRST(1)--1:初始化成复位状态 0:USART 模块被允许。
//| | | | | | +---MM(1)--0:线路空闲多机协议(异步模式),从机模式(同步方式) 1:地址位多机协议(异步模式),主机模式(同步方式)
//| | | | | +-----SYNC(1)--0:UART模式(同步) 1:SPI模式(异步)
//| | | | +-------Listen(1)--0:无反馈 1:有反馈,自己发送的数据别自己接收
//| | | +---------CHAR(1)--0:7位 1:8位
//| | +-----------SP(1)--0:1位停止位 1:2位停止位
//| +-------------PEV(1)--0:奇校验 1:偶校验
//+---------------PENA(1)--0:校验禁止 1:校验允许
//UCA0CTL1=0x01;//复位485通信口0
TACTL=TACTL & 0xffcf;
//15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
// | | | | | | | | | | | | | | | +-TAIFG(1)--定时器益出标志位
// | | | | | | | | | | | | | | +---TAIE(1)--中断允许标志位。
// | | | | | | | | | | | | | +-----TACLR(1)--定时器清除位。
// | | | | | | | | | | | | +-------未用(1)
// | | | | | | | | | | +-+---------MC1,MC0(2)--00:停止模式 01:增计数模式 10:连续计数模式 11:增/减计数模式
// | | | | | | | | +-+-------------ID1,ID0(2)--00:直通,不分频 01:1/2分频 10:1/4分频 11:1/8分频
// | | | | | | +-+-----------------TASSEL1,TASSEL0(2)--00:TACLK外部引脚 01:ACLK 10:MCLK 11:INCLK外部输入时钟
// +--+--+--+--+--+---------------------未用(6)
P1SEL=0x00;
//sel为端口选择寄存器=0:I/O端口 =1:外围模块 P1.2定义定时器功能(PWM输出模式)
//P1.0 WDOG
//P1.1 CTLR VPP红外接收电源控制
//P1.2 TXD1 红外通讯发送
//P1.3 RXD1 红外通讯接收 下降沿中断
//P1.4 POWER 电源监测中断 下降沿中断
//P1.5 多功能输出
//P1.6 K1上翻键
//P1.7 K2下翻键 轮显按键
P1DIR=0xc0;//0x27//最高两位做按键输入,4位电源电压监测,3位红外通信输入,其它位输出 0:输入 1:输出
P1OUT=0x00;
P2SEL=0x00;
//0X38;sel为端口选择寄存器=0:I/O端口 =1:外围模块//管角定义接收发送模块,TB2捕获允许
//7 6 5 4 3 2 1 0
//0 0 1 1 1 1 1 0
//| | | | | | | +-P2.0--485 0接收中断
//| | | | | | +---P2.1--编程开关
//| | | | | +-----P2.2--开盖记录
//| | | | +-------P2.3--SAMPLE 周期检测中断
//| | | +---------P2.4--TXDA 485 0发送
//| | +-----------P2.5--RXDA 485 0接收
//| +-------------P2.6--报警灯=1输出
//+---------------P2.7--485 1接收中断
P2DIR=0x23;
P2OUT=0x00;
P1IES=0;
P1IE=0;
P1IFG=0;
P2IFG=0;
P2IES=0;
P2IE=0;
// SVSCTL=0x00;
c_second_count_start=0;
_EINT();//允许中断
//FLL_CTL1=FLL_CTL1 | 0x60;
//00B1-0(rw-00)--FLL_DIV LFXT1分频因子 ACLK/n可以在P1.5输出 n=1,2,4,8
//0B2(rw-0)--SELS =0:SMCLK=DCOCLK =1:SMCLK=XT2CLK
//10B4-3(rw-00)--SELM 0,1:MCLK=DCOCLK 2:MCLK=XT2CLK 3:MCLK=ACLK(LFXT1)
//0B5(rw-1)--XT2Off 0:如果XT2没有被用作MCLK或SMCLK,则关闭XT2 1:打开XT2
//B6(rw-0)--SMCLKOff 0:打开SMCLK 1:关闭SMCLK
_NOP();
if((c_meter_stat2 & 0x04)==0)//c_meter_stat2--电能表运行状态字,0:抄表方式0-自动1-手动 1:最大需量积算方式0-滑差1-区间 2:3.6V电池电压3: 4:有功电能方向 5:无功电能方向 6:7:
LPM3;//进入低功耗模式3
else
LPM4;//换电池进入休眠或电池欠压休眠则停止工作
delay(2);
}
if(c_low_mode==3&&((SVSCTL&0x01)==0))//必须放在休眠程序后面,退出休眠状态时程序要从这里开始执行。否则重新上电会产生复位
// if(c_low_mode==3)//必须放在休眠程序后面,退出休眠状态时程序要从这里开始执行。否则重新上电会产生复位
{
// LPM3_EXIT;//只能在中断里用
_DINT();
init_module();
//P1OUT=P1OUT ^ 0x20;//复位看门狗
read_int();
par_init();
c_low_mode=0;
c_inside_par=c_inside_par & 0xfe;//c_inside_par--测试参数 7: 6:(0-ee正常 1-ee故障) 5: 4:485低端低 3: 2:(0-电池正常 1-电池欠电) 1: 0:(0-正常上电 1=未上电)
_EINT();
read_time();
//P1OUT=P1OUT ^ 0x20;//复位看门狗
}
if(c_work_start==0)
{
P1OUT|=0x10;
}
if(c_second==0&&c_work_start==1&&c_work_start_flag==0)
{
c_second_count_start=1;
c_work_start_flag=1;
convert.high=ul_Ah_bcd;
c_i2c_tx_buf[2]=convert.low[0];//
c_i2c_tx_buf[3]=convert.low[1];
c_i2c_tx_buf[4]=convert.low[2];
c_i2c_tx_buf[5]=convert.low[3];
write_f24c16(0x01ae,4);
}
i1=IE2;
if((i1&0x80)==0)//防止秒信号中断丢失
IE2=IE2|0x80;
/* read_time();
if(c_comm1_stat==0xaa )//UART1
{
c_comm1_stat=0xff;
do_comm();
c_tx1_num=0;
U0TXBUF=c_tx1_buf[c_tx1_num];
if(c_modify_par>0 && c_modify_par<3)
{
par_init();
}
else
{
if(c_modify_par==3)
read_int();
}
c_modify_par=0;
}
*/
// if(c_work_start==1)
// {
// init_analog_front_end_SD16( );
// }
read_time();
if(c_i_computation==1)
{
c_i_computation=0;
for(i1=10;i1<20;i1++)
{
l_i_accumulate+=i_i_from_ad[i1];
l_bat_accumulate+=i_bat_from_ad[i1];
// l_i_accumulate+=i_bat_from_ad[i1];
// l_bat_accumulate+=i_i_from_ad[i1];
}
// //P1OUT=P1OUT ^ 0x20;//复位看门狗
l_averag=l_i_accumulate/10;
f_i_value=(float)l_averag*f_scale_equalize;
// f_i_value=(float)l_averag*0.00721;
//P1OUT=P1OUT ^ 0x20;//复位看门狗
i_averag=(int)(l_bat_accumulate/10);
c_bat_vol=(unsigned char)((float)i_averag*0.0021);
c_bat_vol=hex_bcd_char(c_bat_vol);
//填充电流
ul_i_bcd=hex_bcd_long((ulong)(f_i_value*1000));
//P1OUT=P1OUT ^ 0x20;//复位看门狗
l_i_accumulate=0;
l_bat_accumulate=0;
c_sample_count=0;
SD16CCTL1 |= SD16SC;
bg=ul_i_bcd;
bg1=ul_i_bcd>>8;
bg2=ul_i_bcd>>16;
// bg3=ul_i_bcd>>24;
if(c_bat_vol<0x24)
{
c_err_stat=c_err_stat|0x02;//c_err_stat--错误状态 7: 6:电量走飞 5:电能潮向改变(任1相反向) 4:存储器故障 3:电压逆相序 2:时钟异常 1:电池低 0:外部主晶振故障
}
// ui_over_i_verify=(uint)(bcd_hex_long(ul_i_bcd));
// if(ui_over_i_verify>200)
if(bg2>0x20&&c_over_i_stat!=0xAA)
{
P1OUT|=0x10;//打开无线模块控制脚
c_over_i_stat=0xAA;
convert.high=ul_i_bcd;
c_tx_pointer=(char*)0x22c;
*(c_tx_pointer)=0x68;
*(c_tx_pointer+1)=c_meter_id[0];
*(c_tx_pointer+2)=c_meter_id[1];
*(c_tx_pointer+3)=c_meter_id[2];
*(c_tx_pointer+4)=c_meter_id[3];
*(c_tx_pointer+5)=c_meter_id[4];
*(c_tx_pointer+6)=c_meter_id[5];
*(c_tx_pointer+7)=0x68;
*(c_tx_pointer+8)=0x1e;
*(c_tx_pointer+9)= 0x07;
// *(c_tx_pointer+10)= convert.low[2];
// *(c_tx_pointer+11)= convert.low[0];
*(c_tx_pointer+10)= c_second+0X33;
*(c_tx_pointer+11)=c_minute+0X33;
*(c_tx_pointer+12)=c_hour+0X33;
*(c_tx_pointer+13)=c_day+0X33;
*(c_tx_pointer+14)=c_month+0X33;
*(c_tx_pointer+15)=c_year+0X33;
*(c_tx_pointer+16)= 0xAA+0X33;//大电流短路报警状态字为0xAA
// i3=c_data_length+12;
*(c_tx_pointer+17)=*(c_tx_pointer);
for(i1=1;i1<17;i1++)//计算校验码
{
*(c_tx_pointer+17)=*(c_tx_pointer+17)+*(c_tx_pointer+i1);
}
*(c_tx_pointer+18)=0x16;
*(c_rx_pointer+84)=18;//发送长度长度
//U0TXBUF=c_tx1_buf[c_tx1_num];
// U0TXBUF=*(c_tx_pointer);
c_tx1_num=0;
U0TXBUF=c_tx1_buf[c_tx1_num];
}
}
P1OUT=P1OUT ^ 0x20;//复位看门狗
if(c_emission_return==1&&c_comm1_stat==0xaa)
{
c_emission_return=0;
// c_comm_succeed=1;
c_comm1_stat=0xff;
do_comm1();
}
else
{
// if(c_comm1_stat==0xaa && ((P1IN & 0x10)!=0))//UART1
if(c_comm1_stat==0xaa )//UART1
{
//P1OUT|=0x10;//打开无线模块控制脚
c_comm1_stat=0xff;
do_comm();
// P1OUT|=0x10;
c_tx1_num=0;
U0TXBUF=c_tx1_buf[c_tx1_num];
if(c_modify_par==2)
{
par_init();
}
else
{
if(c_modify_par==3)
read_int();
}
c_modify_par=0;
}
}
/*
if(c_com_rest_count>3)//通讯超时复位计数器
{
c_com_rest_count=0;
U0CTL=PENA+PEV+CHAR;//控制寄存器 配置通信口0,校验使能,偶效验,8位字符,一位停止位,复位通信口,
//7 6 5 4 3 2 1 0
//| | | | | | | +-SWRST(1)--1:初始化成复位状态 0:USART 模块被允许。
//| | | | | | +---MM(1)--0:线路空闲多机协议(异步模式),从机模式(同步方式) 1:地址位多机协议(异步模式),主机模式(同步方式)
//| | | | | +-----SYNC(1)--0:UART模式(同步) 1:SPI模式(异步)
//| | | | +-------Listen(1)--0:无反馈 1:有反馈,自己发送的数据别自己接收
//| | | +---------CHAR(1)--0:7位 1:8位
//| | +-----------SP(1)--0:1位停止位 1:2位停止位
//| +-------------PEV(1)--0:奇校验 1:偶校验
//+---------------PENA(1)--0:校验禁止 1:校验允许
U0TCTL=SSEL1;//发送控制寄存器 时钟选择主时钟 SSEL1=0x20
//7 6 5 4 3 2 1 0
//0 0 1 0 0 0 0 0
//| | | | | | | +-TXEPT(1)--1:发送器空 0:发送器有数据。
//| | | | | | +---STC(1)--异步模式不使用 0:选择SPI的4线模式 1:3线模式
//| | | | | +-----TXWAKE(1)--多处理器通信传送控制位(同步方式不使用)
//| | | | +-------URXSE(1)--接收出发沿控制位,在同步时没有使用 0:没有收到数据 1:接收到数据,请求接收中断服务
//| | +-+---------SSEL1-0(2)--00:选择外部时钟UCLK 01:选择辅助时钟ACLK 10:11:选择子系统时钟SMCLK
//| +-------------CKPL(1)--时钟极性控制位
//+---------------CKPH(1)--时钟相位控制位
U0RCTL=0X08;//清除各种错误标志
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-RXERR(1)--接收错误标志位 1:有错误接收,该位不能自动复位 0:没有接收错误
//| | | | | | +---RXWAKE(1)--接收唤醒检测位 0:没有被唤醒 1:唤醒
//| | | | | +-----URXWIE(1)--接收唤醒中断允许位
//| | | | +-------URXEIE(1)--接收错误中断允许位
//| | | +---------BRK(1)--打断检测位
//| | +-----------OE(1)--溢出标志位
//| +-------------PE(1)--校验错误标志位
//+---------------FE(1)--桢错标志
U0BR0=0x0a;
U0BR1=0x1a;//1200
U0MCTL=0x6b;//01101011
}*/
if(c_1s_sign==1)//c_1s_sign--1秒标志,做记录用
{
c_1s_sign=0;
/* if(ul_i_bcd>0x1500)
{
ul_Ah_residual=ul_Ah_residual+bcd_hex_long(ul_i_bcd);
}
ul_Ah_residual=ul_Ah_residual+bcd_hex_long(ul_i_bcd);
i1=0;
while(ul_Ah_residual>=36000)// 0.01AH
{
ul_Ah_residual=ul_Ah_residual-36000;
i1++;
}*/
ui_Ah_residual=ui_Ah_residual+(uint)(bcd_hex_long(ul_i_bcd));
i1=0;
while(ui_Ah_residual>=36000)// 0.01AH
{
ui_Ah_residual=ui_Ah_residual-36000;
i1++;
}
if(i1!=0)
{
read_f24c16(0x0106,4);
convert.low[0]=c_i2c_rx_buf[0];
convert.low[1]=c_i2c_rx_buf[1];
convert.low[2]=c_i2c_rx_buf[2];
convert.low[3]=c_i2c_rx_buf[3];
ul_temp=bcd_hex_long(convert.high)+i1;
if(ul_temp>99999999)//防止溢出
ul_temp=0;
ul_temp=hex_bcd_long(ul_temp);
ul_Ah_bcd=ul_temp;
c_i2c_tx_buf[2]=ul_temp;
c_i2c_tx_buf[3]=ul_temp>>8;
c_i2c_tx_buf[4]=ul_temp>>16;
c_i2c_tx_buf[5]=ul_temp>>24;
write_f24c16(0x0106,4);//存储失压相安培小时数
//P1OUT=P1OUT ^ 0x20;//复位看门狗
}
if(c_second==0x15||c_second==0x45)
{
c_day1=c_day;
c_hour1=c_hour;
c_minute1=c_minute;
c_month1=c_month;
c_second1=c_second;
c_year1=c_year;
read_time();
if(c_i2c_read_stat==0)
{
if((c_year1!=c_year)||(c_month1!=c_month)||(c_day1!=c_day)||(c_hour1!=c_hour)||(c_minute1!=c_minute)||(abs(c_second1-c_second)>10))
{
c_second=c_second1;
c_minute=c_minute1;
c_hour=c_hour1;
c_day=c_day1;
c_month=c_month1;
c_year=c_year1;
judge_week();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -