#include <16F877.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <math.h>
void main() {
const long N =3000 ;
long i;
int value;
float voltage;
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 1 );
while(TRUE)
{
voltage = 0;
for(i=0; i<N; ++i)
{
value = Read_ADC();
voltage += (float)value*(float)value;
}
//voltage currently holds the sum of ADC values squared.
//to convert an ADC count to voltage -> ADC VALUE * (5 Volts)/(0xFF)
//0xFF is the resolution of the ADC.
//since ADC values are squared, for this routine:
// Voltage=ADC VALUE * (5 Volts)/(0xFF) * (5 Volts)/(0xFF) = ADC VALUE/2601 voltage /=2601.0;
voltage /=2601.0;
voltage = sqrt(voltage/(N));
printf("\r\nInput = %f V , voltage);
}
}