ADC reading using register

Hi
@MartinL

I have to read many analog input, without using interrupt.
Without stopping the program, as it does arduino analogRead().

A polling function that check if flag is on, save value and start new input conversion.

Maybe set the hardware average.

Do you have some example ?
Or enhanced arduino library ?

I have made this but not Work

 // Analog input Setup
  analogPrescaler(ADC_PRESCALER_DIV512);
  analogReadExtended(16); // 16 bit = 256 sample
  analogGain(1);
  analogReference2(ADC_REF_INT1V); // 1.0V reference
  analogCalibrate();
  while (ADC->STATUS.bit.SYNCBUSY == 1);
  ADC->CTRLA.bit.ENABLE = 0x01;             // Enable ADC


void analogPolling(void){
//A1 = PB8 = AIN2
//A2 = PB9 = AIN3
//A3 = PA4 = AIN4
//A4 = PA5 = AIN5
//A5 = PB2 = AIN10
  static uint32_t pin = 2;

  if( !ADC->STATUS.bit.SYNCBUSY ){ // if conversion is done
    switch(pin){
      case 2:
      analogResult[1] = ADC->RESULT.reg; // save conversion value
      pin = 3;
      ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection new conversion pin
      while (ADC->STATUS.bit.SYNCBUSY == 1);
      ADC->SWTRIG.bit.START = 1;            // start new conversion
      break;
    case 3:
      analogResult[2] = ADC->RESULT.reg; // save conversion value
      pin = 4;
      ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection new conversion pin
      while (ADC->STATUS.bit.SYNCBUSY == 1);
      ADC->SWTRIG.bit.START = 1;            // start new conversion
      break;
...

Solved, now Work

void analogPolling(void){
//A1 = PB8 = AIN2
//A2 = PB9 = AIN3
//A3 = PA4 = AIN4
//A4 = PA5 = AIN5
//A5 = PB2 = AIN10
  static byte pin = 2;


  if( ADC->INTFLAG.bit.RESRDY ){				// if conversion is done
    ADC->INTFLAG.reg = ADC_INTFLAG_RESRDY;
    switch(pin){
	  case 2:
	    analogResult[1] = ADC->RESULT.reg;	// save conversion value
	    pin = 3;
//        ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection new conversion pin
        ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin
		  while (ADC->STATUS.bit.SYNCBUSY == 1);
        ADC->SWTRIG.bit.START = 1;            // start new conversion
	    break;
	  case 3:
	    analogResult[2] = ADC->RESULT.reg;	// save conversion value
	    pin = 4;
//        ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection new conversion pin
        ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin
		  while (ADC->STATUS.bit.SYNCBUSY == 1);
        ADC->SWTRIG.bit.START = 1;            // start new conversion
	    break;
	  case 4:
	    analogResult[3] = ADC->RESULT.reg;	// save conversion value
	    pin = 5;
//        ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection new conversion pin
        ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin
		  while (ADC->STATUS.bit.SYNCBUSY == 1);
        ADC->SWTRIG.bit.START = 1;            // start new conversion
	  break;
	    case 5:
	    analogResult[4] = ADC->RESULT.reg;	// save conversion value
	    pin = 10;
//        ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection new conversion pin
        ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin
		  while (ADC->STATUS.bit.SYNCBUSY == 1);
        ADC->SWTRIG.bit.START = 1;            // start new conversion
	    break;
	  case 10:
	    analogResult[5] = ADC->RESULT.reg;	// save conversion value
	    pin = 2;
//        ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection new conversion pin
        ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin
		  while (ADC->STATUS.bit.SYNCBUSY == 1);
        ADC->SWTRIG.bit.START = 1;            // start new conversion
	    break;
	  }
   }
}



void analogEnable( void ){
  while (ADC->STATUS.bit.SYNCBUSY == 1);
  ADC->CTRLA.bit.ENABLE = 0x01;             // Enable ADC
  while (ADC->STATUS.bit.SYNCBUSY == 1);
  ADC->INPUTCTRL.bit.MUXNEG = ADC_PIN_IOGND; // set back muxneg to internal ground  ADC_PIN_GND / ADC_PIN_IOGND
  while (ADC->STATUS.bit.SYNCBUSY == 1);
  ADC->INPUTCTRL.bit.MUXPOS = 2;             // Selection new conversion pin
  while (ADC->STATUS.bit.SYNCBUSY == 1);
  ADC->SWTRIG.bit.START = 1;                 // start new conversion
}