?? meterage.c
字號:
c_comm1_end=1;
if(c_tx1_num<=c_tx1_count)
{
U0TXBUF=c_tx1_buf[c_tx1_num];
}
else
{
c_comm1_end=0;
}
// if((TBCCTL0 & 0x10)==0x10)//當進行ad變換時允許中斷嵌套
// _EINT();
// i4=0;
/* ++lj2;
c_tx1_num++;
c_comm1_end=1;
if(c_tx1_num<=7)
//if(c_tx1_num<=c_tx1_count)
{
U0TXBUF=c_tx1_buf[c_tx1_num];
}
else
{
c_tx1_num=0;
// P1OUT&=0xfb;
// i4=0x01;
// ui_comm1_high=0;
// P2IES=P2IES&0x7f;//改為上升沿
// P2IFG=P2IFG & 0x7f;
// P2IE=P2IE|0x80;
}*/
}
#pragma vector = BASICTIMER_VECTOR
__interrupt void BASICTIMER()
{
P1OUT=P1OUT ^ 0x20;//復位看門狗
SVSCTL=SVSCTL&0xfe;
delay(1000);
if(c_low_mode==1&&(SVSCTL&0x01)==0)
{
// FLL_CTL1=FLL_CTL1 & 0x00;
// P1OUT|=0xd0;
_NOP();
c_low_mode=3;
_BIC_SR_IRQ(LPM3_bits);//主程序中的低功耗模式停止
_NOP();
return;
// c_stop_second=0;
}
/* if(c_low_mode==3)
{
c_stop_second=c_stop_second+1;//c_stop_second--停電喚醒時間計數器
}
if(c_wink_count==0)//c_wink_count--液晶顯示閃爍計數器
c_wink_count++;
else
c_wink_count=0;*/
if(c_second_count_start==1)
{
c_half_second_sign++;
// if(c_half_second_sign==0x02&&c_second_count_start==1)
if(c_half_second_sign==0x02)
{
c_4s_sign_count++;
c_sec_count++;
c_5s_stat++;
c_half_second_sign=0;
c_1s_sign=1;
}
if(c_4s_sign_count==4)
{
c_4s_sign_count=0;
if(c_min5_stat==1)
{
c_emission_stat=1;
}
else
{
c_comm_succeed=0;
}
}
/* if((SVSCTL&0x01)==1&&c_5s_stat==5)
{
c_5s_stat=0;
_NOP();
c_low_mode=3;
_BIC_SR_IRQ(LPM3_bits);//主程序中的低功耗模式停止
_NOP();
}
*/
if(c_sec_count==60)
{
c_1m_sign=1;
c_sec_count=0;
c_min_count++;
c_min5_stat=0;
c_rf_stat=0;
}
if(c_min_count==5)
{
c_min_count=0;
//c_min_count=1;
c_min5_stat=1;
}
}
else
{
c_half_second_sign++;
// if(c_half_second_sign==0x02&&c_second_count_start==1)
if(c_half_second_sign==0x02)
{
c_half_second_sign=0;
c_1s_sign=1;
}
}
}
#pragma vector = SD16_VECTOR
__interrupt void SD16()
{
c_sample_count++;
i_i_from_ad[c_sample_count] = SD16MEM0; //Neutral current
i_bat_from_ad[c_sample_count] = SD16MEM1; // battry voltage
if(c_sample_count>20)
{
SD16CCTL1&=~SD16SC;
c_i_computation=1;
}
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TIMERA0()//計算20 ms內的Ah數
{
// Ah_M+=adc_buffer[2]*0.0019*655/32768/3600;
if((SVSCTL&0x01)==0)//c_power_low--=1 電源電壓低準備進入低功耗模式
{
c_watchdog_count++;//看門狗計數器計數
}
}
void main(void)
{
unsigned char i1,i2,i3;
WDTCTL = WDTPW + WDTHOLD;//Stop watchdog timer
_DINT();
init_module( );
init_variable( );
//P1OUT|=0xd0;
// goto_high_freq();
//P1OUT=P1OUT ^ 0x20;//復位看門狗
if((SVSCTL&0x01)==0x01)//停電判斷 避免停電換電池cpu進入正常工作模式
//P1.4 POWER 電源監測中斷 下降沿中斷
{
SVSCTL=SVSCTL&0xfe;
for(i2=0;i2<10;i2++)//延時10ms濾除干擾
{
delay(1000);
}
if((SVSCTL&0x01)==1&&c_comm1_end==0)
{
//進入低功耗模式
SVSCTL=SVSCTL&0xfe;
c_low_mode=1;
// c_meter_stat2=0x04;//c_meter_stat2--電能表運行狀態字,0:抄表方式0-自動1-手動 1:最大需量積算方式0-滑差1-區間 2:3.6V電池電壓3: 4:有功電能方向 5:無功電能方向 6:7:
goto sleep;//停止工作狀態
}
}
c_i2c_tx_buf[2]=0x23;//24小時制,每秒中斷一次
write_time(0xe0,1);//從控制寄存器1開始寫
read_f24c16(0x0000,10);//讀新表狀態字10個
i3=0;
for(i2=0;i2<10;i2++)
{
if(c_i2c_rx_buf[i2]==0x55)
i3++;
}
//i3=0;//測試用
if(i3==0)
{
new_meter();
}
read_int();
/*//$$$$
//寫不足0.01度的剩余脈沖 0xfa
c_i2c_tx_buf[2]=0;
c_i2c_tx_buf[3]=0;
c_i2c_tx_buf[4]=0;
c_i2c_tx_buf[5]=0;
c_i2c_tx_buf[6]=0;
c_i2c_tx_buf[7]=0;
write_f24c16(0x00fa,6);
write_f24c16(0x1b10,3);
c_p_timer[0]=0;//c_p_timer[4]--總\A\B\C\ 電能余數計數器
c_p_timer[1]=0;
c_p_timer[2]=0;
c_p_timer[3]=0;
// c_1p_timer=c_i2c_rx_buf[4];
c_q_timer[0]=0;
c_q_timer[1]=0;//c_q_timer[4]--總\A\B\C\ 電能余數計數器
c_q_timer[2]=0;
c_q_timer[3]=0;
//$$$$*/
par_init();
read_time();
/* c_i2c_tx_buf[2]=c_day;
c_i2c_tx_buf[3]=c_month;
c_i2c_tx_buf[4]=c_year;
c_i2c_tx_buf[5]=c_minute;
c_i2c_tx_buf[6]=c_hour;
write_f24c16(0x0147,5);//記錄上電時間
c_i2c_tx_buf[2]=0;
c_i2c_tx_buf[3]=0;
c_i2c_tx_buf[4]=0;
c_i2c_tx_buf[5]=0;
c_i2c_tx_buf[6]=0;
write_f24c16(0x0142,5);//清停電時間
// c_i2c_tx_buf[2]=0x00;//時鐘補償字
// write_time(0x70,1);//補償時鐘控制字
// c_jhf_banben=0x23;
//P1OUT=P1OUT ^ 0x20;//復位看門狗辦公室一族健康食譜
*/
_EINT();
while(1)
{
//P1OUT=P1OUT ^ 0x20;//復位看門狗
/* if(c_week_stat==1)
{
IE2|=0x80;//打開基本定時器中斷
}
*/
if((IFG1&0x02)!=0)//震蕩器故障重新設置震蕩器
{
IFG1=0;
FLL_CTL0 |= XCAP14PF; /* 配置電容 */
SCFI0 = FLLD_1; /* Freq = 1.024MHz */
SCFQCTL = 32 - 1;
FLL_CTL0 |= DCOPLUS;
IFG1=0;
}
/* if((SVSCTL&0x01)==0)
{
if(c_watchdog_count!=0)
{
//P1OUT=P1OUT ^ 0x20;//復位看門狗
c_watchdog_count=0;
}
}*/// 這一段判斷看門狗計數器有什么作用?
if((SVSCTL&0x01)==1)//停電判斷 避免停電換電池cpu進入正常工作模式
//P1.4 POWER 電源監測中斷 下降沿中斷
{
SVSCTL=SVSCTL&0xfe;
for(i2=0;i2<10;i2++)//延時10ms濾除干擾
{
delay(1000);
}
if((SVSCTL&0x01)==1&&c_comm1_end==0)
{
SVSCTL=SVSCTL&0xfe;
_DINT();
c_low_mode=1;//進入低功耗模式
if(c_thief_start!=0)//保證電能量寫入正確
{
// c_i2c_tx_buf[2]=0x00;//時鐘補償字
// write_time(0x70,1);//補償時鐘控制字
par_save();
// c_low_mode=1;//進入低功耗模式
}
}
}
//P1OUT=P1OUT ^ 0x20;//復位看門狗
if(c_low_mode==1)//低功耗模式
{
sleep:
_DINT();//禁止中斷
_NOP();
IFG1=0;//中斷標志1
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0 WDTIFG(1)--rw-0
//| | | | | | +---1 OFIFG(1)--rw-0
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4 NMIFG(1)--rw-0
//| | +-----------5
//| +-------------6
//+---------------7
IFG2=0;//中斷標志2
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0 URXIFG0(1)--UART0接收中斷標志 rw-0
//| | | | | | +---1 UTXIFG0(1)--UART0發送中斷標志 rw-1
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4 URXIFG1(1)--UART1接收中斷標志 rw-0
//| | +-----------5 UTXIFG1(1)--UART1發送中斷標志 rw-1
//| +-------------6
//+---------------7
ME1=0;//模塊使能1
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0
//| | | | | | +---1
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4
//| | +-----------5
//| +-------------6 URXE0(1)--UART0接收允許 rw-0
//+---------------7 UTXE0(1)--UART0發送允許 rw-0
// ME2=0;//模塊使能2
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0
//| | | | | | +---1
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4 URXE1(1)--UART1接收允許 rw-0
//| | +-----------5 UTXE1(1)--UART1發送允許 rw-0
//| +-------------6
//+---------------7
IE1=0;//中斷使能1
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0 WDTIE rw-0
//| | | | | | +---1 OFIE rw-0
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4 NMIIE rw-0
//| | +-----------5 ACCVIE rw-0
//| +-------------6
//+---------------7
IE2=0x80;//0;//打開基本定時器中斷
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0 URXIE0(1)--UART0接收使能 rw-0
//| | | | | | +---1 UTXIE0(1)--UART0發送使能 rw-0
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4 URXIE1(1)--UART1接收使能 rw-0
//| | +-----------5 UTXIE1(1)--UART1發送使能 rw-0
//| +-------------6
//+---------------7 //基本定時器
SD16CTL=0;//關斷SD16
SD16CCTL0=0x00;
SD16CCTL1=0x00;
LCDCTL=0;//關閉液晶顯示
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0 LCDM0(1)--定時發生器開關。0:定時發生器關閉,COM線與段驅動端為抵電平,液晶復用端口被選為輸出端口的,輸出不受影響;LCD+模塊切斷電阻網絡電源。
//| | | | | | +---1 LCDM1(1)--只對LCD+有效,選擇LCD驅動電壓幅度;0:模擬發生器內阻為高阻抗 1:內阻為低阻抗
//| | | +-+-+-----2 LCDM4,3,2(3)--LCDM2選擇允許或禁止段輸出;LCDM3,4--4種模式輸出;靜態,2MUX,3MUX,4MUX
//+-+-+-----------7 選擇輸出段或端口信息組合 111--4MUX
//LCDAPCTL0 = 0x00;// Segments 0-13
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -