Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
12 years, 10 months ago.
MODDMA DAC and burst ADC
Hello, I would like to sample on two channels with mbed ADC the signal generated by this example http://mbed.org/users/AjK/code/MODDMA/file/cb10aec6feb1/example4.h therefore I added the following code:
int res[4004];
volatile int sc =0;
extern "C" void ADC_IRQHandler(void) __irq {
uint32_t trash __attribute__((unused));
switch(LPC_ADC->ADSTAT & 0xFF) {
case 0x01:
res[sc++] = LPC_ADC->ADDR0;
led1=1;
break;
case 0x02:
res[sc++] = LPC_ADC->ADDR1;
led2=1;
break;
default: // Shouldn't happen but just in case handle unrecognised channel
led3=1;
trash = LPC_ADC->ADDR2;trash = LPC_ADC->ADDR3;trash = LPC_ADC->ADDR4;trash = LPC_ADC->ADDR5;trash = LPC_ADC->ADDR6;trash = LPC_ADC->ADDR7;
break;
}
}
int main() {
//...
//MODDMA DAC code
//...
// Power up the ADC and set PCLK
LPC_SC->PCONP |= (1UL << 12);
LPC_SC->PCLKSEL0 &= ~(3UL << 24); // PCLK = CCLK/4 96M/4 = 24MHz
//LPC_ADC->ADCR = (1UL << 21) | (1UL << 8) | (3UL << 0);
LPC_ADC->ADCR = (3 << 0) | (1 << 8) | (1 << 16) | (1 << 21) | (0 << 24);
LPC_PINCON->PINSEL1 &= ~(3UL << 14); /* P0.23, Mbed p15. */
LPC_PINCON->PINSEL1 |= (1UL << 14);
LPC_PINCON->PINSEL1 &= ~(3UL << 16); /* P0.24, Mbed p16. */
LPC_PINCON->PINSEL1 |= (1UL << 16);
NVIC_SetVector(ADC_IRQn, (uint32_t)&ADC_IRQHandler);
LPC_ADC->ADINTEN = 3;
NVIC_EnableIRQ(ADC_IRQn);
while (1) {
if (sc==4000) {NVIC_DisableIRQ(ADC_IRQn);break;}
}
}
If I sample an external signal (with MODDMA DAC disabled) everything works OK: LED1 and LED2 turn on, LED3 remains OFF and program exits from the main loop... however... if I try to sample mbed's DAC with MODDMA DAC enabled the above code doesn't work (LED1, LED2 and LED3 turn ON and the program doesn't exit the main loop... Am I missing something? Is burst mode ADC supposed to work with MODDMA DAC?