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

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

#include "AD18F06A.h"
#include <stdio.h>
#include "common.h"
#include "usart.h"
/******************************************************************************
* 常用配置字功能说明：
*
* _FINTOSC_DIV1_1L  :  内部时钟分频选择
* _LVREN_ON_1L      :  使能LVR
* _LVR24V_1L        ： 选择LVR电压为2.4V
* _DBG_OFF_2L       :  禁用DEBUG模式（使能后将固定PA2和PA3为DEBUG_IO）
* _FLASH_CP3_OFF_2L :  3K*16~4K*16 FLASH保护位，保护后不可擦写(仅CBP为1时有效)
* _FLASH_CP2_OFF_2L ： 2K*16~3K*16 FLASH保护位，保护后不可擦写(仅CBP为1时有效)
* _FLASH_CP1_OFF_2L ： 1K*16~2K*16 FLASH保护位，保护后不可擦写(仅CBP为1时有效)
* _FLASH_CP0_OFF_2L ： 0k   ~1K*16 FLASH保护位，保护后不可擦写(仅CBP为1时有效)
* _CRYLEN_OFF_2L    ： 禁用外部低速时钟
* _CRYHEN_OFF_2L    ： 禁用外部高速时钟
* _IDIS_OFF_2L      ： 模拟IO打开，读取IO数据始终为0(模拟IO关闭，IDIS位对读取IO输入无影响)
* _CKSUM_OFF_2L     ： 使能程序校验
* _CBP_OFF_2L       :  禁用代码加密
* _RESETE_OFF_2L    ： 禁用外部复位
* _RSEL_LOW_2L      ： 端口上拉电阻为190KΩ，下拉电阻为300KΩ
* _STV_ON_2L        ： 使能堆栈溢出复位
* _PSUT_1_3L        ： 选择上电复位时间为1.43ms
* _FCPU_4T_3L       ： 选择指令周期为4T模式
* _WDTEN_OFF_3L     ： 使能看门狗
* _TWDT_000_3L      :  选择看门狗溢出时间为128.4ms
* _OSCM_HIRC_16M_4L ： 选择内部高速时钟16MHz
* _FCMEN_OFF_4L     ： 系统时钟失效监测使能位
* _IESO_OFF_4L      ： 禁用双速启动模式（仅在系统时钟为外部晶振模式时有效）
* _ADCSP_ON_4L      ： 选择ADC采集为高速模式
*
* 注意：1.配置字若无特别需求请勿修改；
*       2.其他配置字及相应功能见Datasheet及头文件；
*
******************************************************************************/

__CONFIG(1,_FINTOSC_DIV1_1L   & _LVREN_ON_1L       & _LVR24V_1L                                                                                          );
__CONFIG(2,_FLASH_CP7_OFF_2L  & _FLASH_CP6_OFF_2L  & _FLASH_CP5_OFF_2L   & _FLASH_CP4_OFF_2L   & _FLASH_CP3_OFF_2L
         & _FLASH_CP2_OFF_2L  & _FLASH_CP1_OFF_2L  & _FLASH_CP0_OFF_2L   & _CRYLEN_OFF_2L      & _CRYHEN_OFF_2L
  	     & _IDIS_ON_2L        & _CKSUM_OFF_2L      & _CBP_OFF_2L         & _RESETE_OFF_2L      & _RSEL_LOW_2L     & _STV_ON_2L              	         );
__CONFIG(3,_DBG_OFF_3L        & _PSUT_8_3L         & _FCPU_4T_3L         & _WDTEN_OFF_3L       & _TWDT_011_3L                                            );
__CONFIG(4,_OSCM_HIRC_16M_4L  &_ENVDDL_ON_4L      & _EEDIS_OFF_4L       & _FLDIS_OFF_4L       & _FCMEN_OFF_4L    & _IESO_OFF_4L&  _DBGS_IOSEL_1_4L      );


volatile unsigned int flag_sec = 0;
volatile unsigned char  flag = 0,ERRO;
volatile unsigned int  Temp1,Temp2,Count_Value;
/*
//Funtion   : PB2作为信号输入IO,采集时间为100ms,通过PB0打印T1计数器的数值

*/

void main (void)
{
	GPIO_Init();       //IO初始化
	PB2PD  = 0;
	TRISB2 = 1;        //T1CKI_PB2输入模式
	TRISD5 = 0;		   //PD5输出模式

	usart0_init();

    timer1_Init();    //TIMER1初始化为计数器
	timer0_Init();    //TIMER0定时500us
	printf("AD18F06A timer1 count test\r\n");
	GIE = 1;          //开总中断
	while(1)
	{
		if(flag == 1)
		{
			Temp2 = (TMR1H<<8 | TMR1L);
			GIE = 0;                            //关闭总中断
			flag = 0;
			 if(ERRO)
			{
				printf("ERROR_max!!\r\n");               //输入频率超过最大值
			}
			 else
			{
				Count_Value = Temp2;
				printf("Count_Value= %u\r\n",Count_Value);//串口打印数据
			}
            TMR1L = 0X00;
            TMR1H  = 0X00;                                   //清除，为下次计数做准备
            ERRO  = 0;
            GIE = 1;                              //开启总中断
	   }
	}
}

//高优先级中断服务函数
void interrupt ISR_h(void)
{
	//进入中断后系统自动关闭中断
	if((TMR1IE == 1)&&(TMR1IF == 1))         //50mS内计数值大于65535，则进入此中断
	{
		TMR1IF = 0;
		TMR1H = 0X00;
		TMR1L = 0X00;
		ERRO = 1;
		PD5 =~ PD5;
	}

	if(TMR0IE == 1 && TMR0IF == 1)           //1MS产生1次中断
	{
   	  TMR0IF = 0;
      flag_sec++;	                       //清除Timer0中断标志位
	  if(flag_sec>=100)						//每100ms标志置1
	  {
        flag_sec = 0;
        flag=1;
	  }
	}
}
//低优先级中断服务函数
void interrupt low_priority ISR_l (void)
{
//进入中断后系统自动关闭中断
}

