TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado 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
.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