If this is a NiMH charger controller type thing, there's no reason to shut off the charger to check your battery voltage. But, instead of taking a single reading and comparing that to your old reading, I'd take a load of readings over a minute, add them up, and then see if the new 'summed reading' is less than the old 'summed reading'. That way, any voltage drops due to mains power fluctuations, ripple in the power supply, etc. should be compensated for. Try this instead:

adcon0=$d:ansel=$48:trisio=0:gpio=0
DEFINE OSCCAL_1K 1 'SAVES OSCILLATOR CALIBRATION
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 5 'INTOSC_CLOCKOUT?
DEFINE ADC_SAMPLESUS 50 '50 MICROSECONDS SAMPLE TIME
volt var word : oldvolt var word:green var gpio.5:switch var gpio.0:summedvolts var word : oldsummedvolts var word:sumcounter var byte:fudgefactor var byte:fudgefactor=100:low switch
START:
pause 60000:for sumcounter=1 to 64:adcin 3,volt:summedvolts=summedvolts+volt:next sumcounter:if ( summedvolts - fudgefactor ) < oldsummedvolts then stopchg
oldsummedvolts=summedvolts:summedvolts=0:goto start
STOPCHG:
high green:stop
end
Another problem the original is that there is no 'slop' built into it. One ADCIN count less, and the charger stops. That's why I added the 'fudgefactor' to it.