Xmega Application Note


adc_example_interrupt.c

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00052 #include "avr_compiler.h"
00053 #include "adc_driver.h"
00054 
00056 #define SAMPLE_COUNT 100
00057 
00059 int16_t adcSamples[4][SAMPLE_COUNT];
00060 
00061 uint16_t interrupt_count = 0;
00062 int8_t offset;
00063 
00064 int main(void)
00065 {
00066         /* Move stored calibration values to ADC A. */
00067         ADC_CalibrationValues_Load(&ADCA);
00068 
00069         /* Set up ADC A to have signed conversion mode and 12 bit resolution. */
00070         ADC_ConvMode_and_Resolution_Config(&ADCA, ADC_ConvMode_Signed, ADC_RESOLUTION_12BIT_gc);
00071 
00072         /* Set sample rate */
00073         ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV32_gc);
00074 
00075         /* Set referance voltage on ADC A to be VCC/1.6 V.*/
00076         ADC_Reference_Config(&ADCA, ADC_REFSEL_VCC_gc);
00077 
00078         /* Get offset value for ADC A. */
00079         ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,
00080                                          ADC_CH_INPUTMODE_DIFF_gc,
00081                                          ADC_DRIVER_CH_GAIN_NONE);
00082 
00083         ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN1_gc, ADC_CH_MUXNEG_PIN1_gc);
00084 
00085         ADC_Enable(&ADCA);
00086         /* Wait until common mode voltage is stable. Default clk is 2MHz and
00087          * therefore below the maximum frequency to use this function. */
00088         ADC_Wait_8MHz(&ADCA);
00089         offset = ADC_Offset_Get_Signed(&ADCA, &ADCA.CH0, false);
00090     ADC_Disable(&ADCA);
00091     
00092         /* Setup channel 0, 1, 2 and 3 to have single ended input. */
00093         ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,
00094                                          ADC_CH_INPUTMODE_SINGLEENDED_gc,
00095                                          ADC_DRIVER_CH_GAIN_NONE);
00096 
00097         ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1,
00098                                          ADC_CH_INPUTMODE_SINGLEENDED_gc,
00099                                          ADC_DRIVER_CH_GAIN_NONE);
00100 
00101         ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH2,
00102                                          ADC_CH_INPUTMODE_SINGLEENDED_gc,
00103                                          ADC_DRIVER_CH_GAIN_NONE);
00104 
00105         ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH3,
00106                                          ADC_CH_INPUTMODE_SINGLEENDED_gc,
00107                                          ADC_DRIVER_CH_GAIN_NONE);
00108     
00109         ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,
00110                                          ADC_CH_INPUTMODE_SINGLEENDED_gc,
00111                                          ADC_DRIVER_CH_GAIN_NONE);
00112     
00113         /* Set input to the channels in ADC A to be PIN 4, 5, 6 and 7. */
00114         ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN4_gc, 0);
00115         ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_CH_MUXPOS_PIN5_gc, 0);
00116         ADC_Ch_InputMux_Config(&ADCA.CH2, ADC_CH_MUXPOS_PIN6_gc, 0);
00117         ADC_Ch_InputMux_Config(&ADCA.CH3, ADC_CH_MUXPOS_PIN7_gc, 0);
00118 
00119         /* Setup sweep of all four virtual channels.*/
00120         ADC_SweepChannels_Config(&ADCA, ADC_SWEEP_0123_gc);
00121 
00122         /* Enable low level interrupts on ADCA channel 3, on conversion complete. */
00123         ADC_Ch_Interrupts_Config(&ADCA.CH3, ADC_CH_INTMODE_COMPLETE_gc, ADC_CH_INTLVL_LO_gc);
00124 
00125         /* Enable PMIC interrupt level low. */
00126         PMIC.CTRL |= PMIC_LOLVLEX_bm;
00127 
00128         /* Enable global interrupts. */
00129         sei();
00130 
00131         /* Enable ADC A with free running mode, VCC reference and signed conversion.*/
00132         ADC_Enable(&ADCA);
00133 
00134         /* Wait until common mode voltage is stable. Default clock is 2MHz and
00135          * therefore below the maximum frequency to use this function. */
00136         ADC_Wait_8MHz(&ADCA);
00137 
00138         /* Enable free running mode. */
00139         ADC_FreeRunning_Enable(&ADCA);
00140 
00141         /* Eternal loop to wait for the conversions and interrupts to finnish. */
00142         while(true){
00143         }
00144 }
00145 
00146 
00154 ISR(ADCA_CH3_vect)
00155 {
00156         /*  Read samples and clear interrupt flags. */
00157         adcSamples[0][interrupt_count] = ADC_ResultCh_GetWord_Signed(&ADCA.CH0, offset);
00158         adcSamples[1][interrupt_count] = ADC_ResultCh_GetWord_Signed(&ADCA.CH1, offset);
00159         adcSamples[2][interrupt_count] = ADC_ResultCh_GetWord_Signed(&ADCA.CH2, offset);
00160         adcSamples[3][interrupt_count] = ADC_ResultCh_GetWord_Signed(&ADCA.CH3, offset);
00161 
00162 
00163         if(interrupt_count == SAMPLE_COUNT-1){
00164                 ADC_Ch_Interrupts_Config(&ADCA.CH3, ADC_CH_INTMODE_COMPLETE_gc, ADC_CH_INTLVL_OFF_gc);
00165                 ADC_FreeRunning_Disable(&ADCA);
00166                 ADC_Disable(&ADCA);
00167         }
00168         interrupt_count++;
00169 }
@DOC_TITLE@
Generated on Tue Aug 4 13:31:15 2009 for AVR1300 Using the XMEGA ADC by doxygen 1.5.3