34 #error "This processor selection does not have a DMA module; this code example is incompatible with a PIC24 CPU that does not have DMA."
63 #define CONFIG_LED2() CONFIG_RB5_AS_DIG_OUTPUT()
72 #define ADC_NSTEPS 4096
73 #define ADC_12BIT_FLAG 1
76 #define ADC_NSTEPS 1024
77 #define ADC_12BIT_FLAG 0
89 #define CONVERSIONS_PER_INPUT 1
90 #define MAX_CHANNELS 16
92 #define MAX_TRANSFER (CONVERSIONS_PER_INPUT*MAX_CHANNELS) //make power of two for alignment to work
95 uint16_t au16_bufferA[MAX_TRANSFER] __attribute__((space(dma),aligned(MAX_TRANSFER*2)));
110 for (u8_i=0; u8_i<16; u8_i++) {
111 if (u16_ch0ScanMask & u16_mask)
116 if (u8_autoSampleTime > 31) u8_autoSampleTime=31;
118 AD1CON1bits.ADON = 0;
120 AD1CON1 = ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON;
123 AD1CON1bits.AD12B = 1;
125 AD1CON1bits.AD12B = 0;
127 if (u8_useScatterGather) {
128 AD1CON1bits.ADDMABM = 0;
129 u16_dmaMode = DMA_AMODE_PERIPHERAL_INDIRECT;
132 AD1CON1bits.ADDMABM = 1;
133 u16_dmaMode = DMA_AMODE_REGISTER_POSTINC;
138 AD1CON3 = ADC_CONV_CLK_SYSTEM | (u8_autoSampleTime<<8) |ADC_CONV_CLK_10Tcy;
142 AD1CON2 = ADC_VREF_AVDD_AVSS | ADC_CONVERT_CH0 | ADC_SCAN_ON | ((u8_nChannels-1)<<2);
145 #if (defined(__PIC24H__)|| defined(__dsPIC33F__))
146 AD1CHS0 = ADC_CH0_NEG_SAMPLEA_VREFN;
148 AD1CHS = ADC_CH0_NEG_SAMPLEA_VREFN;
150 AD1CSSL = u16_ch0ScanMask;
152 switch (u8_dmaLocsPerInput) {
154 AD1CON4 = ADC_1_WORD_PER_INPUT;
157 AD1CON4 = ADC_2_WORD_PER_INPUT;
160 AD1CON4 = ADC_4_WORD_PER_INPUT;
163 AD1CON4 = ADC_8_WORD_PER_INPUT;
166 AD1CON4 = ADC_16_WORD_PER_INPUT;
169 AD1CON4 = ADC_32_WORD_PER_INPUT;
172 AD1CON4 = ADC_64_WORD_PER_INPUT;
175 AD1CON4 = ADC_128_WORD_PER_INPUT;
178 AD1CON4 = ADC_1_WORD_PER_INPUT;
183 DMA0PAD = (
unsigned int) &ADC1BUF0;
184 DMA0REQ = DMA_IRQ_ADC1;
185 DMA0STA = __builtin_dmaoffset(au16_bufferA);
186 DMA0CNT = (u8_nChannels * u8_dmaLocsPerInput)-1;
190 DMA_DIR_READ_PERIPHERAL |
194 DMA_MODE_CONTINUOUS);
200 AD1CON1bits.ADON = 1;
201 return(u8_nChannels);
205 volatile uint16_t au16_buffer[MAX_TRANSFER];
206 volatile uint16_t au16_bufferSum[MAX_CHANNELS];
210 void _ISRFAST _DMA0Interrupt(
void) {
215 for ( u8_i=0; u8_i<MAX_TRANSFER; u8_i++) {
216 au16_buffer[u8_i] = au16_adcHWBuff[u8_i];
235 CONFIG_AN0_AS_ANALOG();
236 CONFIG_AN1_AS_ANALOG();
237 CONFIG_AN4_AS_ANALOG();
238 CONFIG_AN5_AS_ANALOG();
239 CONFIG_AN10_AS_ANALOG();
240 CONFIG_AN11_AS_ANALOG();
241 CONFIG_AN12_AS_ANALOG();
245 u8_NumChannelsScanned =
configDMA_ADC( ADC_SCAN_AN0 | ADC_SCAN_AN1 | ADC_SCAN_AN4 | \
246 ADC_SCAN_AN5 | ADC_SCAN_AN10 | ADC_SCAN_AN11 | ADC_SCAN_AN12,
247 31, ADC_12BIT_FLAG, 0, CONVERSIONS_PER_INPUT);
251 while (u8_waiting) {};
256 for (u8_j=0; u8_j<CONVERSIONS_PER_INPUT; u8_j++) {
257 for ( u8_i=0; u8_i<u8_NumChannelsScanned; u8_i++) {
259 if (u8_j == 0) au16_bufferSum[u8_i] = au16_buffer[u8_k];
260 else au16_bufferSum[u8_i] += au16_buffer[u8_k];
265 for (u8_i=u8_NumChannelsScanned; u8_i<MAX_CHANNELS ; u8_i++) {
266 au16_bufferSum[u8_i] = 0;
269 for ( u8_i=0; u8_i<MAX_CHANNELS ; u8_i++) {
270 u16_pot = au16_bufferSum[u8_i]/CONVERSIONS_PER_INPUT;
271 f_pot = 3.3 / ADC_NSTEPS * u16_pot;
273 if (u8_i < 10)
outChar(
'0'+u8_i );
275 printf(
":0x%04X=%1.3fV ", u16_pot, (
double) f_pot );
276 if ((u8_i % 4) == 3) printf(
"\n");