TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: Mnephet en 22 de Julio de 2013, 17:42:48

Título: Configuración DMA/ADC en dsPIC33F
Publicado por: Mnephet en 22 de Julio de 2013, 17:42:48
Hola a todos. Desde hace algún tiempo tengo entre manos un proyecto con el dsPIC33FJ128GP802.

Querría realizar una conversión contínua con el ADC de la entrada AN0. Cada conversión se irá guardando automáticamente en la DMA.
Para almacenar todos los datos que pueda de una vez para hacer cálculos posteriormente, quería usar toda la DMA,
de tal modo que en la mitad baja (0x4000 - 0x43FE, datos de 16b) almaceno 512 muestras de la señal y a continuación hago los cálculos mientras que se guardan
en segundo plano las siguientes 512 muestras en la mitad alta (0x4400 - 0x47FE). Y así voy guardando en una mitad mientras calculo con la otra.

He probado el programa, pero la DMA no recibe datos y creo que se debe a algo de la configuración del ADC o la DMA.
A continuación incluyo el fragmento de código de la configuración del dsPIC. ¿Qué he hecho mal?
Nota: el cálculo dura mucho menos que la conversión del siguiente grupo de muestras


Código: [Seleccionar]
.text                            ;start of Code section
__reset:
        MOV #0xFFFE, W0
        MOV W0, PMD1             ;excepto ADC1...
        SETM PMD2
        SETM PMD3                ;todos los periféricos apagados

        MOV #__SP_init, W15      ;inicializar Stack Pointer
        MOV #__SPLIM_init, W0    ;inicializar Stack Pointer Limit Register
        MOV W0, SPLIM
        NOP                      ;se añade NOP tras inicialización de SPLIM

        CALL _wreg_init          ;llamada a subrutina _wreg_init (Wn=0; n=0-14)

        ;configuración del ADC
        MOV #0x14E4, W0          ;ADC off, off en Idle, DMA por orden, 12b
        MOV W0, AD1CON1          ;entero sin signo, autoconversión
        MOV #0x0000, W0          ;Referencias: alimentación, CH0
        MOV W0, AD1CON2          
        MOV #0x092E, W0          ;Reloj general, SAMC = 9, ADCS = 46, por lo
        MOV W0, AD1CON3          ;que sampling = 3408.88 Hz
        MOV #0x0000, W0          
        MOV W0, AD1CON4          
        MOV #0x0000, W0          
        MOV W0, AD1CHS123        
        MOV #0x0000, W0          
        MOV W0, AD1CHS0          ;Entrada AN0
        MOV #0x0000, W0          
        MOV W0, AD1CSSL        
        MOV #0xFFFE, W0          
        MOV W0, AD1PCFGL         ;ANx digitales, menos AN0

        SETM TRISA               ;PORTA entradas (xxx1)
        CLR TRISB                ;PORTB salidas

        ;configuración de la DMA
        MOV #0x0002, W0          ;Canal 0 inhabilitado, Word, Entrada
        MOV W0, DMA0CON          ;Interrupción FULL, Ping-pong ON
        MOV #0x000D, W0          ;
        MOV W0, DMA0REQ          ;Transferencia automática desde ADC1
        MOV #0x0000, W0          ;
        MOV W0, DMA0STA          ;Buffer A en 0x4000
        MOV #0x0400, W0          ;
        MOV W0, DMA0STB          ;Buffer B en 0x4400
        MOV #0x0300, W0          ;
        MOV W0, DMA0PAD          ;Registro de origen ADC1BUF0
        MOV #0x01FF, W0          ;
        MOV W0, DMA0CNT          ;512 datos

        BSET CORCON, #0          ;Modo ENTERO para multiplicaciones DSP

        BSET DMA0CON, #15        ;DMA CH0 ON
        BSET AD1CON1, #15        ;ADC1 ON, se inicia la conversión

esperar:
        BTSS IFS0, #4            ;IntFlag de DMA0
        BRA esperar              ;se espera hasta que se hayan leído 512 datos
        BCLR IFS0, #4            ;se limpia el flag para la próxima

        /*SE REALIZA EL CALCULO CON LA MITAD DE LA DMA QUE CORRESPONDA*/

        BRA esperar