?? meterage.c
字號:
#include <msp430x42x.h>
#include <math.h>
#include <stdlib.h>
#define CURRENT_CH_1_GAIN SD16GAIN_1
#define CURRENT_CH_2_GAIN SD16GAIN_16
#define VOLTAGE_CH_GAIN SD16GAIN_1
#define SD16CONF0_FUDGE 0xC0
#define SD16CONF1_FUDGE 0x40
#define uint unsigned int
#define ulong unsigned long
//char c_emission_times;//一次通訊過程中的發射次數
char c_emission_stat;// 通訊2s不成功再發送標志
char c_work_start;//開始正常工作標志(在變量初始化時置1,新表時為零在電貓1和2聯絡成功后置為1此時電貓才能開始采樣及定時發射等工作)
//char c_emission_failure;//在定時發射通訊過程中通訊失敗標志,每次最多通訊4次
char c_emission_return;//定時發射接收電貓2返回成功標志
//char c_emission_failure_times;//5分鐘定時發射沒有通訊成功的總的失敗次數
char c_comm_succeed;//定時發射成功標志
char c_half_second_sign;// 0.5s標志
char c_1s_sign;// 1s標志
char c_sec_count;
char c_min_count;
char c_min5_stat;
char c_1m_sign;
char c_4s_sign_count;
char c_rf_stat;//正常工作過程中的定時發射標志
char c_5s_stat;
char c_second_count_start;
uint ui_over_i_verify;//短路電流判斷
char c_low_mode;//c_low_mode--0:正常耗模式 1:低功耗休眠模式 3:喚醒模式
char c_day1;
char c_month1;
char c_year1;
char c_second1;
char c_minute1;
char c_hour1;
char c_i2c_rx_count;//c_i2c_rx_count--i2c讀取長度
char c_i2c_rx_buf[20];
char c_i2c_tx_count;
char c_i2c_tx_buf[20];
char c_i2c_read_stat;
char c_i2c_write_stat;
char c_i2c_rx_buf_bak[20];
//char c_stop_second;//c_stop_second--停電喚醒時間計數器
char c_rx1_num;//c_rx1_num--通訊接收計數器
char c_rx1_count;//c_rx1_count--通訊接收長度
char c_tx1_num;
char c_comm1_stat;//c_comm1_stat--通訊狀態
char c_comm1_end;//485通信結束標志
char c_comm1_delay;
char c_meter_id[6];//表號新表默認88
char c_user_id[6];//用戶號
char c_equip_id[6];//設備號
char c_pass[3][3];//填充密碼用
//char c_p_timer[4];//c_p_timer[4]--A\B\C\總 電能余數計數器
//char c_p_timer;//Ah余數計數器
//char c_bat_vol;//c_bat_vol--電池電壓//??????????????????????????????
char c_stop_bat_vol;//停電抄表電池電壓//??????????????????????????????
//ulong ul_bat_work;//電池工作時間
//ulong ul_p_pulse_const;//ul_p_pulse_const--有功、基波、視在發脈沖常數
//ulong ul_q_pulse_const;//ul_q_pulse_const--無功發脈沖常數
char c_ray_alarm_stat;//c_ray_alarm_stat--光控報警控制字
char c_watchdog_count;
char c_meter_stat;//c_meter_stat--電表狀態指示 7:失壓 6:過壓 5:逆相序 4:斷相報警 3:編程開關按下 2:需量正在清零 1:2是否有通信 0:1是否有通信
char c_com_rest_count;//通訊超時復位計數器
char c_modify_par;//通信程序修改參數后重新從e2中讀出參數并進行配置(時段等)
char c_meter_start;//電表啟動標志字 0-剛剛啟動有些功能不進行處理(斷相、失壓、電壓合格率、顯示等)
char *c_pointer;
//ulong *ul_pointer;
char *c_rx_pointer;
char *c_tx_pointer;
char c_sample_count;//c_sample_count--ad采樣計數變量
char c_i_computation;//電流計算標志
char c_comm_error;//通信錯誤信息字:0非法數據 1數據標識錯 2密碼錯 4年數區數超 5日時段數超 6費率數超
char c_data_length;//通信數據內容的數據長度
char c_clear_meter;//c_clear_meter--1:新表 2:總清 3:需量清零(編程按鍵按下,670703,下翻5秒新表。960101,下翻5秒總清。其他日期,下翻5秒需清)
char c_over_i_stat;
char bg,bg1,bg2,bg3;
int i_i_from_ad[20];//AD采樣電流值
int i_bat_from_ad[20];//電池電壓采樣值
int i_averag;//電池電壓采樣平均值
//ulong ul_Ah_residual;//Ah余數計數器
ulong ul_temp;
ulong ul_Ah_emission;//發送5分鐘內Ah數
uint ui_Ah_residual;//Ah余數計數器
long l_averag;//電流采樣平均值
long l_i_accumulate;//電流采樣累加值
long l_bat_accumulate;
float f_i_value;//電流計算中間值
float f_scale_equalize;
char c_work_start_flag;
char c_thief_start;
char c_thief_end;
char c_thief_start_1;
ulong ul_thief_time;//竊電時間計算中間值
ulong ul_thief_Ah;//竊電Ah計算中間值
__no_init ulong ul_Ah_bcd @ 0x200;//當前 總Ah
__no_init char c_rx1_buf[24] @ 0x214;
__no_init char c_tx1_buf[60] @ 0x22c;
__no_init char c_tx1_count @ 0x268;
__no_init char c_week @ 0x269;
__no_init char c_day @ 0x26a;
__no_init char c_month @ 0x26b;
__no_init char c_year @ 0x26c;
__no_init char c_second @ 0x26d;
__no_init char c_minute @ 0x26e;
__no_init char c_hour @ 0x26f;
__no_init char c_err_stat @0x270;//c_err_stat--錯誤狀態 7: 6:電量走飛 5:電能潮向改變(任1相反向) 4:存儲器故障 3:電壓逆相序 2:時鐘異常 1:電池低 0:外部主晶振故障
__no_init char c_inside_par @ 0x271;//c_inside_par--測試參數 7: 6:(0-ee正常 1-ee故障) 5: 4:485低端低 3: 2:(0-電池正常 1-電池欠電) 1: 0:(0-正常上電 1=未上電)
__no_init char c_meter_stat1 @ 0x272;//c_meter_stat1--電表運行狀態 7: 6:C相斷流 5:B相斷流 4:A相斷流 3:逆相序 2:C相斷電 1:B相斷電 0:A相斷電
__no_init char c_bat_vol @ 0x273;//--3.6V電池電壓
__no_init ulong ul_i_bcd @ 0x274;//瞬時電流
__no_init char c_meter_stat2 @ 0x278;//c_meter_stat1--電表運行狀態 7: 6:C相斷流 5:B相斷流 4:A相斷流 3:逆相序 2:C相斷電 1:B相斷電 0:A相斷電
const unsigned char gc_day_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每月的天數
const unsigned int gc_month_table[12]={0,31,59,90,120,151,181,212,243,273,304,334};//累計天數
const unsigned char uc_comm_table[]={
/*
此表為通信編程順序表,表格排列順序如下:
--通信序號(2),
--起始地址(2),(最高位為1時代表數據是內存中的數據此時的地址是對應0x1100的偏移量,對應e2的地址是實際地址)
--數據長度(1),
--密碼控制權限(1).(其中為數據 為0表示R,為1表示R/W)
--每個量占6個字節 //unsigned long i1,i2,i3;思路決定出路,智商引領工商,清泉之澈、流水之潤’,你說這是什么意思?我說,‘估計前一句是教你如何做事,后一句是教你如何待人。
*/
0xb6,0x7e,0x00,0x0a,4,0,/*內部測試參數程序名4,程序序列號3,版本號1*/ // 0
0xb6,0x7d,0x00,0x0e,2,0,/*內部測試參數,電能芯片1,小版本號1*/
0xc0,0x32,0x01,0x00,6,1,/*電貓設備號 */
0xc3,0x17,0x82,0x00,4,0,/* 安培小時數 */ //0x106
0xb6,0x21,0x82,0x74,3,0,/* 當前電流 */
0xc0,0x10,0x82,0x69,4,1,/*日期及周次*/ // 5
0xc0,0x11,0x82,0x6d,3,1,/*時間*/
0xb6,0x76,0x82,0x73,1,0,/* 3.6v電池電壓 */
0xb7,0x40,0x82,0x70,1,0,/* 故障狀態字 */
0xc5,0x20,0x00,0xf6,1,0,/* 總清次數 */
0xe9,0x10,0x00,0xf4,2,1,/* 電流調整系數 */ //10
0xe0,0x30,0x01,0x0a,5,0,/* 最近1次短路時間 */
0xe0,0x31,0x01,0x0f,5,0,/* 最近2次短路時間 */
0xe0,0x32,0x01,0x14,5,0,/* 最近3次短路時間 */
0xe0,0x33,0x01,0x19,5,0,/* 最近4次短路時間 */
0xe0,0x34,0x01,0x1e,5,0,/* 最近5次短路時間 */ // 15
0xe0,0x35,0x01,0x23,5,0,/* 最近6次短路時間 */
0xe0,0x36,0x01,0x28,5,0,/* 最近7次短路時間 */
0xe0,0x37,0x01,0x2d,5,0,/* 最近8次短路時間 */
0xe0,0x38,0x01,0x32,5,0,/* 最近9次短路時間 */
0xe0,0x39,0x01,0x37,5,0,/* 最近10次短路時間 */ // 20
0xe0,0x3a,0x01,0x3c,1,0,/* 短路總次數 */
0xe0,0x40,0x01,0x41,8,0,/* 最近1次竊電記錄 */
0xe0,0x41,0x01,0x49,8,0,/* 最近2次竊電記錄 */
0xe0,0x42,0x01,0x51,8,0,/* 最近3次竊電記錄 */
0xe0,0x43,0x01,0x59,8,0,/* 最近4次竊電記錄 */ //25
0xe0,0x44,0x01,0x61,8,0,/* 最近5次竊電記錄 */
0xe0,0x45,0x01,0x69,8,0,/* 最近6次竊電記錄 */
0xe0,0x46,0x01,0x71,8,0,/* 最近7次竊電記錄 */
0xe0,0x47,0x01,0x79,8,0,/* 最近8次竊電記錄 */
0xe0,0x48,0x01,0x81,8,0,/* 最近9次竊電記錄 */ // 30
0xe0,0x49,0x01,0x89,8,0,/* 最近10次竊電記錄 */
0xe0,0x4a,0x01,0x91,4,0,/* 竊電總時間 */ // 32
};
void read_f24c16(unsigned int ui_read_add,unsigned char c_count);
void i2c_read_one(void);
void write_time(unsigned char c_timm_add,unsigned char c_timm_count);
void write_f24c16(unsigned int ui_write_add,unsigned char c_count);
void i2c_write_one(void);
//void read_time(void);
//void init_module(void);
unsigned long bcd_hex_long(unsigned long gl_bcd);
unsigned long hex_bcd_long(unsigned long gl_hex);
unsigned int bcd_hex_int(unsigned int gi_bcd);
unsigned int hex_bcd_int(unsigned int gi_hex);
unsigned char bcd_hex_char(unsigned char gc_bcd);
unsigned char hex_bcd_char(unsigned char gc_hex);
void init_sys(void);
void init_fll(void);
void goto_high_freq(void);
// void init_bt(void);
// void init_TA(void);
void init_variable(void);
void init_module(void);
void read_time(void);
void delay(unsigned int count);
void init_analog_front_end_SD16(void);
void read_int(void);
void par_init(void);//parameter initialize參數初始化(讀出已經設置的內部參數)
void new_meter(void);
void judge_week(void);
void do_comm1(void);
void do_comm(void);
unsigned char check_set_bcd(unsigned char gc_start_add,unsigned char gc_data_len);
void all_clear(void);
void par_save(void);
union {unsigned long high;unsigned int middle;unsigned char low[4];}convert;
union {unsigned int ui_add;unsigned char c_add[2];}add,add1;
#pragma vector = USART0RX_VECTOR
__interrupt void UART1_RX() // interrupt[ESP430_VECTOR] void esp_isr (void)
{
unsigned char i1,i2,i3;
// if((TBCCTL0 & 0x10)==0x10)//當進行ad變換時允許中斷嵌套
// _EINT();
c_comm1_end=1;
// if(c_baud_stat_3s!=0)
// c_baud_stat_3s=1;
c_rx1_buf[c_rx1_num]=U0RXBUF;
c_rx1_num++;
if(c_rx1_num==1)
{
if(c_rx1_buf[0] != 0x68)
{
c_rx1_buf[0]=0;
c_rx1_num=0;
}
//else
//{
// P2IE=P2IE&0x7f;//禁止中斷
// ui_comm1_low=65535;
// P2IES=P2IES|0x80;//改為下降沿
//}
}
else
{
if(c_rx1_num==8) //判斷地址域
{
i2=0;
i3=0;
for(i1=1;i1<7;i1++)
{
if(c_rx1_buf[i1]==0x99)//廣播命令回答本表號
i3=i3+1;
}
if(i3!=6)
{
i3=0;
for(i1=1;i1<7;i1++)
{
if(c_rx1_buf[i1]==0xaa)//廣播命令回答本表號
i3=i3+1;
}
if(i3!=6)
{
for(i1=0;i1<6;i1++)
{
if(c_rx1_buf[i1+1] != c_meter_id[i1])
{ //判斷既不是廣播命令也不是本表號
i2=0xff;
}
}
}
}
if(c_rx1_buf[7]!=0x68)
i2=0xff;
if(i2 != 0)
{
c_rx1_num=0;
c_rx1_count=0;
c_rx1_buf[0]=0;
}
}
else
{
if(c_rx1_num==10)//判斷長度
{
if(c_rx1_buf[9]==0)
c_rx1_count=12;//無數據
else
{
if(c_rx1_buf[9] > 50)
{
c_rx1_num=0;//寫入長度>50無效
}
else
c_rx1_count=c_rx1_buf[9]+12;
}
}
else
{
if(c_rx1_num==c_rx1_count)//接收完全
{
if(c_rx1_buf[c_rx1_num-1]==0x16)//結束符對否
{
i2=c_rx1_buf[0];
for(i1=1;i1<=(c_rx1_count-3);i1++)//加和效驗
{
i2=i2+c_rx1_buf[i1];
}
if(i2==c_rx1_buf[c_rx1_count-2])//效驗正確否
{
// if(c_rx1_buf[10]==0x44 && c_rx1_buf[11]==0x13)
// c_relation_stat=1;
i2=0;
for(i1=1;i1<7;i1++)
{
if(c_rx1_buf[i1]!=0x99)//判斷是否是廣播命令
i2=0xff;
}
if(i2==0)//廣播命令只處理廣播校時及設表號及廣播凍結,載波凍結
{
//if(c_rx1_buf[8]==0x08 || c_rx1_buf[8]==0x0a || c_rx1_buf[8]==0x19 || c_rx1_buf[8]==0x12)
if(c_rx1_buf[8]==0x08 || c_rx1_buf[8]==0x0a )
i2=0xff;
//0x08--廣播校時 0x0a--寫設備地址 0x19--
}
if(c_rx1_buf[2]==0xaa)
{
i2=0;
if((c_rx1_buf[10]==0x65 && c_rx1_buf[11]==0xf3) ||(c_rx1_buf[10]==0x43 && c_rx1_buf[11]==0xf3)
||(c_rx1_buf[10]==0x44 && c_rx1_buf[11]==0xf3))//讀寫表號、時間
i2=0xff;
}
if(i2==0xff)
{
for(i1=10;i1<=(c_rx1_count-3);i1++)
{
c_rx1_buf[i1]=c_rx1_buf[i1]-0x33;//數據減33H格式化處理
}
if(c_rf_stat==1)
{
c_rf_stat=0;
c_emission_return=1;
c_comm_succeed=1;
}
c_comm1_stat=0xaa;
c_meter_stat=c_meter_stat | 0x02;//c_meter_stat--電表狀態指示 7:失壓 6:過壓 5:逆相序 4:斷相報警 3:編程開關按下 2:需量正在清零 1:2是否有通信 0:1是否有通信
if((SVSCTL&0x01)==1)
{
// P1OUT&=0xef;//關閉無線模塊控制腳
}
}
}
}
c_rx1_num=0;
c_rx1_count=0;
}
}
}
}
c_com_rest_count=0;
}
#pragma vector = USART0TX_VECTOR
__interrupt void UART1_TX()
{
c_tx1_num++;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -