/****************************************************************************************
 * 项目用途：演示CCP4（捕捉、比较）外设的捕捉模式、比较模式的用法。
 * 		     这里将捕捉模式用于测量外部PWM波形的周期，占空比、频率，将比较模式用于产生PWM波形。
 * 文件名: main.c
 * 项目名: KF8A100FTN_CCP4
 * 版 本: v1.0
 * 日 期: 2019年08月21日 16时09分57秒
 * 作 者: charles_cai
 * 功能：松开S2按键则进入捕捉模式，P12口初始化为捕捉信号的输入口。
 * 	          例如，可以先用编程器连接开发板，进入硬件仿真环境后，将信号发生器设置为1000Hz、5V、50%的PWM波形输出，连接信号发生器和开发板上的P12脚。
 * 	          点击“继续”按钮，让程序全速运行。中间不可添加断点，添加断点会打断T4定时器清零的时序，导致程序运行结果错误。
 * 	         点击“暂挂”按钮，让程序停止仿真。可以通过查看变量的方式，查看测量的波形频率、周期、以及占空比的值。
 * 	         先按住S2按钮，再上电将导致程序进入比较模式。比较模式下将在，P12引脚输出PWM波形。可以用示波器观察。
 * 注意： CCP4的时钟源是T4定时器。CCP4的比较和捕捉模式，跟CCP3完全一致。
 ****************************************************************************************/
#include"main.h"

volatile unsigned char Flag =0,Mode =0;
volatile unsigned long Duty,Freg,T1_cnt=0,T2_cnt=0;
//主函数
void main()
{
	Init_osc();
	Init_GPIO();
	Init_T4(1);//不用重载模式

	if(S2)//S2按钮松开，CCP4配置为捕捉模式，
	{
		Init_CCP4(0);
	}
	else//S2按钮按下，CCP4配置为比较模式，
	{
		Init_CCP4(1);
		Mode =1;
	}

	Init_intrup();

	while(1)
	{
		if(Flag)//捕捉模式，计算P12脚上输入的PWM的频率、占空比
		{
			Flag =0;
			Duty =T1_cnt*100 /T2_cnt;//计算占空比
			Freg =2000000/T2_cnt;//计算频率=1M/T(us)
		}
	}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
	if(CCP4IF)
	{
		CCP4IF =0;
		if(Mode)//比较模式
		{
			if(P12)//开始输出高电平
			{
				T4ON =0;
				T4H =0;
				T4L =0;
				T4ON =1;

				CCP4H =0x01;
				CCP4L =0xF4;
			}
			else//开始输出低电平
			{
				CCP4H =0x03;
				CCP4L =0xE8;
			}
		}
		else//捕捉模式，计算周期、占空比
		{
			if(P12)//刚捕捉到的是上升沿
			{
				T2_cnt =CCP4H<<8;
				T2_cnt +=CCP4L;

				T4ON =0;
				T4H =0;
				T4L =0;
				T4ON =1;

				CCP4IE=0;
				CCP4CTL =0x04;//捕捉下降沿
				CCP4IF =0;
				CCP4IE =1;
				Flag =1;
			}
			else
			{
				T1_cnt =CCP4H<<8;
				T1_cnt +=CCP4L;
				CCP4IE=0;
				CCP4CTL =0x05;//捕捉上升沿
				CCP4IF =0;
				CCP4IE =1;
			}

		}
	}
}


//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}
