/*****************************************************************************/
/*    PIC16F628 & PIC16F628A & PIC16F648A                                    */
/*                                                                           */
/*    パルスチェッカー                                                       */
/*                                                                           */
/*    Port  A  0  OUT   LCD E                                                */
/*             1  OUT   LCD R/E                                              */
/*             2  OUT   LCD RS                                               */
/*             3  IN    SIGNAL   Pulse_signal & RC                           */
/*             4  IN    SW1                                                  */
/*             5  IN    SW2                                                  */
/*                                                                           */
/*    Port  B  0  OUT   NC                                                   */
/*             1  OUT   NC                                                   */
/*             2  OUT   NC                                                   */
/*             3  OUT   NC                                                   */
/*             4  OUT   LCD DB4                                              */
/*             5  OUT   LCD DB5                                              */
/*             6  OUT   LCD DB6                                              */
/*             7  OUT   LCD DB7                                              */
/*                                                                           */
/*****************************************************************************/

#include	<16F648a.h>
#use 		delay(clock=20000000)
#fuses 		NOWDT,HS, PUT, NOPROTECT, BROWNOUT, NOMCLR, NOLVP, NOCPD

#use		fast_io(a)
#use		fast_io(b)
#include 	"lcd_lib.c"

#byte		TMR1CON	=0x10			//タイマー設定
#bit		TMR1ON	=TMR1CON.0		//タイマー1　ON・OFF
#byte		TMR1L	=0x0E			//ライマー設定値下位
#byte		TMR1H	=0x0F			//タイマー設定値上位
#define		Pulse_signal	PIN_A3
#define		Sw1	PIN_A4
#define		Sw2	PIN_A5
#define		Timer1_Start	TMR1ON = 1
#define		Timer1_Stop	TMR1ON = 0
//#define	msec_3072	0x0C		//8HZ 設定値
#define		msec_3072	0x1D

int		Ch_cnt;
char	const	Name[]	="kobura";		//表示　名前

void main()
{
	setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);	//0.4us	overflow 26.2 ms
	Timer1_Stop;
//   	setup_comparator(NC_NC_NC_NC);
   	set_tris_a(0b00111000);
   	set_tris_b(0b00000000);
	output_a(0);
	output_b(0);
	lcd_init();
	lcd_data("    0usec");
	lcd_cmd(Line2+(16-sizeof(Name)+1));	//右寄せ
	lcd_data(Name);
	while(true){
		do{														//ギャップ検出
			set_timer1(0);
			while(!input(Pulse_signal));
			Timer1_Start;
			while(input(Pulse_signal)){
				if(TMR1H > msec_3072)
					break;
			}
			Timer1_Stop;
		}while(TMR1H < msec_3072);
		Ch_cnt = 0;											//チャンネル設定
		if(!input(Sw1))
			Ch_cnt |= 1;
		if(!input(Sw2))
			Ch_cnt |= 2;
		set_timer1(0);
		switch(Ch_cnt){									//チャンネル測定
			case 3:	while(input(Pulse_signal));
					while(!input(Pulse_signal));
			case 2:	while(input(Pulse_signal));
					while(!input(Pulse_signal));
			case 1:	while(input(Pulse_signal));
					while(!input(Pulse_signal));
			case 0:	while(input(Pulse_signal));
					Timer1_Start;
					while(!input(Pulse_signal));
					while(input(Pulse_signal));
					Timer1_Stop;
					lcd_cmd(Home);
					printf(lcd_data," %4ldusec",(get_timer1() * 4)/10);
					break;
		}
	}
}

