I found a problem that ATtiny461 ADC cannot quickly switch from single ended input to differential for single conversion ADC mode with ADIE=1 for update ADMUX and create next conversions. In this way after switch to diff signal next conversion will be corrupt and (maybe) must be skipped. The following code address this problem:
#define AS1set BIN(10000011)//single ended signal #define AS2set BIN(10010010)//diff signal #define AS3set BIN(10000010)//single ended signal __C_task void main (void) { . . ADMUX = AS2set; ADCSRA = BIN(10011101); // ADC 250kHz Fosc=8MHz,ADIE=1 ADCSRB = BIN(00000000); __enable_interrupt(); SETBIT(ADCSRA,ADSC);//start 1st conversion . . } // ADC Conversion Complete #pragma vector = ADC_vect __interrupt void ADC_COMPLITE(void) { switch(ADMUX){ case AS1set: ADMUX=AS2set;AS1value=ADC;break; case AS2set: ADMUX=AS3set;AS2value=ADC;break; case AS3set: ADMUX=AS1set;AS3value=ADC;break; } SETBIT(ADCSRA,ADSC}; }
For this code AS2value (diff signal) always reads as zero and this is not correct for input pins measurement.
Is it a known issue or my code isn't correct?