This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Using two ADC channel with interrupt

Hi! I would like to get adc sample from two different channels at the same time on my beacon (nrf1822), using the same interrupt. Is that possible?I mean I can use ADC_IRQhandler function for both conversion?If yes how can I write it in the code?Thank you

Parents Reply Children
  • I think I am doing some basic errors, because I have a timer that counts 2ms and then it starts the adc conversion and between the conversion of the two channel I don't want to start the timer.This is my piece of code, can you help me to find what doesn't work?

    void ADC_IRQHandler(void)
    {
    	/* Clear dataready event */
      NRF_ADC->EVENTS_END = 0;	
    	
    	//Invio a pacchetti di 20 bytes (ogni dato in uscita dall'adc è 2byte)
    	static uint8_t i=0;                 //usiamo static per evitare che modifichi il valore della variabile
    	static uint16_t adc_results[10];    
    		if (i<10)	
    {		
    			adc_results[i]=NRF_ADC->RESULT;
    			i=i+1;
    	NRF_ADC->TASKS_STOP = 1;
    	NRF_ADC->CONFIG=(ADC_CONFIG_PSEL_AnalogInput3 << ADC_CONFIG_PSEL_Pos);
    	NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
    	NRF_ADC->TASKS_START = 1;	
    	while (!NRF_ADC->EVENTS_END)
    	{}
    	NRF_ADC->EVENTS_END	= 0;
    	adc_results[i]=NRF_ADC->RESULT;
    		NRF_ADC->CONFIG=(ADC_CONFIG_PSEL_AnalogInput2 << ADC_CONFIG_PSEL_Pos);
    			i=i+1;
    }
     NRF_ADC->TASKS_STOP = 1;
    	
    	//Release the external crystal
    	sd_clock_hfclk_release();
    }
    
  • You will get an interrupt when the EVENTS_END flag is set (if it is zero), so in your case you will get a pending interrupt when the code exits while (!NRF_ADC->EVENTS_END). This means that you will jump right back into the interrupt when you exit it. You should disable the END interrupt (NRF_ADC->INTENCLR = (ADC_INTENCLR_END_Enabled << ADC_INTENCLR_END_Pos)) while doing the second measurement.

    Also be sure to not run the interrupt at APP_PRIORITY_HIGH if you are going to do SoftDevice calls (sd_...) from it, as this will lead to a SoftDevice assert. See for example this post.

Related