/***************************************************** * 充電器のテストプログラム for 12f683 * MPLAB IDE v8.84 HI-TECH C v9.83 * バッテリーの電圧が2.8v未満になると放電を中止して * 充電を開始、電圧が4.3v以上になると充電を中止 * GP0:電圧を検知 GP1:LED GP2:LED(稼働中点灯) * GP4:充電コントロール GP5:放電コントロール ******************************************************/ #include #define _XTAL_FREQ 4000000 // クロック周波数設定 /***** コンフィギュレーションの設定 ********/ __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & BOREN_ON & MCLRE_OFF & CP_OFF & IESO_OFF & FCMEN_OFF); unsigned int keisoku(void); void delay_10ms(unsigned int time); /******** メイン関数 ************/ void main(void) { unsigned int Volt1; OSCCON = 0x60; // Set to 4MHz TRISIO = 0b00001001; // GP 基本出力設定(GP0,3は入力) ANSEL = 0x01; // 基本デジタル、GP0はアナログ(ADC)設定 CMCON0 = 0x07; // コンパレータオフ ADCON0 = 0b10000001; // 基準は、Vdd(+5v) /* AD変換クロック設定 ANCEL = 0b0010xxxx:Fosc/32 */ ADCS2=0; ADCS1=1; ADCS0=0; GPIO = 0x08; // 初期設定(GP3=1) /**** メインループ *****/ while(GP3); // プッシュボタンがONなら次へ while(1){ // 放電処理 Volt1 = keisoku(); // GP0の値(mV) if(Volt1 < 2800){ GP1 = 0; // 赤消灯 GP5 = 0; // 放電処理停止 break; // 次(充電処理)へ } GP1 = 1; // 赤点灯 GP5 = 1; // 放電ON delay_10ms(10); } while(1){ // 充電処理 Volt1 = keisoku(); if(Volt1 > 4300){ GP2 = 0; GP4 = 0; } if(Volt1 < 4200){ GP2 = 1; // 黄点灯 GP4 = 1; // 充電処理 } delay_10ms(10); } // end_while } /* 基準電圧は5v 計測電圧は、GP0 で、0〜5v */ // 計測サブ unsigned int keisoku(void){ unsigned int value; ADCON0 = 0b10000001; // GP0で計測 delay_10ms(1); GO = 1; while(GO); // GO = GODONEビット 0になるまで待つ value =ADRESH * 256 + ADRESL; // デジタル値に変換 value = (long)value * 4920 / 1023; // 供給電圧4.92vと比較して電圧値に return(value); } /****************************** * 10msec遅延関数 ******************************/ void delay_10ms(unsigned int time) { while(time){ __delay_ms(10); // 10msec time--; // 10msec x time } }