Bueno, a ver si ordeno un poco las ideas y me ayudan con este tema.
Estoy con el diseño del OSD (
http://www.todopic.com.ar/foros/index.php?topic=42254.0)
Explico mas o menos como es.
Hay una camarita que tiene salida de video compuesto. Sobre esa señal se coloca un integrad, el LM1881, el cual me entrega un pulso en el comienzo del barrido horizontal y un pulso en el comienzo de un cuadro nuevo.
La distancia entre pulsos de sincronismo horizontal es de 64us, de los cuales 52useg son útiles, estan dentro de la pantalla.
La señal de video compuesto, blanco y negro tiene 2 niveles de tension. Digamos para simplificar, 0V para el negro y 1V para el blanco.
Para "agregar" informacion en la imagen de la camarita se usa una salida del uC con una R en serie de unos 100ohm. Entonces si ponemos la salida en Alta Impedancia (configurad como entrada) el uC no agrega nada a la señal de la cámara. Si la configuramos como salida y la ponemos en 0 escriviremos en negro y si la configuramos como salida y ponemos un 1 pintaremos en blanco.
Para sacar informacion del micro se pueden usar distintas técnicas. Una es usar 1 pin como IO digital. Otra es usar el SPI, unicamente la señal MOSI para sacar datos. De esta forma, escriviendo el Data Register con una WORD, podemos sacar 32 bits (pixeles) de una, sin mas que cargar 1 dato en un registro. La contra es que de esta forma es más dificil el tema de poner en alta impedancia la salida. Si dentro de los 32 bits que sacamos hay una parte que tiene texto y otra no, estamos en problemas. Esto se soluciona a medias colocando un diodo a la salida MOSI. De esta froma si el SPI saca un 1 pintamos en blanco, si saca un 0 debido al diodo será como estar en alta impedancia y lo que se verá es la señal de la cámara. Con esto no se puede usar el Negro. La solucion, se usa una salida digital con otra R, con la cual se hace el Negro.
Lo que yo tengo funcionando hasta ahora es la escritura, usando el SPI, solo en blanco. Para escrivir lo que se hace es descomoponer el caracter en líneas de, por ejemplo, 8 bits y se va imprimiendo como lo hace una impresora de las viejas, las matriz de puntos.
Bien, el tema es que en este momento tengo que tomar una decicon para avanzar en el diseño del sistema. Yo quiero buscar una salida usando DMA, para eliminar tiempo de CPU. El tema es que el DMA es util para sacar una buena cantidad de datos, por ejemplo, una línea completa de la pantalla. Si solo voy a mandar 3 o 4 caracteres no es tan util, ya que serían 3 o 4 bytes. Entonces se presenta la posibilidad de transformar la aplicacion en forma gráfica y dividir la pantalla en pixeles y enviar por el SPI con DMA las líneas completas de datos. De esta forma si el dato es 1 se pintara el pixel de blanco. si es 0 se verá la imagen de la cámara. Debería tener en memoria un array de X x Y pixeles y con el DMA sacaría constantemente ese array. Incluso leí el uso de doble buffer, mientras la aplicacion va llenando un buffer, el DMA uso el otro para enviar a la pantalla, cuando se completa un buffer, se hace el intercambio al inicio de la imagen en pantalla, de este modo se elimina el flickering.
Bien el tema es que aun no resuelvo el negro. Si quiero pintar de negro necesito otra salida. Podría ser otro SPI en paralelo, el LPC1769 tiene 2. Con el segundo SPI tendría que comandar algo (transistor, buffer, lo que sea) de modo tal que si el SPI pone un 1 a la salida tendria que tener un 0 para que pinte negro y si pongo un 0 tendría que tener alta impedancia... se me ocurre un buffer tri-state con la entada conectado a 0. Y con el SPI manejar el enabled...
Entonces, supongamos que queremos una resolucion de 320x240. Voy a tener 40x240 bytes = 9,37K por cada buffer. O sea 18,75K para los dos buffer. El segundo SPI tendría tambien 2 buffer y sería algo así como la "mascara" para ver si se pinta en negro o se deja pasar la imagen de la camara. Necesitaría 37.5K. En esto estoy bien.
Veamos velocidad. si la línea horizontal ocupa 52useg y quiero 320 pixeles serían 162nSeg por cada pixel lo que me da una frecuencia del SPI de mas o menos 6MHz. Tambien estoy bien con esa parte.
Entonces las dudas son:
Realmente me conviene el DMA y el uso del SPI para sacar la informacion?
Lo que no va a andar es el enmascaramiento, ya que no se pueden ejecutar 2 DMA a la vez.... soné...
Si paso a usar DMA con GPIO como calculo la velocidad que puedo obtener?
Podría usar 2 bits consecutivos para el manejo de 2 salidas, la que pinta de blanco y la que elije entre negro o alta impedancia. De esa forma tendría solo 2 buffer de 18.75K...
Entonces la duda es quien me da el ritmo de salida cuando el DMA se configura entre la memoria el GPIO (el GPIO es conciderado memoria en el LPC)???
Usando DMA le gano al mejor algoritmo en assembler para sacar los datos? yo estuve investigando otros proyectos y el que hace un OSD gráfico, usa un dsPic y programa en assembler la salida de datos. Ahora lo que yo pienso es que por más asembler que use, es la CPU la que saca los datos, y por más que sea va a estar ocupada siempre. Quizá por eso en ese proyecto quieren usar otro uC para leer el GPS y otros sensores y dejan el dsPic solo para la parte gráfica... Ahora, si yo uso el DMA, cuando comienza la línea, tengo 8useg para configurar el canal (puedo configurar los 8 canales de una) y luego la CPU queda libre, mientras el DMA envía los datos, los 320 bits... voy bien???
bueno, espero algún alma caritativa que se anime a ayudarme a pensarlo antes de embarcarme en esta tarea....
Saludos y gracias!