/*
2012.04.19 7M4MON
１バイト読み込んでPWM比に設定し
A/Dを読み込んで1バイト送信するプログラム
電圧可変電源・電圧計用に作成
WindowsPhone7.5でLEDの明るさ、照度の読み込みにも対応
PC側はPBC.EXE(PwmByteControl)で制御可能

A0,A5はロータリーエンコーダ入力
A1はAN1でフィードバック入力
A2はCCP PWM出力
A3はUART入力
A4はUART出力
*/

#include	<12f683.h> //ヘッダファイルインクルード
//コンフィギュレーション設定
#DEVICE ADC=8
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR
#use delay(CLOCK = 8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A4,rcv=PIN_A3)

#define SW_A PIN_A5
#define SW_B PIN_A0

int set_v, read_v;
short swa;


/*タイマ割り込みで約0.26秒に1回、現在の電圧を吐くようにする*/
#INT_TIMER1
void timer1_isr(){
	set_timer1(65535);
	read_v = read_adc();
	putc(read_v);	
}

void main() {
	setup_oscillator(OSC_8MHZ);
	
	set_v = 0;
	setup_ccp1(CCP_PWM);
	setup_timer_2(T2_DIV_BY_1,255,1);
	set_pwm1_duty(set_v);
	
	//入力 A0,A3,A5
	//set_tris_a(0b00101011);
	//内蔵プルアップA0,A5
	port_a_pullups(0b00100001);
	
	setup_adc_ports(sAN1 | VSS_VDD);	
	setup_adc(ADC_CLOCK_DIV_8);
	set_adc_channel(1);
	
	swa = input(SW_A);
	
	setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);//T1_DIVは8まで。
	set_timer1(65535);					// 262.14msec
	//1サイクル4クロックなので実質2MHz、8分周しているので250kHz
	//割り込みは4us毎に発生、timerを0xffに設定すると262.14ms毎に割り込み発生

	enable_interrupts(INT_TIMER1);		//タイマ１割込み許可
	enable_interrupts(GLOBAL);			

	while(1){
		
		if ( input(SW_A) ^ swa ){	//もしロータリーエンコーダが回転していたら
			swa = ~swa;	//状態保持を反転
			if ( input(SW_A) ^ input(SW_B)){
				if (set_v != 255){set_v++;}
			}else{
				if (set_v != 0){set_v--;}
			}
			set_pwm1_duty(set_v);			
			delay_ms(10);	//チャタリングの防止
		}
		if(kbhit()){
			set_v = getc();
			set_pwm1_duty(set_v);
		}
		
	}

}
