📄 int.c
字号:
//****************************************************************************
// @Module Interrupt Controller
// @Filename INT.C
// @Project
//----------------------------------------------------------------------------
// @Controller Infineon C505C-2R
//
// @Compiler Keil
//
// @Codegenerator DAvE 2-0-0
//
// @Description This file contains all functions that use the IR
//
//
//----------------------------------------------------------------------------
// @Date 01-2-24 12:51:12
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//Author:LiAnChuan //
//All copyrights for this routine are reserved;Unauthorized down loading or //
//other kinds of copying prohibited! //
//////////////////////////////////////////////////////////////////////////////
//****************************************************************************
// @Project Includes
//****************************************************************************
#include "MAIN.H"
#include "INT.H"
#include "CAN.H"
#include "PER.H"
#include "MSGTABLE.H"
//////////////////////////////////////////////////////////////////////////////
//****************************************************************************
// @variable definition
//****************************************************************************
extern unsigned char xdata MsgTrans[20][8]; //message translated buffer
extern unsigned char xdata diagnostic[8];
extern bit ReceivedFlag; //receive ok flag
extern unsigned char xdata * p;
extern unsigned char xdata CANSendCTimer;
////RS232 communication //////////////
extern bit NewReceive;//if a character is received,set this flag
extern unsigned int xdata ReceiveTimer;//receive delay timer between two character
extern unsigned char xdata ReceiveBuffer[RXD_MAX_NUM];//
extern unsigned char xdata SendBuffer[TXD_MAX_NUM];
extern unsigned char xdata ReceiveCounter;
extern unsigned char xdata SendCounter;
extern bit NewCommand;//if a command have been received ,set this flag to indicator
//the command is processing
extern unsigned char xdata SendNumber;//need sending byte number
extern unsigned char xdata SendTimer;
extern bit ReceiveRight;
extern unsigned char xdata RunTime;
extern unsigned char xdata FuelUse;
extern unsigned char xdata RunErrorTimes;
extern unsigned char xdata GateTimer;
//////////////////////////////////////////////////////////////////////////////////
extern unsigned char xdata ADTimer;
extern unsigned char PowerOnTimer;
extern bit PowerOn;
extern float xdata RunMileage;//mileage from engine starting to engine stopping
extern float xdata SingleMileage;//mileage from last clearing
extern float xdata TotalMileage;//total mileage
extern unsigned char xdata MileageTimer;//1s timer for calculating mileage
extern unsigned int xdata SaveTimer;//10min auto save timer
extern bit SaveFlag;//
extern unsigned int xdata SlaveTimer1;//if slave have sent right message clear the timer
extern unsigned int xdata SlaveTimer2;//else if the counter value is more enought ,reset system
extern unsigned char xdata ErrorCodeTimes[30];//error code times,if no error ErrorCodeTimes[]=0
//else ErrorCodeTimes[]++,if ErrorCodeTimes[]>ERROR_TIMES
//set the error bit
extern unsigned int xdata ClearDelayTimer1;//clear error code delay timer
extern unsigned int xdata ClearDelayTimer2;//clear single mileage delay timer
extern unsigned char xdata ClearOnTimer1;//clear switch on times
extern unsigned char xdata ClearOnTimer2;
extern bit ClearErrorFlag;
extern bit ClearMileageFlag;
extern unsigned char T0IntCounter;
extern unsigned char TH0Buffer;
extern unsigned char TL0Buffer;
extern unsigned char T0IntBuffer;
extern unsigned char EX1OffTimer;
extern bit EX1IntFlag;
extern unsigned char Fre2CalTimer;
extern bit Fre2CalFlag;
extern unsigned char Send_count;
extern unsigned char Send_count1;
extern unsigned char Send_count2;
extern unsigned char Send_obj;
extern unsigned char Send_data;
extern bit cantransflag;
//extern unsigned int xdata FuelQTimer;
//extern unsigned int xdata WaterTimer;
//////////////////////////////////////////////////////////////////////////////
void INT_vInit(void)
{
/// ---------- external interrupt 0 ----------
/// enable
EX0 = 1;
IT0=1;
/// ---------- external interrupt 1 ----------
/// disabled
EX1=1;
IT1=1;
ET0=1;
ET2=1;
///----------serial port interrup----------
ES=1;
/// enabled
ECAN=1; //* for C505C *
//IEN2 = 0x02; //* for C515C *
///---------- timer interrupt-----------------
//ET1=1; //enable Timer1 interrupt.
// ET2=1;
///-----------interrupt prioty----------------
///////#########
// IP0 |=0x06;//sirial port is high priority.
// IP1 |=0x10;
IP1 |=0x07;
IP0 |=0x05;
///clear all interrupt requests to prevent unintentional generation of an interrupt
IRCON=0x00;
///-------- globally enable interrupts---------
EA=1;
}
//This is the interrupt service routine for the
//software-interrupt (shared with CAN vector).
void INT_viIsrSwi(void) interrupt CANI
{
unsigned char can_status,int_reg; //define two variables to save CAN status
//register and interrupt register's value;
while(int_reg=IR) //while interrupt identifier(INTID) not zero
{
can_status=SR;
SR=0; //read and reset CAN status.
switch (int_reg)
{
case 1: //--Status and error interrupt--
if (CR&0x04) //SIE=1***********status interrupt*******
{
if(can_status & 0x08) //transmit interrupt
{
;
}
if(can_status & 0x10) //receive interrupt
{
;
}
if(can_status & 0x07) //erroneous transfer
{
;
}
}
if (CR&0x08) //EIE=1************error interrupt*********
{
if(can_status & 0x40) //EWEN has changed
{
// if(ErrorTimes<ERRORTIMES)
// {
// ErrorTimes++;
// }
// else
// {
CAN_vInit(); //initialize CAN controller again
// ErrorTimes=0;
//ErrorFlag=1;
// }
}
if(can_status & 0x80) //BUSOFF has changed
{
// if(ErrorTimes<ERRORTIMES)
// {
// ErrorTimes++;
//}
//else
// {
CAN_vInit(); //initialize CAN controller again
// ErrorTimes=0;
//ErrorFlag=1;
// }
}
}
break;
case 2: //-----Message Object 15 interrupt---------
break;
case 3: //-----Message Object 1 interrupt ----------
set_msg_MCR(1,INTPND,0); //reset INTPND
if(can_status & 0x08) //transmit interrupt
{
;
}
if(can_status & 0x10) //receive interrupt
{
CAN_vStoreMsgObj(2,p);//save the received data to buffer
set_msg_MCR(2,NEWDAT,0); //reset NEWDAT.
// CAN_vStoreID(2,IDArray);//save id inorder to judge whether
ReceivedFlag=1; //indicate that communication is proper.
cantransflag=1;
// ErrorTimes=0;
;
}
break;
case 4: //-----Message Object 2 interrupt ------
set_msg_MCR(2,INTPND,0); //reset INTPND
if(can_status & 0x08) //transmit interrupt
{
;
}
if(can_status & 0x10) //receive interrupt
{
//CAN_vStoreMsgObj(2,p);//save the received data to buffer
//set_msg_MCR(2,NEWDAT,0); //reset NEWDAT.
// CAN_vStoreID(2,IDArray);//save id inorder to judge whether
//the module is exist,but feed back id don't store
// ReceivedFlag=1; //indicate that communication is proper.
//cantransflag=1;
// ErrorTimes=0;
;
}
break;
case 5: //-----Message Object 3 interrupt ------
set_msg_MCR(3,INTPND,0); //reset INTPND
if(can_status & 0x08) //transmit interrupt
{
;
}
if(can_status & 0x10) //receive interrupt
{
CAN_vStoreMsgObj(2,p);//save the received data to buffer
set_msg_MCR(2,NEWDAT,0); //reset NEWDAT.
// CAN_vStoreID(2,IDArray);//save id inorder to judge whether
//the module is exist,but feed back id don't store
ReceivedFlag=1; //indicate that communication is proper.
cantransflag=1;
// ErrorTimes=0;
;
}
break;
case 6: //-----Message Object 4 interrupt ------
set_msg_MCR(4,INTPND,0); //reset INTPND
if(can_status & 0x08) //transmit interrupt
{
;
}
if(can_status & 0x10) //receive interrupt
{
CAN_vStoreMsgObj(2,p);//save the received data to buffer
set_msg_MCR(2,NEWDAT,0); //reset NEWDAT.
// CAN_vStoreID(2,IDArray);//save id inorder to judge whether
//the module is exist,but feed back id don't store
ReceivedFlag=1; //indicate that communication is proper.
cantransflag=1;
// ErrorTimes=0;
;
}
break;
case 7: //-----Message Object 5 interrupt ------
set_msg_MCR(5,INTPND,0); //reset INTPND
if(can_status & 0x08) //transmit interrupt
{
;
}
if(can_status & 0x10) //receive interrupt
{
// CAN_vStoreMsgObj(2,p);//save the received data to buffer
//set_msg_MCR(2,NEWDAT,0); //reset NEWDAT.
// CAN_vStoreID(2,IDArray);//save id inorder to judge whether
//the module is exist,but feed back id don't store
//ReceivedFlag=1; //indicate that communication is proper.
//cantransflag=1;
// ErrorTimes=0;
;
}
break;
default :
break;
}
}
}
void INT_T2(void) interrupt TIMER2 //20ms interrupt once
{
TF2=0; //initial count value
TH2=T2_TH;
TL2=T2_TL;
if(SendTimer<0xff)
{
SendTimer++;
}
if(ADTimer!=0)
{
ADTimer--;
}
if(PowerOnTimer<50)
{
PowerOnTimer++;
}
else
{
PowerOn=1;
}
if(MileageTimer!=0)
{
MileageTimer--;
}
// if(SlaveTimer1<1000)
// {
// SlaveTimer1++;
// }
// else
// {
// SlaveTimer1=0;
// if(PowerOn)
// {
// ;//for(;;);
// }
// }
//
// if(SlaveTimer2<1000)
// {
// SlaveTimer2++;
// }
// else
// {
// SlaveTimer2=0;
// if(PowerOn)
// {
// ;//for(;;);
// }
// }
if(ClearDelayTimer1!=0)
{
ClearDelayTimer1--;
}
if(ClearDelayTimer2!=0)
{
ClearDelayTimer2--;
}
if(ClearErrorFlag)
{
if(ClearOnTimer1<50)
{
ClearOnTimer1++;
}
}
if(ClearMileageFlag)
{
if(ClearOnTimer2<50)
{
ClearOnTimer2++;
}
}
if(EX1OffTimer!=0)
{
EX1OffTimer--;
}
else
{
EX1=1;
IT1=1;
}
if(Fre2CalTimer!=0)
{
Fre2CalTimer--;
}
Send_count2++;
if(Send_count2>50)
{
Send_count2=0;
cantransflag=0;
}
//=================CAN总线数据发送
Send_count++;
if(Send_count>4)
{
Send_count=0;
}
Send_count=0;
if (Send_count==0)//20ms发送一次
{ Send_obj=1;
Send_data=_C_111XM;}
else if (Send_count==1)
{ Send_obj=3;
Send_data=_C_111XM+1;}
else if (Send_count==2)
{ Send_obj=4;
Send_data=_C_111XM+2;}
else if (Send_count==3)
{ Send_obj=5;
Send_data=_C_111XM+3;}
else if (Send_count==4)
{ Send_obj=6;
Send_data=_C_111XM+4;}
if(CAN_bRequestMsgObj(Send_obj))
{ Send_count1++;
if(Send_count1>6)
{
Send_count1=1;
}
CAN_vConfigMsgObj(Send_obj,Send_data,MsgTrans[Send_count1]); //load data to the message object
CAN_vTransmit(Send_obj); //request transmit.
}
//===================CAN总线数据发送程序结
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -