After every 50 conversions (four times per second) set a flag to indicate to the main loop that its time to display a new value(some additional us). And leave the ISR.
unsigned char flag, dv=0, av=330, fc=0.125;
void InitTimer1(){
TCCR1B = 0x09;
OCR1AH = 0x9C;
OCR1AL = 0x3F;
TIMSK = 0x10;
}
uint16_t read_adc(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ADMUX = (ADMUX & 0xF8) | ch;
return(ADCW);
}
ISR(TIMER1_COMPA_vect)
{
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
dv=read_adc(1);
dv = dv + ( av - dv) * fc ;
}
main()
{
while(1)
{
Print1(dv);
}
}
unsigned char flag, dv=0, av=0, fc=0.01;
#mcount uint8 = 0
#dispv float =0
void InitTimer1(){
TCCR1B = 0x09;
OCR1AH = 0x9C;
OCR1AL = 0x3F;
TIMSK = 0x10;
}
uint16_t read_adc(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ADMUX = (ADMUX & 0xF8) | ch;
return(ADCW);
}
ISR(TIMER1_COMPA_vect)
{
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
av=read_adc(1);
dv = dv + ( av - dv) * fc ;
# mcount ++ ; increment counter
# if mcount == 100 ; 100 x 5ms = 500ms, 100 adcvalues are filtered and now ready to display
# {
# mcount = 0 ; clear counter
# dispv = dv ; give the value to the main loop
# flag = 1 ; infor the main loop to display new value
# }
}
main()
{
while(1)
{
# if flag == 1 ; wait until flag is set (every 100 adc readings = 500ms)
# {
# Print1(dispv); Mind this is a float and you can display it as "0000.0" because of better resolution
# flag == 0 ; clear the flag
# }
}
}
unsigned char flag, dv=0, av=0;
unsigned char mcount = 0
float dispv =0 , fc=0.01;
void InitTimer1(){
TCCR1B = 0x09;
OCR1AH = 0x9C;
OCR1AL = 0x3F;
TIMSK = 0x10;
}
uint16_t read_adc(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ADMUX = (ADMUX & 0xF8) | ch;
return(ADCW);
}
ISR(TIMER1_COMPA_vect)
{
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
av=read_adc(1);
dv = dv + ( av - dv) * fc ;
mcount++;
if(mcount==100)
{
mcount=0;
dispv=dv;
flag=1;
}
}
main()
{
while(1)
{
if(flag==1)
{
Print1(dispv);
flag=0;
}
}
}
//unsigned char flag;
unsigned char mcount=0;
unsigned int av=0;
float dispv=0,fc=0.01,dv=0;
void InitTimer1(){
TCCR1B = 0x09;
OCR1AH = 0x9C;
OCR1AL = 0x3F;
TIMSK = 0x10;
}
uint16_t read_adc(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ADMUX = (ADMUX & 0xF8) | ch;
return(ADCW);
}
ISR(TIMER1_COMPA_vect)
{
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
av=read_adc(1);
dv = dv + ( av - dv) * fc ;
mcount++;
if(mcount==50)
{
mcount=0;
dispv=dv;
}
}
main()
{
while(1)
{
Print1(dispv);
}
}
How often do you like to "print". I recommend to do this with fixed delay.
Otherwise you may loose data or get corrupt data..
I just saw that you don't use the mcount and flag....
--> For sure it is very fast then.....
unsigned char mcount=0;
unsigned int av=0;
float dispv=0,fc=0.01,dv=0,dv1=0,dispv1=0,tmp1=0,tmp=0;
void InitTimer1(){
TCCR1B = 0x09;
OCR1AH = 0x9C;
OCR1AL = 0x3F;
TIMSK = 0x10;
}
void InitADC()
{
ADMUX |=(1<<REFS0); // For Aref=AVcc;
ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);// Prescalar div factor = 64
ADCSRA|=(1<<ADSC);
}
uint16_t read_adc(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ADMUX = (ADMUX & 0xF8) | ch;
return(ADCW);
}
ISR(TIMER1_COMPA_vect)
{
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
av=read_adc(1);
dv = dv + ( av - dv) * fc ;
av=read_adc(2);
dv1 = dv1 + ( 10*av - dv1) * fc ;
mcount++;
if(mcount==100)
{
mcount=0;
dispv=dv;
dispv1=dv1;
}}
main(){
while(1)
{
cli();
tmp1=dispv1;
tmp=dispv;
sei();
Print1(tmp1);// Print1 for digit 1-3
Print(tmp); // Print for digit 4-6
}}
}
uint16_t read_adc(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ADMUX = (ADMUX & 0xF8) | ch; select channel
ADCSRA|=(1<<ADSC); start conversion
while(!(ADCSRA & (1<<ADIF))); wait until conversion finished
ADCSRA|=(1<<ADIF); clear flag
return(ADCW); read adc conversion result
}
ISR(TIMER1_COMPA_vect)
{
av=read_adc(1);
dv = dv + ( av - dv) * fc ;
av=read_adc(2);
dv1 = dv1 + ( 10*av - dv1) * fc ;
mcount++;
.
.
uint16_t read_adc(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ADMUX = (ADMUX & 0xF8) | ch; select channel
ADCSRA|=(1<<ADSC); start conversion
while(!(ADCSRA & (1<<ADIF))); wait until conversion finished
ADCSRA|=(1<<ADIF); clear flag
return(ADCW); read adc conversion result
}
ISR(TIMER1_COMPA_vect)
{
av=read_adc(1);
dv = dv + ( av - dv) * fc ;
av=read_adc(2);
dv1 = dv1 + ( av - dv1) * fc ; //////////////// 10 eliminated here and its working well.
mcount++;
if(mcount==100)
{
mcount=0;
dispv=dv;
dispv1=dv1;
}
Device: atmega8
Program: 4822 bytes (58.9% Full)
(.text + .data + .bootloader)
Data: 308 bytes (30.1% Full)
(.data + .bss + .noinit)
unsigned char mcount=0,p=0,swcount=0;
unsigned int av=0,RBV=0;
float fc=0.005,dispv=0,dispv1=0,dv=0,dv1=0,dv2=0,tmp1=0,tmp=0;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?