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

📄 ect.c

📁 使用MC9S12DG128芯片
💻 C
字号:
#include "includes.h"

// 当检测到上升或下降边的时候执行的函数
void (*PAI_FUNC)(void) = NULL;

// 当PACN3溢出的时候执行的函数
void (*PAOVI_FUNC)(void) = NULL;

INT32U TimeLevel = 0;

INT32U CarDistance = 0;

//static INT16U DisNum = 0; 

INT16U CurrentTime = 0;

INT16U tc1_counter = 0;

INT16U tc1_counter2 = 0;

INT16U tc1_counter3 = 0;


INT16U tc3_counter = 0;

INT16U tc3_counter2 = 0;

INT16U TimeCount3 = 40;

INT8U  AngleFlag = OFF;

INT32S  CarLocation = 0;

INT8U  MDirect = Front;

INT8U  CarStop = ON;

INT8U  StopTime = 0x00;

INT32U  TempLocation;

INT16U  Burst = 0 ;

INT32U  TimeLevel2 = 0;

INT32U  TimeLevel3[100] ;

INT16U  DebugAngle[800];

INT16U   DebugNum = 0;

 




/***********************************************************************************/

/*void test_tc1_func(void) {
	PORTB++;
	//REV_BYTE(PORTB);	
}  */




void Test_PAI_FUNC() {
	// 所得的值放在PACN2 & PACN3 中
	PORTB = PACN3 ;
}

void Test_PAOVI_FUNC() {

	PORTB = 0xAA;
	
}





void ECT_Func(void) {



/***************************************   //使用TC1做输出,使用中断方式 
  DDRB = 0xFF;	
	
	PORTB = 0xaa;
		
	InitTC1(test_tc1_func);
	
  StartTC1();
	
	//Wait(2010);
	
	//StopTC1();   
****************************************/  

/***************************************	 //使用TC3做输入,脉冲累加,使用中断方式
	
	DDRB = 0xFF;
	
	PORTB = 0xA5;
	
	PAI_FUNC = Test_PAI_FUNC;	
	
	//PAOVI_FUNC = Test_PAOVI_FUNC;
	
	InitTC3(); 	
****************************************/

INT8U LcdECT[] = {"Now Display the Function Of ECT "};
  
  DDRB = 0xFF;
	
	PORTB = 0xA5;                             //使用PA(也就是TC7引脚)做16bit的脉冲累加,使用中断方式,需要计算出高或者低电平的时间
	
	PAI_FUNC = Test_PAI_FUNC;	
	
	//PAOVI_FUNC = Test_PAOVI_FUNC;
	
	InitPA(); 
	
	InitTOF();	
	
	ClearPA();
	
	StartPA();
	
	for(;;) {
      
      LcdWriteAll(LcdECT);        //display PWM menu
      
      while (KeyFlag == ON) {
        
         KeyFlag = OFF;
        
         if (ValueKey == Exit) return;    //if have exit key,go back
        
       }
    }

	
  
}




/***********************************************************************************
Timer Input Capture/Output Compare
***********************************************************************************/

/***********************************************************************************
  定时器模块1 用作输出比较 产生一定周期的中断事件
************************************************************************************/
//INT16U tc1_counter = 0;

//INT16U CurrentTime = 0;

// 当时间到的时候所执行的函数指针
void (* TC1OC_FUNC)(void) = NULL;

INT8U Tc105Flag = ON;

#pragma CODE_SEG __NEAR_SEG NON_BANKED

