/** * \brief Callback function for ADCB-CH0 interrupts * - Interrupt is configured for Conversion Complete Interrupt * - ADCA CH0 result is accumulated * - ADC sample count is incremented * - Check If ADC sample count reached up to number of oversampling required * - If so, disable ADC interrupt and set flag to start oversampling process * * \param adc Pointer to ADC module. * \param ch_mask ADC channel mask. * \param result Conversion result from ADC channel. */ static void adc_handler(ADC_t *adc, uint8_t ch_mask, adc_result_t result) { /* Get Result from ADCB-CH0 Register and Accumulate */ adc_result_accumulator += result; /* Increment sample count */ adc_samplecount++; /* Check if sample count has reached oversample count */ if (adc_samplecount >= ADC_OVER_SAMPLED_NUMBER) { /* Disable ADCB-CHO conversion complete interrupt until stored * samples are processed */ adcch_disable_interrupt(&adc_ch_conf); adcch_write_configuration(&ADCB, ADC_CH0, &adc_ch_conf); /* Clear any pending interrupt request by clearing interrupt * flag */ adc_clear_interrupt_flag(&ADCB, ADC_CH0); /*Set adc_oversampled_flag to start oversampling process from * main function */ adc_oversampled_flag = true; /* Store single sample ADC result to find analog input without * oversampling */ adc_result_one_sample = result; } }
int get_adc(){ uint8_t adc_value; /* sensor ADC value */ ADCSRA |= _BV(ADSC); // start ADC conversion while(adc_conversion_in_progress()); adc_value = ADCH; adc_clear_interrupt_flag(); return(adc_value); }
/** * \brief Wrapper function for getting and ADC sample * * \param adc_ch which channel to get the ADC samples from * /returns 16-bit signed ADC result */ static int16_t adc_get_sample(uint8_t adc_ch) { int16_t result = 0; adc_start_conversion(&CALIBRATION_ADC, adc_ch); adc_wait_for_interrupt_flag(&CALIBRATION_ADC, adc_ch); result = adc_get_result(&CALIBRATION_ADC, adc_ch); adc_clear_interrupt_flag(&CALIBRATION_ADC, adc_ch); return result; }