#include	<xc.h>
#include	<stdlib.h>

__CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF );			
__CONFIG( WRT_OFF & VCAPEN_OFF & PLLEN_OFF & STVREN_OFF & BORV_HI & LVP_OFF );

#define	_XTAL_FREQ	8000000 /* 蜍穂ス懷捉豕「謨ー : 8MHz */ 

void	initializePort( void );
void	initializePWM( void );
void	initializeAD( void );

void	main( void )
{
	int	ad_value, duty;	/* AD螟画鋤蛟、�轡uty豈� */

	/* 蛻晄悄險ュ螳� */
	OSCCON	= 0b01110010;	/* 蜀�Κ繧ェ繧キ繝ャ繝シ繧ソ 8MHz PLL OFF */
	initializePort();		/* 繝昴�繝亥�譛溯ィュ螳� */
	initializePWM();		/* PWM蛻晄悄險ュ螳� */
	initializeAD();			/* ADC蛻晄悄險ュ螳� */

	while( 1 ){
		GO_nDONE	= 1;		/* AD螟画鋤髢句ァ�*/ 
		while( GO_nDONE );		/* AD螟画鋤螳御コ�セ�■ */ 
		ad_value	= ADRESH;	/* ad_value縺ォAD螟画鋤縺ョ邨先棡繧剃ソ晏ュ�  */

		if( (ad_value > 123) && (ad_value < 133) ){ /* 2.4[V] < Vref < 2.6[V] ? */ 
			CCPR1L	= 0;	CCPR2L	= 0;	/* 荳。繝ャ繝�げ繧偵Ο繝シ繧オ繧、繝�100%縺ォ */ 
		}else{
			duty	= abs( (ad_value - 128) * 100 / 128 ); /* Duty豈納%]繧定ィ育ョ� */ 

			/////// 霑ス蜉� //////
			if( duty > 95 ){ duty	= 95; } /* Duty豈斐r95%縺ォ蛻カ髯� */
			/////// 霑ス蜉�邨ゅo繧� //////

			if( ad_value < 128 ){ /* 2.5[V} < Vref ? */ 
				CCPR1L	= 0;	/* 蟾ヲ繝ャ繝�げ繧偵Ο繝シ繧オ繧、繝�100%縺ォ */ 
				CCPR2L	= PR4 * duty / 100; /* 蜿ウ繝ャ繝�げ繧定ィ育ョ励@縺櫂uty豈斐〒繝峨Λ繧、繝� */ 
			}else{
				CCPR1L	= PR2 * duty / 100; /*蟾ヲ繝ャ繝�げ繧定ィ育ョ励@縺櫂uty豈斐〒繝峨Λ繧、繝� */ 
				CCPR2L	= 0;	/* 蜿ウ繝ャ繝�げ繧偵Ο繝シ繧オ繧、繝�100%縺ォ */ 
			}
		}
	}
}

void	initializePort( void )
{
	PORTA = 0x00; LATA = 0x00; ANSELA = 0x00; TRISA = 0x00;
	PORTB = 0x00; LATB = 0x00; ANSELB = 0x00; TRISB = 0x00;
	PORTC = 0x00; LATC = 0x00; TRISC = 0x00;
	PORTE = 0x00; LATE = 0x00; TRISE = 0x00;
}


void	initializePWM( void )
{
	CCPTMRS0	= 0b00000100; /* 繧ソ繧、繝槭�蜑イ繧雁ス薙※繧定ィュ螳� PWM繝「繧ク繝・繝シ繝ォ1:繧ソ繧、繝�2 PWM繝「繧ク繝・繝シ繝ォ2:繧ソ繧、繝�4 */ 

	/* 蟾ヲ繝ャ繝�げ險ュ螳� */
	TRISC2	= 1;	TRISB2	= 1;	/* PWM蜃コ蜉帙�繝シ繝医r荳€譌ヲOFF */
	PR2		= 125;					/* PWM蜻ィ豕「謨ー : 1kHz */
	CCPR1L	= 0;					/* Duty繧�0%縺ォ */
	CCP1CON	= 0b10011100;			/* PWM繝「繧ク繝・繝シ繝ォ1繧丹N */
	T2CON	= 0b00000110;			/* 繧ソ繧、繝�2繧丹N 繝励Μ繧ケ繧ア繝シ繝ゥ:16 */
	PWM1CON	= 0b00000100;			/* 繝�ャ繝峨ち繧、繝�繧定ィュ螳� 2[us]*/ 
	TRISC2	= 0;	TRISB2	= 0;	/* PWM蜃コ蜉帙�繝シ繝医rON */
	
	/* 蜿ウ繝ャ繝�げ險ュ螳� */
	CCP2SEL	= 0;	P2BSEL	= 0;	/* P2A繧坦C1縺ォ�訓2B繧坦C0縺ォ蜑イ繧雁ス薙※ */
	TRISC1	= 1;	TRISC0	= 1;	/* PWM蜃コ蜉帙�繝シ繝医r荳€譌ヲOFF */
	PR4		= 125;					/* PWM蜻ィ豕「謨ー : 1[kHz] */
	CCPR2L	= 0;					/* Duty繧�0%縺ォ */
	CCP2CON	= 0b10011100;			/* PWM繝「繧ク繝・繝シ繝ォ2繧丹N */
	T4CON	= 0b00000110;			/* 繧ソ繧、繝�4繧丹N 繝励Μ繧ケ繧ア繝シ繝ゥ:16 */
	PWM2CON	= 0b00000100;			/* 繝�ャ繝峨ち繧、繝�繧定ィュ螳� 2[us] */ 
	TRISC1	= 0;	TRISC0	= 0;	/* PWM蜃コ蜉帙�繝シ繝医rON */
}

void	initializeAD( void )
{
	TRISB5 = 1; ANSB5 = 1;	/* RA0繧但D蜈・蜉帙ヴ繝ウ縺ォ險ュ螳� */
	ADCON1	= 0b01010000;	/* ADC繧ッ繝ュ繝�け繧�2[us]縺ォ險ュ螳� */
	ADCON0	= 0b00110101;	/* ADC繝「繧ク繝・繝シ繝ォ繧丹N */
	__delay_us( 100 );		/* 險ュ螳壼ョ御コ�凾髢灘セ�■ */ 
}