ISR TC1_ISR(void) {// 3 * 53333 产生一个 约20ms的中断
	

	
	if(++tc1_counter == 400) {          //40为0.1秒  //400为1秒
	
		tc1_counter = 0;
		
		CurrentTime++;
		
	}
	
	if(++tc1_counter2 >= 40) {          //40为0.1秒  //400为1秒
	
	//	DebugAngle[0] = ReadADC(0);
		
		if (Tc105Flag == ON) { tc1_counter2 = 0;TempLocation = CarLocation ;Tc105Flag = OFF;} 
		
		else {		  
		
		tc1_counter2 = 0;
		
		if (CarLocation == TempLocation) {CarStop = ON;} 
		
		else  {CarStop = OFF;}
		
		Tc105Flag = ON;
		
		}
	}
	    
/*	if(++tc1_counter3 >= 4)
	{
	   tc3_counter = 0;
		  
		 DebugAngle[DebugNum] = ReadADC(0);
		 
		 DebugNum ++;
		 
		 if (DebugNum == 790) {
		  FOREVER();
		 }  
		  
	}   */
  
	     
	  

	  		
		

	
	
                
	TFLG1_C1F = 1;    // 清除标志
	
	//TFLG2_TOF = 1;
	
//	TC1 -= 12202;//相当于:
    //TC1 = 0;  
  
    TC1 += 60000;
} 


/****************************************/
#pragma CODE_SEG DEFAULT  
void InitTC1(void) {
	
	EnableInterrupts;
	
	tc1_counter = 0;
	
	//TC1OC_FUNC = tc1oc_func;
	
	TIOS_IOS1 = 1;// 设为输出比较
	
	//TCTL2_OL1 = 0;// 
	
	//TCTL2_OM1 = 0;
	
	TFLG1_C1F = 1;// 先置标,StartTCx后在开始
	
	TSCR1_TEN = 1;// 使能计时器	
	
//	FOREVER();
}

/*****************************************/


void StartTC1(void) {
	
	TFLG1_C1F = 0;//清除标志	
	
	//TSCR2_TOI = 1;
	
	TIE_C1I = 1;//使能中断			
}
/***************************************/

void StopTC1(void) {
	
	TFLG1_C1F = 1;//清除标志
	
	TIE_C1I = 0;//禁用中断			
}

/****************************************/

/******************************************************************************
  hPA.c  
  脉冲累加计数器----8bit
******************************************************************************/


INT16U EqualAngle = 625;

INT8U EqualFlag = 0;

INT16U TempAngle1 = 0;

INT16U TempAngle2 = 0;

INT16U TempAngle3 = 0;

INT16U EqualAccess = 0;

INT16U UpFlag = 0;






//BalanceAngle 是水平值,开机检测

#pragma CODE_SEG __NEAR_SEG NON_BANKED

ISR TC3_ISR(void) {
  
    /*if(PAI_FUNC != NULL) {		
  
    PAI_FUNC();
  
    	//if (PORTB = 0xff) PORTB = 0;
    
      //TCTL4_EDG3A = 1;     //检测下降沿
  
      //TCTL4_EDG3B = 1;
      
      TFLG1_C3F = 1;
    } */
    
      AngleFlag = OFF;
    
    	if(++tc3_counter >= TimeCount3) {          //40为0.1秒  //400为1秒
	
		  tc3_counter = 0;
		  
		  AngleFlag = ON;
    	
   	}
		 
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd		 
		 
      
    
      
    

   
	         
	    
		  
		    
		  



		    
		    


	
                
  	TFLG1_C2F = 1;    // 清除标志
	
	//TFLG2_TOF = 1;
	
//	TC1 -= 12202;//相当于:
    //TC1 = 0;
    TC2 = 0;  
  
    TC2 += 60000;
    
   // FOREVER();
	
}

/***************************************/

#pragma CODE_SEG DEFAULT  

void StartTC3(void) {
	
	TFLG1_C2F = 0;//清除标志	
	
	//TSCR2_TOI = 1;
	
	TIE_C2I = 1;//使能中断			
}
/***************************************/

void StopTC3(void) {
	
	TFLG1_C2F = 1;//清除标志
	
	TIE_C2I = 0;//禁用中断			
}
 

/******************************/

        //TC3脉冲输入捕获初始化
/* 初始化脉冲累加计数器 */
void InitTC3(){	  	

//	EnableInterrupts;

  /*TSCR1_TEN = 1;

  TIE_C3I = 1;

  TCTL4_EDG3A = 1;  

  TCTL4_EDG3B = 0;

  ICPAR_PA3EN = 1;    */
  
  EnableInterrupts;
	
	tc3_counter = 0;
	
	//TC1OC_FUNC = tc1oc_func;
	
	TIOS_IOS2 = 1;// 设为输出比较
	
	//TCTL2_OL1 = 0;// 
	
	//TCTL2_OM1 = 0;
	
	TFLG1_C2F = 1;// 先置标,StartTCx后在开始
	
	TSCR1_TEN = 1;// 使能计时器	
  
  

	
}





/************************************************************************************
PACB.c
16bit的输入捕获 使用TC7口
************************************************************************************/


INT8U PaFlag = 0 ;

INT8U NumTCNT = 0;

INT16U Temp1TCNT = 0;

INT16U Temp2TCNT = 0;

/******************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED

ISR PAI_ISR(void) {

    //if(PAI_FUNC != NULL) {		

    //	PAI_FUNC();
    
      Temp1TCNT = TCNT;      //store the TCNT value immediately
    
      if (PaFlag == 0) {PACTL_PEDGE = 1;PaFlag = 1;Temp2TCNT = Temp1TCNT; NumTCNT = 0; } 
    
      else {
    
      PACTL_PEDGE = 0;
      
      PaFlag = 0;
      
      if (Temp1TCNT > Temp2TCNT) { TimeLevel = (NumTCNT * 65536  + (Temp1TCNT - Temp2TCNT));}
              
      else if (Temp1TCNT == Temp2TCNT) { TimeLevel = NumTCNT * 65536;} 
      
      else {
              
        NumTCNT -= 1; 
        
        TimeLevel2 = TimeLevel;
      
        TimeLevel = (NumTCNT * 65536 + (65535 - Temp2TCNT + Temp1TCNT));
        
        
      
      }
      
      NumTCNT = 0;   
    
    }
    
   //TimeLevel3[DebugNum] = TimeLevel;
   
  // DebugNum++;
   
//   if (DebugNum == 99) DebugNum = 0;
    
  //if (PAC == 0xFFFF) {DisNum++;PAC = 0;} 
  
  //CarDistance = ((DisNum * 65536) + PAC) ;
  
 //ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
 
/* if(SmartOver == ON)
 
 {
   
   //if (TimeLevel < TimeLevel2){
   
    if (TimeLevel < 45000)  {
      
      StopMoto();
      
      //SmartMoto(-20);
      
      DDRB = 0xFF;
      
      PORTB = 0xFD;
      
      SmartOver = OFF;
      
      
    }
   
   }    */
   
 //}
  
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
 CarDistance++;
  
 if (MDirect==Front) CarLocation++; 
  
 else { CarLocation--;}
    
  // 注意:要清楚标志位
	PAFLG_PAIF = 1;
	
} 
/******************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED

ISR PAOVI_ISR(void) {
	
	if(PAOVI_FUNC != NULL) {
	   
	    PAOVI_FUNC();
	}
	
	PAFLG_PAIF = 1;	 
	
		  
} 

/******************************************/
#pragma CODE_SEG DEFAULT
/* 初始化脉冲累加计数器 */
void InitPA(){	  	
	
	EnableInterrupts;

	// 打开默认设置的中断
	PACTL = PACTL_DEFAULT;
	
//	PACTL_PAMOD = 0;
	
//	PACTL_PEDGE = 0;
}


/************************************************************************************
TOF.c
16bit总定时器,当TCNT溢出,发生中断
************************************************************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED

ISR TOF_ISR(void) {
  
      NumTCNT++;
      
      TFLG2_TOF = 1;
}

/****************************************/

#pragma CODE_SEG DEFAULT

void InitTOF() {

  TSCR1_TEN = 1;
  
  TSCR2_TOI = 1;
  
}



	


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -