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などのスイッチングに使う。