可変抵抗を回してLEDを調光する(PWM)

http://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/18F14K50/VRtoLED2/VRtoLED22.htm

こっちがよさそう。
AD変換およびPWMを内蔵、しかも安いPICの12F675を使う。
http://homepage3.nifty.com/mitt/pic/picc/picc675_04.html
同等のPIC12F683を持ってたので使うことに。

// ========================== ???? ==============================
//?????	AD_LED.c
//???	2008.9.28
//???	mit.ueno
//?????	1.0
//?????	PICC Lite
//???	PIC12F675
//????	4MHz(INTIO)
//??
//	A/D???????????
//	GP5?LED????????
//	GP4?LED??????????
//	TMR0??????
//		clock	4MHz
//		??	1?S
//		TMR0	256(?????)
//		pre_sc	1
//		???	1?S×256×1?0.256mS
//?????
//	GP0:VR(10K)
//	GP4:LED
//	GP5:LED

#include "pic.h"

static void pic_init();
static void wait_50uS();	// AD?????????

static unsigned char Cnt32;	// 0.256*32=8.192mS
static unsigned char Cnt500mS;	// 0.256*32*61=499.7mS
static unsigned char PWM_wid;	// PWM????
static unsigned char PWM_wid_i;	// PWM???????
static			bit	 T500mS;


__CONFIG(FOSC_INTOSCIO  & WDTE_OFF & PWRTE_ON & MCLRE_OFF);


// =================== ?????? ====================
static void interrupt intr(void) {
	T0IF = 0;	// TMR0???????

	if	(!(Cnt32--)) {	// PWM ???????
		Cnt32 = 32;
		PWM_wid = PWM_wid_i;
		if	(PWM_wid_i) {
			GP5 = 1;
		}
		if	(!(Cnt500mS--)) {	// 500m???
			Cnt500mS = 61;
                        T500mS = 1;
		}
	}
	if	(!(PWM_wid--)) {	// PWM????
		GP5 = 0;		// ??
	}
}

// ==================== ????? ===========================
main()	{
	pic_init();		// PIC????

	Cnt500mS = 61;
	T500mS = 0;

	while(1) {
		wait_50uS();		// 50uS??????????
		GO = 1;		// AD????
		while(GO) {}	// AD????
		PWM_wid_i = ADRESH >> 3;

		if	(T500mS) {
			T500mS = 0;
			if	(GP4) {
				GP4 = 0;
			} else {
				GP4 = 1;
			}
		}
	}
}

// ==================== PIC???? ===========================
static void pic_init() {
	CMCON0 = 0x07;		// ?????????
	ANSEL = 0x11;		// 8Tosc,AN0
	ADCON0 = 0x01;		// Left,Vdd,AN0,ADON
	TRISIO = 0x0F;		// GP0-4:in,GP4,5:out
	GPIO = 0;

        //OSCCON = 0b01100000;    //4MHz???(?????)
	OPTION_REG = 0x88;		// ??????:??
	TMR0 = 0x00;
	T0IE = 1;		// TMR0??????
	GIE = 1;		// ????????
}

// =================== ???????????? ===============
static void wait_50uS() {
	unsigned int cnt;
	unsigned int i;
	cnt = 2;
	for	(i=0 ; i<cnt ; i++) {
		NOP();
	}
}
// ========================== ???? ==============================

開放電圧が5V出てるのは確認したが、LEDをダイレクトドライブすると
電圧が2.2Vまで降下していた。
実際にはFETなどのスイッチングに使う。