TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: elgarbe en 23 de Febrero de 2014, 12:09:19
-
Buenas, si bien en la facu estudimos algo de dma, fue en pc y teórico y nada de implementación en micros.
El tema es que quiero empezar a hacer uso de esta funcionalidad si es que realmente me sirve.
la idea es implementarlo en el osd, puntualmente en el código de acá http://www.todopic.com.ar/foros/index.php?topic=42254.msg350993#msg350993
como ven, para sacar los datos por el SPI armo un array de char y después en funcion de la línea en la que me encuentro y de la posición horizontal, dada por el timer, saco la info. como estoy usando el spp configurado como spi, veo que tiene dma (estoy hablando del lpc1769).
la idea sería si es posible configurar el dma, armar en memoria toda la info a envia y que el timer dispare el pedido de dma, de modo tal que el software se libere y todo el proceso de envío de datos a la pantalla se haga por hardware.
entonces mis dudas son, se puede usar para eso el dma? ahorraré tiempo de micro con el uso de dma en este caso.
el tema es que con el micro voy a tener que hacer muchas cosas, la funcion de osd, lalectura del gps, la lectura de los sensores de la imu por i2c, el calculo de la DCM, la lectura de las ordenes del radiocontrol, el manejo de los 4 esc de los motores (4x pwm), la lectura del ina219 para medición de corriente y tensión y varias cosas más... pensba que usar dma podría ayudar al proceso...
Saludos!
-
Me respondo solo luego de una basta investigacion. No solo que el DMA sirve para esto, sino que es la funcion del micro que más deberiamos explotar.
Por ahora estoy leyendo:
http://www.nxp.com/documents/application_note/AN10850.pdf
y una implementacion práctica en:
http://msys-mv.blogspot.com.ar/2011/01/dma-in-lpc17xx.html
Cuando tenga todo armado y empiece a probar reporto resultados.
Saludos!
-
Poder se puede, yo utilizo mucho la DMA porque es muy util para todo, te ahorras codigo y encima evitas tener que hacer tu propia funcion de transferencia.
-
Donde hay info para los PICs ??
-
Donde hay info para los PICs ??
aquí:
http://www.todopic.com.ar/foros/index.php?topic=38271.0
Realmente es fantástico el uso de DMA, cuanto más leo más me digo "como no lo usé acá o allá"... es tremendo el código que te ahorrás y el tiempo de CPU!!!!
sds.
-
Hola Leo,
El tema de los DMA en micros al alcance del hobbista es bastante reciente. Si bien hace décadas que existe el DMA en CPUs de PC y otros, en microcontroladores accesibles a mercados minoristas no han sido tan populares en el pasado. Creo que por eso en parte muchos desconocen directamente lo que es el DMA.
Personalmente no lo he usado nunca en los ARM, ni PIC. Sí lo he usado en procesadores de PC y en algún que otro microprocesador (Hitachi SH2 y Motorola 68000).
Igualmente, como decís, son de gran ayuda para copiar memoria, volcar datos desde un periférico, etc. sin que el CPU intervenga
Saludos!
-
.... El tema de los DMA en micros al alcance del hobbista es bastante reciente. Si bien hace décadas que existe el DMA en CPUs de PC y otros, en microcontroladores accesibles a mercados minoristas no han sido tan populares en el pasado. Creo que por eso en parte muchos desconocen directamente lo que es el DMA.....
Bruno, como andas!
A mi siempre me quedó el recuerdo de la facu (tecnicas digitales 3) cuando dimos DMA en CPUs de PC lo serprendente que me pareció y lo útil. Totalmente de acuerdo en que en los micros de gama baja no hay DMA y por eso no debe ser tan popular.
Ahora con el LPC si todo es como me lo imagino es una barbaridad!
Configuro un canal del DMA que se dispare por un timer (ver el OSD) para sacar la info por SPI. Con esto el micro ya queda libre durante todo el tiempo que tardaba en mandar los datos a la pantalla, tengo que calcularlo, pero es mucho.
Configuro otro canal para lectura de sensores por I2C. De esta forma me olvido de hacer todo el software que se encarag de leer los sensores, simplemente me encargo de ir a la posicion de memoria donde dije que se almacenen las lecturas y uso los valores almacenados.
Todo lo que tiene que ver con comunicacion entre periféricos y memoria queda transparente para el software... solo hay que ir a la memoria y leer los valores!!!
Lo que no sé aún es como sería con el I2C, el tema direcciones de dispositivo, registros a leer, etc. eso tengo que verlo... por ahora con el SPI ya tengo bastante!
Saludos!
-
Me interesa, me interesa...
de los pies a la cabeza !!
(que antiguedad !!) :D :D :D
Igual habiendo leído un poco lo que puso el mago de Inglaterra, sigo sin entender como funcionaria, por ejemplo si tengo que leer un conversor A/D externo por SPI, que no admite DMA (creo) como el CS5534 de Cirrus Logic, como se haria??
-
Me interesa, me interesa...
de los pies a la cabeza !!
(que antiguedad !!) :D :D :D
Igual habiendo leído un poco lo que puso el mago de Inglaterra, sigo sin entender como funcionaria, por ejemplo si tengo que leer un conversor A/D externo por SPI, que no admite DMA (creo) como el CS5534 de Cirrus Logic, como se haria??
es la duda parecida a como hago para leer sensores por I2C... o sea, el modulo DMA del uC como configura al periferico para que mande los datos?...
creo que la cosa va por "de que forma se dispara el DMA". Generalmente uno configura el periferico origen, el destino, las direcciones y "el disparador" del DMA. En mi caso, cuando quiero sacar datos el disparador es un timer... ahora, para recivir....
Hay que seguir leyendo... En el post de merlinz no esta la respuesta?
Sds.!
-
Bueno, em ARM se puede y si bien no es fácil, aquí hay una explicacion:
https://mbed.org/questions/1237/Possible-to-use-DMA-for-SPI-Master-read/
Aparentemente (nunca use el SPI para comunicacion, solo lo hice para sacar datos serie velozmente), el SPI es full duplex y constantemente el maestro como el esclavo envían informacion. Mientras el Maestro envía comando, el esclavo envía NULL's. Es así? bueno, teniendo en cuenta eso para los buffer's entonces se configura el ADC para que envíe un grupo de datos y dos canales DMA. Un canal se encarga de sacar tantos nulls como datos se quieran leer (entiendo que para que se generen las señales de clock) y otro canal DMA para que lea los datos que entran por el SPI... de esta forma funcionaría en un ARM. Hay que tener en cuenta que los canales de DMA son en una sola direccion, por lo que para hacer una comunicacion full duplex hay que configurar 2 canales....
Como se hace en PIC? ni idea!!!!! jjjajaja estimo que de forma similar....
Saludos!
-
El i2c creo que no acepta DMA, en microchip por ejemplo no lo acepta, solo spi, en arm no lo se pero creo que es igual.
-
Efectivamente, los LPC17xx no pueden hacer uso del DMA para I2C y por lo que estoy leyendo tampoco sería útil tampoco:
http://www.embeddedrelated.com/groups/lpc2000/show/54656.php
Saludos!
-
Buscatelo en SPI y te servira. Fijate si es util el DMA, tengo una memoria externa (MRAM) aunque funciona como una flash pero mejor, pues si quiero grabar 200bytes simplemente inicio la transferencia y el DMA se encarga de pasar esos 200bytes a la RAM sin necesidad de HACER NADA MAS :-/
-
Claro, creo que ahí esta el tema. El DMA estoy viendo que es útil en dos situaciones:
Transferencia de mucha informacion entre periferico y uC (el ejemplo que pones)
Muchas transferencias de poca informacion. Este es el caso de mi OSD, en el que tengo que enviar pequeñas cantidades de datos, pero son muchísimos datos y estan siempre en la misa posicion de memoria.
en esos casos es muy beneficioso el uso de DMA...
Saludos!
-
otro ejemplo que te pongo es el siguiente:
Tengo un IC ADC externo, este tiene 16 canales. Pues con el DMA+SPI lo activo y me olvido totalmente de hacer nada mas, cuando necesite saber que valor tiene un canal simplemente accedo a la memoria CANAL- y ahi obtengo el resultado del ultimo valor recogido. Todo esto esta ordenado, es decir el canal 0 pertenece a la memoria CANAL[0] asi ordenadito. Tambien se puede usar con el ADC interno el MCU el cual tambien tengo 5 canales sampleando y cuando quiera ver el valor de ese canal simplemente accedo a la memoria CANAL
- .
-
También es útil (y creo que fué el primer uso que se le dió) para poder copiar bloques de memoria a memoria (por ej. hacer el famoso memcpy) sin requerir del uso del procesador.
-
otro ejemplo que te pongo es el siguiente:
Tengo un IC ADC externo, este tiene 16 canales. Pues con el DMA+SPI lo activo y me olvido totalmente de hacer nada mas, cuando necesite saber que valor tiene un canal simplemente accedo a la memoria CANAL- y ahi obtengo el resultado del ultimo valor recogido. Todo esto esta ordenado, es decir el canal 0 pertenece a la memoria CANAL[0] asi ordenadito. Tambien se puede usar con el ADC interno el MCU el cual tambien tengo 5 canales sampleando y cuando quiera ver el valor de ese canal simplemente accedo a la memoria CANAL
- .
Lees los 16 canales con DMA ??
Como seria esto??
-
El ADC se activa en modo sampleo, lo que hace es cuando acaba un canal empieza con el otro automaticamente, pues bien ahora le metemos que el DMA cuando acabe el ADC haga la transferencia a una memoria que le indiques y ahi tienes el resultado. Es simple pero hay que configurar unos cuantos registros.
-
Y el disparador del DMA sería un pin tipo Data Ready del ADC que entraría al PIC?
-
Si te refieres al ADC interno del uC este tiene un evento que activa la transferencia una vez acabada la conversion y asi infinitamente, la seleccion de canales se puede especificar y tambien el orden en la memoria, el propio modulo cambia el puntero de memoria segun el canal. Si te refieres al ADC externo por SPI funciona mediante el SPI y se activa como cualquier lectura SPI, el propio SPI cuando acaba una lectura activa un evento que hace que la transferencia se active y asi infinitamente.
-
Una conulta un poco específica;
Tengo el LPC1769. Configuro el timer 1 para que resetee la cuenta con el MR0. Configuro el MR0 como para que cuente 10mseg.
Configuro el SSP0 como SPI y habilito el uso de DMA.
Configuro el DMA. Como line request uso el MAT1.0 (o sea, el pedido de DMA lo dispara el Match Register 0 del Timer1). Como surce elijo un aarray de char, como dest uso el SSP0->DR (la direccion del DATA REGISTER del SSI). Configuro el incrmeento del origen, no incremento del destino (solo quiero sacar bits por el MOSI, no quiero una comunicacion SPI con otro dispositivo)...
Pruebo todo con el analizador lógico y veo que por el MOSI salen los datos perfectos, pero lo hace solo una vez... yo esperaba que con cada Match del timer 1 con el MR0 se iba a disparar el request al DMA... no es así? que debería hacer para que se vuelva a disparar con el próximo Match?
Saludos!