Autor Tema: DMA en el DAC dsPIC 33F  (Leído 6056 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado enanoverde

  • PIC10
  • *
  • Mensajes: 6
DMA en el DAC dsPIC 33F
« 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.


Desconectado enanoverde

  • PIC10
  • *
  • Mensajes: 6
Re: DMA en el DAC dsPIC 33F
« Respuesta #1 en: 10 de Julio de 2012, 15:15:01 »
Código: [Seleccionar]
/*============================================================================= 
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
}

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: DMA en el DAC dsPIC 33F
« Respuesta #2 en: 10 de Julio de 2012, 15:53:35 »
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.

Desconectado enanoverde

  • PIC10
  • *
  • Mensajes: 6
Re: DMA en el DAC dsPIC 33F
« Respuesta #3 en: 12 de Julio de 2012, 06:51:32 »
Perdón, el comentario no estaba bien escrito:
Código: [Seleccionar]
/*============================================================================= 
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!

Desconectado enanoverde

  • PIC10
  • *
  • Mensajes: 6
Re: DMA en el DAC dsPIC 33F
« Respuesta #4 en: 13 de Julio de 2012, 04:13:11 »
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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: DMA en el DAC dsPIC 33F
« Respuesta #5 en: 13 de Julio de 2012, 04:54:19 »
Gracias por aportar la solución

Desconectado sirnatham

  • PIC10
  • *
  • Mensajes: 1
Re: DMA en el DAC dsPIC 33F
« Respuesta #6 en: 17 de Junio de 2013, 09:07:11 »
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.




 

anything