/*-------------------------------------------

程序名称：CCP 捕捉模式程序
日期版本：2018/6/15 <V1.1>

备注：使用时应该保证发生捕捉的时间不超过TMR1计数器的
      的溢出时间。或者使用空间更大的变量类型，通过TMR1IF
	  来判断是否有产生过TMR1溢出以进行补偿。

*本程序由 中微半导体有限公司 &应用支持部& 编写整理
*公司网址 www.mcu.com.cn
*技术支持QQ 3001082102  罗工
            3001085706	陈工
-------------------------------------------*/

#include <cms.h>

//定义选择使用的CCP
#define CCP1_On
//#define CCP2_On

void Set_CCP_Catch();

volatile unsigned int Data1;	//CCP1捕捉事件的时间
volatile unsigned int Data2;	//CCP2捕捉事件的时间


void main()
{
	asm("nop");
	asm("clrwdt");
	
	OSCCON = 0X71;				//8M内部时钟
	
	Set_CCP_Catch();			//CCP捕捉模式初始化
	
	while(1)
	{
		asm("clrwdt");
	}
}
/***********************************************
函数名称：Set_CCP_Catch
函数功能：CCP捕捉模式初始化
入口参数：无
出口参数：无
备注：
************************************************/
void Set_CCP_Catch()
{
	#ifdef CCP1_On
		CCP1IF = 0;				//清除CCP1中断标志
		CCP1IE = 1;				//允许CCP1中断
		
		TRISC |= 0B00000100;	//CCP1为输入口
		
		TMR1L = 0;				//复位Timer1的值(捕捉模式使用Timer1)
		TMR1H = 0;
		
		T1CON = 0B00000001;		//使能Timer1,预分频比1:1			
		CCP1CON = 0B00000110;	//CCP1工作在捕捉模式,每4个上升沿发生捕捉
		INTCON = 0B11000000;	//开启总中断
		
	#else ifdef CCP2_On
		CCP2IF = 0;				//清除CCP2中断标志
		CCP2IE = 1;				//使能CCP2中断
		
		TRISC |= 0B00000010;	//CCP2为输入口
		
		TMR1L = 0;				//复位Timer1的值(捕捉模式使用Timer1)
		TMR1H = 0;
		
		T1CON = 0B00000001;		//使能Timer1,预分频比1:1			
		CCP2CON = 0B00000110;	//CCP2工作在捕捉模式,每4个上升沿发生捕捉
		INTCON = 0B11000000;	//开启总中断
	#endif
}

/***********************************************
函数名称：CCP_Isr
函数功能：CCP中断服务
入口参数：无
出口参数：无
备注：
************************************************/
void interrupt CCP_Isr()
{
	static unsigned int DataTemp1,DataTemp2;
	static bit B_DataFir,B_DataTemp;
	#ifdef CCP1_On
		if(CCP1IF)
		{
			CCP1IF = 0;
			
			if(B_DataFir)
			{
				if(B_DataTemp)
				{
					DataTemp2 = (unsigned int)((CCPR1H << 8) | CCPR1L);
					Data1 = DataTemp2 - DataTemp1;
					B_DataTemp = 0;
				}
				else
				{
					DataTemp1 = (unsigned int)((CCPR1H << 8) | CCPR1L);
					Data1 = DataTemp1 - DataTemp2;
					B_DataTemp = 1;
				}
			}
			else
			{
				DataTemp1 = (unsigned int)((CCPR1H << 8) | CCPR1L);
				B_DataFir = 1;
				B_DataTemp = 1;
			}
		}
	#else ifdef CCP2_On
		if(CCP2IF)
		{
			CCP2IF = 0;
			
			if(B_DataFir)
			{
				if(B_DataTemp)
				{
					DataTemp2 = (unsigned int)((CCPR1H << 8) | CCPR1L);
					Data2 = DataTemp2 - DataTemp1;
					B_DataTemp = 0;
				}
				else
				{
					DataTemp1 = (unsigned int)((CCPR1H << 8) | CCPR1L);
					Data2 = DataTemp1 - DataTemp2;
					B_DataTemp = 1;
				}
			}
			else
			{
				DataTemp1 = (unsigned int)((CCPR1H << 8) | CCPR1L);
				B_DataFir = 1;
				B_DataTemp = 1;
			}
		}
	#endif
}

