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
}