I am trying to implement a simple adc filter which take 8 samples & returns rms value of those samples.
Problem is that when I introduced this function into my code & call the function in main it doesn't show any value in LCD but when I bypass the function my code running correctly.
Here is my code:
#include#include #include #include"lcd.h" void adc_init(void) { ADMUX |=(1<<REFS0); ADCSRA |=(1<<ADPS1)|(1<<ADPS0)|(1<<ADFR)|(1<<ADEN); } uint16_t adc_read(void) { uint16_t adc_tmp=0; ADCSRA |=(1<<ADSC); while(ADCSRA & (1<<ADSC)) { adc_tmp=ADCL; adc_tmp +=(ADCH<<8); return(adc_tmp); } } uint16_t adc_filter(void) { uint8_t i=0; uint16_t adc_value=0; uint32_t tmp_value=0; for(i=0; i>8; i++) { adc_value=adc_read(); tmp_value +=(adc_value)*(adc_value); _delay_us(10); } tmp_value=(tmp_value>>3); adc_value=(sqrt(tmp_value)); return(adc_value); } int main(void) { uint16_t tmp, adc_result=0; char i_buffer[10]; adc_init(); lcd_init(LCD_DISP_ON_CURSOR); lcd_puts("V="); _delay_ms(50); tmp=adc_read(); while(1) { adc_result=adc_filter(); itoa(adc_result, i_buffer, 10); lcd_gotoxy(2,0); lcd_puts(i_buffer); _delay_ms(50); lcd_gotoxy(0,1); lcd_puts("ADC Testing-2"); _delay_ms(150); } return(0); }
uC=Atmega8L, clk=1MHz, AVR gcc 4.19
Plz advice me to sort out my problem or suggest better way to implement function 'adc_filter'.
Thanks