35 #error "This processor selection does not have a DMA module; this code example is incompatible with a PIC24 CPU that does not have DMA."
60 #define CONFIG_LED2() CONFIG_RB5_AS_DIG_OUTPUT()
69 #define ADC_NSTEPS 4096
70 #define ADC_12BIT_FLAG 1
73 #define ADC_NSTEPS 1024
74 #define ADC_12BIT_FLAG 0
86 #define CONVERSIONS_PER_INPUT 4
87 #define MAX_CHANNELS 16
89 #define MAX_TRANSFER (CONVERSIONS_PER_INPUT*MAX_CHANNELS) //make power of two for alignment to work
92 uint16_t au16_bufferA[MAX_TRANSFER] __attribute__((space(dma),aligned(MAX_TRANSFER*2)));
107 for (u8_i=0; u8_i<16; u8_i++) {
108 if (u16_ch0ScanMask & u16_mask)
113 if (u8_autoSampleTime > 31) u8_autoSampleTime=31;
115 AD1CON1bits.ADON = 0;
117 AD1CON1 = ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON;
120 AD1CON1bits.AD12B = 1;
122 AD1CON1bits.AD12B = 0;
124 if (u8_useScatterGather) {
125 AD1CON1bits.ADDMABM = 0;
126 u16_dmaMode = DMA_AMODE_PERIPHERAL_INDIRECT;
129 AD1CON1bits.ADDMABM = 1;
130 u16_dmaMode = DMA_AMODE_REGISTER_POSTINC;
135 AD1CON3 = ADC_CONV_CLK_SYSTEM | (u8_autoSampleTime<<8) |ADC_CONV_CLK_10Tcy;
139 AD1CON2 = ADC_VREF_AVDD_AVSS | ADC_CONVERT_CH0 | ADC_SCAN_ON | ((u8_nChannels-1)<<2);
141 #if (defined(__PIC24H__)|| defined(__dsPIC33F__))
142 AD1CHS0 = ADC_CH0_NEG_SAMPLEA_VREFN;
144 AD1CHS = ADC_CH0_NEG_SAMPLEA_VREFN;
146 AD1CSSL = u16_ch0ScanMask;
148 switch (u8_dmaLocsPerInput) {
150 AD1CON4 = ADC_1_WORD_PER_INPUT;
153 AD1CON4 = ADC_2_WORD_PER_INPUT;
156 AD1CON4 = ADC_4_WORD_PER_INPUT;
159 AD1CON4 = ADC_8_WORD_PER_INPUT;
162 AD1CON4 = ADC_16_WORD_PER_INPUT;
165 AD1CON4 = ADC_32_WORD_PER_INPUT;
168 AD1CON4 = ADC_64_WORD_PER_INPUT;
171 AD1CON4 = ADC_128_WORD_PER_INPUT;
174 AD1CON4 = ADC_1_WORD_PER_INPUT;
179 DMA0PAD = (
unsigned int) &ADC1BUF0;
180 DMA0REQ = DMA_IRQ_ADC1;
181 DMA0STA = __builtin_dmaoffset(au16_bufferA);
182 DMA0CNT = (u8_nChannels * u8_dmaLocsPerInput)-1;
186 DMA_DIR_READ_PERIPHERAL |
190 DMA_MODE_CONTINUOUS);
196 AD1CON1bits.ADON = 1;
197 return(u8_nChannels);
200 volatile uint16_t au16_buffer[MAX_TRANSFER];
204 void _ISRFAST _DMA0Interrupt(
void) {
209 for ( u8_i=0; u8_i<MAX_TRANSFER; u8_i++) {
210 au16_buffer[u8_i] = au16_adcHWBuff[u8_i];
230 CONFIG_AN0_AS_ANALOG();
231 CONFIG_AN1_AS_ANALOG();
232 CONFIG_AN4_AS_ANALOG();
233 CONFIG_AN5_AS_ANALOG();
234 CONFIG_AN10_AS_ANALOG();
235 CONFIG_AN11_AS_ANALOG();
236 CONFIG_AN12_AS_ANALOG();
240 configDMA_ADC( ADC_SCAN_AN0 | ADC_SCAN_AN1 | ADC_SCAN_AN4 | \
241 ADC_SCAN_AN5 | ADC_SCAN_AN10 | ADC_SCAN_AN11 | ADC_SCAN_AN12,
242 31, ADC_12BIT_FLAG, 1, CONVERSIONS_PER_INPUT);
246 while (u8_waiting) {};
251 for ( u8_i=0; u8_i<16; u8_i++) {
252 for (u8_j=0; u8_j<CONVERSIONS_PER_INPUT; u8_j++) {
253 if (u8_j == 0) u16_sum = au16_buffer[u8_k];
254 else u16_sum += au16_buffer[u8_k];
257 u16_pot = u16_sum/CONVERSIONS_PER_INPUT;
258 f_pot = 3.3 / ADC_NSTEPS * u16_pot;
260 if (u8_i < 10)
outChar(
'0'+u8_i );
262 printf(
":0x%04X=%1.3fV ", u16_pot, (
double) f_pot );
263 if ((u8_i % 4) == 3) printf(
"\n");