?? main.c
字號:
/****************************************Copyright (c)**************************************************
** 上 海 比 亞 迪 有 限 公 司
** 電動汽車研究所
** 電控一科
**
** 文 件 名: Main.C
** 作 者:丁會利
** 日 期: 2006年12月04日
** 描 述: 主函數(shù)
********************************************************************************************************/
#define _MAIN_GLOBAL_
#include "canapp.h"
#include "config.h"
#include "IncludeCan.H"
#include "Main.h"
void alarm(void);
void Logic(void);
uint16 filter6(uint16 y[6]); //AD值計算
/******************************數(shù)據(jù)的定義**********************************/
uint32 IOstate0;
uint32 IOstate1;
uint8 dangwei; //定義檔位用于主接觸器判斷
uint16 speedold;
uint16 speed;
//里程存儲
uint32 odo1; //存放正確里程
uint32 odo2; //存放存儲區(qū)1的里程
uint32 odo3; //存放存儲區(qū)2的里程
uint32 odo4;
uint32 odo5;
uint32 odo1_dlt;
uint8 flag_rec;
uint8 flag_speed;
//=============故障代碼==============
uint8 ecu_no;//故障代碼個數(shù)
uint8 ecu_ch;//新故障代碼標(biāo)識
//==================定時器中的值===============================================
uint16 counter; //發(fā)送里程、速度
uint16 counter1; // 告警數(shù)據(jù)
/*******************************真空壓力傳感器損壞后的計數(shù)**********************/
uint16 counter2; // 5秒計時,到5秒判為損壞
uint16 counter3; // 20m鐘計時
uint16 counter5;
uint8 counter7;//706用于計時
uint8 WDI_flag;//706復(fù)位標(biāo)識
/*******************************************************************************/
/**************************水溫傳感器損壞后的計數(shù)*******************************/
uint16 counter4; // 5秒計時
/*******************************************************************************/
#define pulse_number 1008 //0.1公里的脈沖數(shù)
uint8 odo_buf[40];
uint8 odo_buf1[40];
uint8 odo_buf2[40];
uint16 l_odo_buf[40];
uint16 l_odo_buf1[40];
uint16 l_odo_buf2[40];
uint16 l_odo_buf3[40];
uint8 flag_odo; //判斷上電后讀取的里程是否都為非法的
uint8 i;
uint32 timer1,timer2,error; //脈沖周期計算
uint8 flag;
uint32 counter6;
uint8 flag_cutd; //主接觸器關(guān)斷標(biāo)識
uint8 flag_zhkb; //真空壓力傳感器損壞標(biāo)志
uint8 flag_zhkbkq; //損壞后真空泵開啟標(biāo)志
uint8 flag_zhkbjsh; //損壞后踩腳剎標(biāo)識
uint8 flag_shw; //水溫傳感器損壞標(biāo)志
uint8 flag_moto; //發(fā)動機(jī)啟動后首先執(zhí)行一次狀態(tài)標(biāo)志
uint8 flag_outtemp;
uint8 flag_outtemp1;
//真空泵電路MOS管判壞
uint8 MOS_flag; //MOS損壞標(biāo)志
uint8 counter8; //MOS管損壞計時
//故障代碼發(fā)送計數(shù)
uint8 counter10;
//故障代碼發(fā)送函數(shù):各模塊發(fā)送標(biāo)志
uint8 DTC_ecu_flag;
//車速傳感器判斷用數(shù)據(jù)
uint16 MG2_rad;//MG2轉(zhuǎn)速
uint8 counter11;//用于車速傳感器損壞計數(shù)
//uint8 chesu_flag;//車速傳感器損壞標(biāo)志位
//碰撞故障代碼判斷用數(shù)據(jù)
uint8 counter12;
uint8 pengzhuang_flag;
//水溫傳感器故障代碼
uint8 shuiwen_flag;
//真空壓力傳感器故障代碼
uint8 zhenkong_flag;
//冷卻水壓過低故障判別用數(shù)據(jù)
uint8 shuiya_flag;
uint8 shuiya_alarm_flag;//用于告警報文中的判斷標(biāo)識位,當(dāng)連續(xù)出現(xiàn)5秒后為有告警
uint8 counter15;//水壓過低告警計時
uint8 counter13;
uint8 counter16;
//CAN通訊故障計數(shù)
//uint8 counter17;
//uint8 CAN_flag;
uint8 flag_lengque;
/****************************************************************************
* 名稱:RstWdt()
* 功能:看門狗喂狗操作。
* 入口參數(shù):無
* 出口參數(shù):無
****************************************************************************/
void RstWdt(void)
{ WDFEED = 0xAA;
WDFEED = 0x55;
}
/****************************************************************************
* 名稱:delay()
* 功能:短軟件延時 0.5ms左右
* 入口參數(shù):dly 延時參數(shù),值越大,延時越久
* 出口參數(shù):無
****************************************************************************/
void delay(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<6000; i++);
}
/****************************************************************************
* 名稱:DelayNS()
* 功能:長軟件延時 5ms左右
* 入口參數(shù):dly 延時參數(shù),值越大,延時越久
* 出口參數(shù):無
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/******************************************************************************
**函數(shù):void Init_T_D_Data(void)
**參數(shù): 無
**返回值:無
**說明:對不同的模塊的故障代碼存儲數(shù)組進(jìn)行必要的指針類型轉(zhuǎn)化,達(dá)到指針對應(yīng)數(shù)組
** 的關(guān)系。
******************************************************************************/
void Init_T_D_Data(void)
{
ecu_array =(pTrouble_prefix)ECU_Array; //主控ECU數(shù)據(jù)轉(zhuǎn)換
pcanData=(pRCV_candata)rec_canData;
}
/*****************************************************************************
**函數(shù):uint8 Storage_Array(Trouble_type type,pTrouble_prefix Array,
** uint16 candata,uint8 n)
**參數(shù): Trouble_type type: 故障的類型
** pTrouble_prefix Array: 參數(shù)數(shù)組的指針
** uint16 candata:要存入的數(shù)據(jù)
** uint8 n :存入數(shù)組的位置
**返回值: :0 :存儲成功
** :1 :存儲失敗
**說明: 用于各個模塊的數(shù)據(jù)存儲,對接收到的不同的數(shù)據(jù)進(jìn)行相應(yīng)模塊的存儲
** 如果模塊故障數(shù)組中存在其中一個故障代碼,就不存儲,不存在并達(dá)到
** 要求的故障代碼就存儲。
******************************************************************************/
void Storage_Array(Trouble_type type,pTrouble_prefix Array,uint16 candata,uint8 n) //查詢故障代碼是否已經(jīng)存在
{
uint8 status=0; //有新的故障碼
uint8 num;
switch(type)
{
case M_ECU:
if(n<=0x09||n==0x29||n==0x30)
{
for(num=1;num<=ecu_no;num++)
{
if(candata==(*(ecu_array+num)).Word) {status=1; break;} //故障代碼已存在
else status=0;
}
if(status==0)
{
ecu_array->Bits.trouble_counter++; //故障代碼個數(shù)+1
ecu_no++;
(*(ecu_array+ecu_no)).Word=candata;
ecu_ch=1; //新故障代碼標(biāo)識
}
}
break;
default :break;
}
}
/*****************************************************************************
**函數(shù):uint8 Delete_Array(Trouble_type type,pTrouble_prefix Array,
** uint16 candata,uint8 n)
**參數(shù): Trouble_type type: 故障的類型
** pTrouble_prefix Array: 參數(shù)數(shù)組的指針
** uint16 candata:要刪除的數(shù)據(jù)
** uint8 n :數(shù)組的位置
**說明: 用于各個模塊的數(shù)據(jù)清除
******************************************************************************/
void Delete_Array(Trouble_type type,pTrouble_prefix Array,uint16 candata,uint8 n) //查詢故障代碼是否已經(jīng)存在
{
uint8 status=0; //有新的故障碼
uint8 num;
switch(type)
{
case M_ECU:
if(n<=0x09||n==0x29||n==0x30)
{
for(num=1;num<=ecu_no;num++)
{
if(candata==(*(ecu_array+num)).Word) //故障代碼已存在
{
ecu_array->Bits.trouble_counter--; //故障代碼個數(shù)-1
for(;num<ecu_no;num++)
{
(*(ecu_array+num)).Word=(*(ecu_array+num+1)).Word;
}
(*(ecu_array+ecu_no)).Word=0;
ecu_no--;
ecu_ch=1;
break;
}
else status=0;
}
}
break;
default :break;
}
}
/*****************************************************************************
**函數(shù):RCV_TD(void)
**參數(shù):無
**返回值:無
**說明:用于接收到的把所有的故障代碼按照不同的類型進(jìn)行存儲到相應(yīng)的數(shù)組中,或者對
故障清除進(jìn)行操作。
*****************************************************************************/
void RCV_TD(void)
{
uint16 candata;
uint8 n;
/**************************故障代碼接收********************************/
if(DTC_flag==1&&DTC_num!=0) //接收故障代碼
{
for(i=0;i<DTC_num;i++)
{
candata=DTC_array[i];
candata=(DTC_type[i]<<8)|candata;
n=DTC_array[i];
switch(DTC_type[i])
{
//主控ECU模塊
case 0x93:
Storage_Array(M_ECU,ecu_array,candata,n);
break;
default: break;
}
}
}
/********************************************************************************/
/******************************故障代碼清除********************************/
else if(DTC_flag==0&&DTC_num!=0) //清除故障代碼
{
candata=DTC_array[0];
candata=(DTC_type[0]<<8)|candata;
n=DTC_array[0];
switch(DTC_type[0])
{
//主控ECU模塊
case 0x93:
Delete_Array(M_ECU,ecu_array,candata,n);
break;
default: break;
}
}
/********************************************************************************/
}
/**********************************2006.11.3添加里程校驗*******************************/
/****************************************************************************
* 名稱:xiaoyan(uint8 *buf3)
* 功能:用來對里程數(shù)據(jù)進(jìn)行寫校驗
* 入口參數(shù):addr:代表要進(jìn)行校驗的數(shù)組的首地址
* 出口參數(shù):無
****************************************************************************/
void xiaoyan(uint8 *buf3)
{
uint16 add1;
uint8 add; //前3位的ADD
uint8 XOR;
if(buf3[0]+buf3[1]>0xFF)
{
add1=buf3[0]+buf3[1]-0xFE;
}
else add1=buf3[0]+buf3[1];
if(add1+buf3[2]>0xFF)
{
add1=add1+buf3[2]-0xFE;
}
else add1=add1+buf3[2];
add=add1; //前3個數(shù)字的和,為第4個數(shù)字
buf3[3]=add;
XOR=buf3[0]^buf3[1];
XOR=XOR^buf3[2];
XOR=XOR^buf3[3];
buf3[4]=XOR;
}
/****************************************************************************
* 名稱:de_xiaoyan(uint8 *buf3)
* 功能:用來對里程數(shù)據(jù)進(jìn)行解校驗
* 入口參數(shù):addr:代表要進(jìn)行校驗的數(shù)組的首地址
* 出口參數(shù):無
****************************************************************************/
uint8 de_xiaoyan(uint8 *buf3)
{
uint8 XOR;
//計算XOR
XOR=buf3[0]^buf3[1];
XOR=XOR^buf3[2];
XOR=XOR^buf3[3];
if(XOR==buf3[4])
{
return (1);
}
else
{
return(0);
}
}
/*******************************2006.12.25添加******************************/
//2007.3.16調(diào)通
/****************************************************************************
* 名稱:void write_eeprom(uint16 Addr,uint16 Data)
* 功能:IO口模擬SPI寫數(shù)據(jù)
* 入口參數(shù):
* 出口參數(shù):
****************************************************************************/
void write_eeprom(uint16 Addr,uint16 Data)
{
uint16 AADDR;
uint32 DDATA;
uint8 m;
uint16 ewen=0x1300;
uint16 ewds=0x1000;
AADDR = Addr & 0x03ff;
AADDR = AADDR|0x1400; //高13位格式
DDATA = AADDR;
DDATA = (DDATA<<16)|Data; //轉(zhuǎn)換為29為格式
DDATA = DDATA<<3; //左移3位,將高位0清除
//寫允許命令
IO1SET = CS;
for(m=0;m<=12;m++)
{
if((ewen & 0x1000)==0x1000)
IO0SET = MOSI0;
else IO0CLR = MOSI0;
IO0CLR = SCK0;
IO0SET = SCK0;
ewen = ewen << 1;
}
IO1CLR = CS;
//數(shù)據(jù)寫入
IO1SET = CS;
for(m=0;m<=28;m++)
{
if((DDATA & 0x80000000)==0x80000000)
IO0SET = MOSI0;
else IO0CLR = MOSI0;
IO0CLR = SCK0;
IO0SET = SCK0;
DDATA = DDATA << 1;
}
IO1CLR = CS;
//寫禁止命令
IO1SET = CS;
for(m=0;m<=12;m++)
{
if((ewds & 0x1000)==0x1000)
IO0SET = MOSI0;
else IO0CLR = MOSI0;
IO0CLR = SCK0;
IO0SET = SCK0;
ewds = ewds << 1;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -