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

📄 massint.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 C
字号:
/*
*********************************************************************************************************
*                                              Microchip PIC24FJ
*                                            Board Support Package
*
*                                                   Micrium
*                                    (c) Copyright 2005, Micrium, Weston, FL
*                                              All Rights Reserved
*
*
* File : MassInt.C
* By   : //tbh080522
*********************************************************************************************************
*/

#include <includes.h>


#define SET_PWM(ocrs,pwm_set) \
	if(ocrs+CNT_OCRS_STEP<pwm_set) \
		ocrs=ocrs+CNT_OCRS_STEP; \
	else if(ocrs>pwm_set+CNT_OCRS_STEP)\
		ocrs=ocrs-CNT_OCRS_STEP;\
	else if(ocrs!=pwm_set)\
		ocrs=pwm_set


INT16U  TimeCnt=0x0000;

//每AD通道的計算變量
static INT32U  An0ValSum=0x00000000,An1ValSum=0x00000000,An2ValSum=0x00000000,An3ValSum=0x00000000;
//計算AD值時的Dma中斷計數
static INT8U   DmaIntNum=0x00;
//每AD通道的計算值
INT16U  An0Val=0x0000,An1Val=0x0000,An2Val=0x0000,An3Val=0x0000;
//定时器2溢出计数,用于计算各捕获信号的周期
INT8U IC1T2OverCnt=0xFF,IC2T2OverCnt=0xFF,IC3T2OverCnt=0xFF,IC4T2OverCnt=0xFF;
//出退计数,升降计数
INT8U IC3Cnt=0xFF,IC4Cnt=0xFF;

INT8U PWMCnt=0x0000;
INT16U TatakiPwmSet=0x0000,UpPwmSet=0x0000,DownPwmSet=0x0000,MomiCwPwmSet=0x0000,MomiCcwPwmSet=0x0000,FrontPwmSet=0x0000,BackPwmSet=0x0000,TestPwmSet=0x0000;
//INT16U OC1RSSet,OC2RSSet,OC3RSSet,OC5RSSet,OC6RSSet,OC7RSSet,OC8RSSet,OC4RSSet;

INT16U Time10msCnt1=0x0000,Time10msCnt2=0x0000;
INT8U DlyStat=0;

void Timer1_ISR_Handler (void)
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e

    UdStatusContrel();   //升降马达状态控制函数
    FbStatusContrel();   //前后马达状态控制函数
	
	if(++TimeCnt>=10)
	{
		
#ifdef USER_DEBUG

		
#endif			
		TimeCnt=0;
	    //_RF13^=1;//test080521
	    _RG12^=1;//test080521
	}
	
    
    OS_EXIT_CRITICAL();//tbh080627
}

void Timer2_ISR_Handler (void)
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
	if(IC1T2OverCnt<0xFF)
		IC1T2OverCnt++;
	if(IC2T2OverCnt<0xFF)
		IC2T2OverCnt++;
	if(IC3T2OverCnt<0xFF)
		IC3T2OverCnt++;
	if(IC4T2OverCnt<0xFF)
		IC4T2OverCnt++;
    
    OS_EXIT_CRITICAL();//tbh080627
}

//PWM周期中断处理,实现各PWM设置的缓变过程
void Timer3_ISR_Handler (void)
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
	if(++PWMCnt>=CNT_PWM_NUM)
	{
		PWMCnt=0;
		
        SET_PWM(SFR_OCRS_TATAKI,TatakiPwmSet);
        
		if(SFR_OCRS_BACK==0x0000) 
		{
        	SET_PWM(SFR_OCRS_FRONT,FrontPwmSet);
        }
		if(SFR_OCRS_FRONT==0x0000) 
		{
        	SET_PWM(SFR_OCRS_BACK,BackPwmSet);
        }
        
		if(SFR_OCRS_MOMICCW==0x0000) 
		{
        	SET_PWM(SFR_OCRS_MOMICW,MomiCwPwmSet);
    	}
		if(SFR_OCRS_MOMICW==0x0000) 
		{
        	SET_PWM(SFR_OCRS_MOMICCW,MomiCcwPwmSet);
        }
        
		if(SFR_OCRS_DOWN==0x0000) 
		{
        	SET_PWM(SFR_OCRS_UP,UpPwmSet);
        }
		if(SFR_OCRS_UP==0x0000) 
		{
        	SET_PWM(SFR_OCRS_DOWN,DownPwmSet);
        }
        
        SET_PWM(SFR_OCRS_TEST,TestPwmSet);
        
//		if(OC6RS==0x0000) 
//		{
//			if(OC5RS+CNT_OCRS_STEP<MomiCwPwmSet) 
//				OC5RS=OC5RS+CNT_OCRS_STEP; 
//			else if(OC5RS>MomiCwPwmSet+CNT_OCRS_STEP) 
//				OC5RS=OC5RS-CNT_OCRS_STEP; 
//			else if(OC5RS!=MomiCwPwmSet) 
//				OC5RS=MomiCwPwmSet;
//    	}    
//		if(OC5RS==0x0000) 
//		{
//			if(OC6RS+CNT_OCRS_STEP<MomiCcwPwmSet)
//				OC6RS=OC6RS+CNT_OCRS_STEP; 
//			else if(OC6RS>MomiCcwPwmSet+CNT_OCRS_STEP) 
//				OC6RS=OC6RS-CNT_OCRS_STEP; 
//			else if(OC6RS!=MomiCcwPwmSet) 
//				OC6RS=MomiCcwPwmSet;
//		}	
		
	    _RF13^=1;//test080521
	}
	
    OS_EXIT_CRITICAL();//tbh080627
}

//10ms定时器
void Timer7_ISR_Handler (void)
{
	//tbh080627b
//#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
//    OS_CPU_SR  cpu_sr = 0;
//#endif
//	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e

//    UdStatusContrel();   //升降马达状态控制函数
//    FbStatusContrel();   //前后马达状态控制函数
    
//    OS_EXIT_CRITICAL();//tbh080627
}

void Mass_RxISRHandler (void)
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
    RecvServer(U1RXREG);	
	
    OS_EXIT_CRITICAL();//tbh080627
}

void Mass_TxISRHandler (void)
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
    SendServer();
	
    OS_EXIT_CRITICAL();//tbh080627
}

INT16U  An0Buf,An1Buf,An2Buf,An3Buf;
void Mass_ADC1ISRHandler (void)
{
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	
}

#define A_DMA_NUM (1<<CNT_AN_DMA_WORDS_ORDER)

#ifdef USER_DEBUG

INT16S  An0Cur=0x0000,An1Cur=0x0000,An2Cur=0x0000,An3Cur=0x0000;
extern INT8U Rest;
#endif

void Mass_DMA0ISRHandler (void)
{
    INT8U i;
    INT16U *dma_addr=AdDmaSpace,ad_num;
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
    _RB10^=1;
    //An0Buf=*(INT16U*)((INT8U*)&_DMA_BASE+DMA0STA);
    for(i=0;i<A_DMA_NUM;i++)
    {
        An0ValSum+=*(dma_addr++);
    }
    for(i=0;i<A_DMA_NUM;i++)
    {
        An1ValSum+=*(dma_addr++);
    }
    for(i=0;i<A_DMA_NUM;i++)
    {
        An2ValSum+=*(dma_addr++);
    }
    for(i=0;i<A_DMA_NUM;i++)
    {
        An3ValSum+=*(dma_addr++);
    }
    DmaIntNum++;
    ad_num=DmaIntNum*A_DMA_NUM;
    if(ad_num>=CNT_AN_COL_NUM)
    {
    	An0Val=An0ValSum/ad_num;
    	An1Val=An1ValSum/ad_num;
    	An2Val=An2ValSum/ad_num;
    	An3Val=An3ValSum/ad_num;
    	An0ValSum=0x00000000;
    	An1ValSum=0x00000000;
    	An2ValSum=0x00000000;
    	An3ValSum=0x00000000;
    	DmaIntNum=0x00;
#ifdef USER_DEBUG
        if(++Rest>=100)
        {           
        	Rest=0x00;
        }
#endif
        
    }
	
    OS_EXIT_CRITICAL();//tbh080627
}

void Mass_TatakiPrdISRHandler (void)//IC1,Pin68,M1Sensor
{
}

void Mass_UpDownPrdISRHandler (void)//IC4,Pin71,MS14Sensor
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
    if(IC4Cnt < 0xff)
    {
        IC4Cnt ++;
    }
	
    OS_EXIT_CRITICAL();//tbh080627
}

void Mass_FrntBckPrdISRHandler (void)//IC3,Pin70,MS5Sensor
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
    if(IC3Cnt < 0xff)
    {
        IC3Cnt ++;
    }
	
    OS_EXIT_CRITICAL();//tbh080627
}

void Mass_MomiPrdISRHandler (void)//IC6,Pin80,MS6Sensor
{
}

void Mass_IC2ISRHandler(void)
{
}

void Mass_IC5ISRHandler(void)
{
}

void Mass_IC7ISRHandler(void)
{
}

void Mass_IC8ISRHandler(void)
{
}

INT8U Limit_U,Limit_D,Limit_F,Limit_B; 

void SetLimit(void)
{
    if(MS10Sensor == 0)//shang
    {
       Limit_U = 1;
       MassStat.MassPart=CNT_UD_BACE;//更新运行部位状态
       UpPwmSet = 0;
    }
    else
    {
       Limit_U = 0;
    }
    if(MS13Sensor  == 0)//xia
    {
        Limit_D = 1;
        MassStat.MassPart=CNT_UD_LIMIT;//更新运行部位状态
        DownPwmSet = 0;
    }
    else
    {
        Limit_D = 0;
    }
    if(MS2Sensor == 0) //前
    {
         Limit_F = 1;
         MassStat.FrontLmit=1;
         FrontPwmSet = 0;
    }
    else
    {
        Limit_F = 0;
        MassStat.FrontLmit=0;
    }
    if(MS3Sensor == 0)//后
    {
        Limit_B = 1;
        MassStat.BackLmit=1;
        BackPwmSet = 0;
    }    
    else
    {
        Limit_B = 0;
        MassStat.BackLmit=0;
    }
}

void CN_ISR_Handler  (void)
{
	//tbh080627b
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif
	OS_ENTER_CRITICAL();//禁止中断处理时进入其它中断,可以有效节省被中断任务的堆栈空间
	//tbh080627e
	
    Momi_Wide ();
    
    SetLimit();
	
    OS_EXIT_CRITICAL();//tbh080627
}  

⌨️ 快捷键说明

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