⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int.c

📁 Keil 下编译的基于mcs51单片机的PCA82C250CAN收发器控制的程序源代码。
💻 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 + -