TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: enanoverde en 10 de Julio de 2012, 07:29:47
-
Hola buenas,
Estoy intentando reproducir audio por la salida del DAC con ayuda del DMA, pero no me salta a la interrupción del DMA.
Tengo un código que almacena los datos en un buffer ping-pong en DPSRAM y he configurado el DMA para que coja los
datos de esos Buffers y haga una conversion A/D, pero no entra a la interrupción.
La configuración del DMA la he sacado de microchip, "DAC operation with DMA".
No veo donde he podido confundirme, que parte he podido olvidar o configurar mal.
Un saludo a todos y gracias de antemano.
P.D. Sería recomendable subir el código de configuración, lo subo en un rato que tenga.
-
/*=============================================================================
DMA1 configuration
=============================================================================*/
void initDma1(void)
{
DMA1CONbits.AMODE = 0; // Configure DMA for Register indirect with post increment
DMA1CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode
DMA1PAD = (volatile unsigned int)&DAC1RDAT; // Peripheral Address Register: ADC buffer
DMA1CNT = (NUMSAMP-1); // DMA Transfer Count is (NUMSAMP-1)
DMA1CONbits.DIR=1; //de RAM a periferico
DMA1REQ = 78; // Periferico ????Timner 3 ADC interrupt selected for DMA channel IRQ_ // ADC interrupt selected for DMA channel IRQ
DMA1CONbits.HALF=0;
DMA1STA = __builtin_dmaoffset(BufferC); // DMA RAM Start Address C
DMA1STB = __builtin_dmaoffset(BufferD); // DMA RAM Start Address D
IFS0bits.DMA1IF = 0; // Clear the DMA interrupt flag bit
IEC0bits.DMA1IE = 1; // Set the DMA interrupt enable bit
DMA1CONbits.CHEN = 1; // Enable DMA channel
}
-
segun tu codigo:
DMA1REQ = 78; // Periferico ????Timner 3 ADC interrupt selected for DMA channel IRQ_ // ADC interrupt selected for DMA channel IRQ
y segun comentas quieres usar el DAC no¿ Si lo estas configurando para ADC puede que sea eso.
-
Perdón, el comentario no estaba bien escrito:
/*=============================================================================
DMA1 configuration
Direction: Read from peripheral address BUfferC y BufferD and write to DAC1RDAT
AMODE: Register indirect with post increment
MODE: Continuous, Ping-Pong Mode, BufferC y BufferD
IRQ: DAC Interrupt IRQ=78 , DMA1PAD=DAC1RDAT
=============================================================================*/
void initDma1(void)
{
DMA1CONbits.AMODE = 0; // Configure DMA for Register indirect with post increment
DMA1CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode
DMA1PAD = (volatile unsigned int)&DAC1RDAT; // Point DMA to DAC1RDAT
DMA1CNT = (NUMSAMP-1); // DMA Transfer Count is (NUMSAMP-1)
DMA1CONbits.DIR=1; //de DPSRAM a periferico
DMA1REQ = 78; // Select DAC1RDAT as DMA
//DMA1CONbits.HALF=0; //Interrupcion cuando envia el bloque entero
DMA1STA = __builtin_dmaoffset(BufferC); // DMA RAM Start Address C
DMA1STB = __builtin_dmaoffset(BufferD); // DMA RAM Start Address D
IFS0bits.DMA1IF = 0; // Clear the DMA interrupt flag bit
IEC0bits.DMA1IE = 1; // Set the DMA interrupt enable bit
DMA1CONbits.CHEN = 1; // Enable DMA channel
}
No se como hacer que salte la interrupción del DMA con el DAC ... alguien maneja el DMA a la salida? como hace para recoger los valores de la DPSRAM y sacarlo por DAC? Hay que activarlo de alguna forma? No se que hago mal, un saludo. Mil gracias!
-
Ya he encontrado el problema, la configuración del DAC con DMA está perfecta.
El problema era que en el main, no metía ningun valor al DAC1RDAT y entonces no saltaba la interrupción.
Si alguien le pasa algo con el DAC o el DMA que me pregunte!
Ciaoooo
-
Gracias por aportar la solución
-
Hola enanoverde, puedes subir lo ultimo con lo que hiciste funcionar la salida de datos por DMA?
1) Mi primer pregunta como se llenan los buffers de salida:
Cuando dices que metes valores en DAC1RDAT ( main ), no se supone que al configurar el DMA este ya este se encarga de vincular a los Buffers C y D con DAC1RDAT ???
2) La segunda es respecto a las rutinas de atencion de interrupción:
Basandonos en el "DAC operation with DMA" como definiste las interrupciones de DMA y DAC ?
void __attribute__((interrupt, no_auto_psv)) _DMA1Interrupt(void)
void __attribute__((interrupt, no_auto_psv)) _DAC1RInterrupt(void)
Soy nuevo en el foro :oops: ! Saludos y muy bueno el post.