// // GFA BATTERY MONITOR // // version 1.0 // // OKIRAKU AUDIO 2025-May #include "12F615.H" #device ADC=10 #fuses INTRC_IO,NOWDT,NOMCLR,BROWNOUT,PUT #use delay(internal=4MHz) #use fast_io(A) #define LED PIN_A5 // LED #define SPEAKER_P PIN_A1 // SPEAKER + #define SPEAKER_M PIN_A2 // SPEAKER - #define POWER_MONITOR (0) // POWER MONITOR #define PIC_VOLT (5.0) // supply voltatge #define BAT_LOW (6.9) // battery low voltage #define BAT_BAD (6.3) // battery bad voltage #define VOLTAGE_DIV (3.0) // ADC input 1/3 batteru voltage // // A/D function routine // int16 get_ad() // BASIC A/D FUNCTION { int1 done; int16 value; read_adc(ADC_START_ONLY); done = adc_done(); while(!done) done=adc_done(); value=read_adc(ADC_READ_ONLY); return(value); } int16 get_ad4() { int16 j; j=get_ad(); j+=get_ad(); j+=get_ad(); j+=get_ad(); return(j>>2); } void io_select() { output_low(LED); output_drive(LED); output_low(SPEAKER_P); output_low(SPEAKER_M); output_drive(SPEAKER_P); output_drive(SPEAKER_M); setup_adc(ADC_CLOCK_DIV_16); setup_adc_ports(sAN0); // Only AN0 A/D input set_adc_channel(POWER_MONITOR); } void beep(int16 n) // aprox. 4kHz { while(n--){ output_high(SPEAKER_P); output_low(SPEAKER_M); delay_us(120); output_high(SPEAKER_M); output_low(SPEAKER_P); delay_us(120); } output_low(SPEAKER_P); output_low(SPEAKER_M); } main() { int16 batv; io_select(); delay_ms(100); while(1){ batv = get_ad4(); if(batv > (int16)(BAT_LOW/VOLTAGE_DIV/PIC_VOLT*1024.0)){ // NORMAL output_low(LED); } else if(batv > (int16)(BAT_BAD/VOLTAGE_DIV/PIC_VOLT*1024.0)){ // LOW output_high(LED); } else { // BAD output_high(LED); beep(800); output_low(LED); delay_ms(300); } } } // end of program