Instrucciones de direccionamiento de arreglo VGA PIC 24F

0

Para crear un controlador VGA para un microcontrolador PIC 24F, estoy generando una interrupción que crea un impulso VSYNC, seguido de un bucle que coloca datos en los puertos. Los pulsos HSYNC se calculan después de este bucle de video. Todos los tiempos son correctos y mi monitor CRT acepta la señal generada. Sin embargo, solo puedo escribir datos literales por el momento y me gustaría poder escribir matrices llenas de datos en mi pantalla. Este código está trabajando actualmente:

MOV     #80,W0

VID_LOOP:
    BSET    LATB,#4
    BCLR    LATB,#4
    SUB     #1,W0
BRA     NZ,VID_LOOP  

El puerto B4 es la parte R de mi señal, por lo que este bucle escribe líneas verticales en la pantalla. mi registro W0 está cargado con el # 80, esto significa que se escriben 80 líneas en la pantalla. Este bucle se ejecuta 60 veces y se agregan un porche delantero y trasero, así que obtengo una resolución de 80 * 60 PX. Hasta ahora todo bien, pero esto significa que solo tengo 2 instrucciones para cargar una variable desde una matriz de filtro de pantalla al puerto. ¿Alguien sabe cómo podría hacer esto? Tal vez mi bucle podría ser más corto?

    
pregunta AEIO

3 respuestas

2

Lo he resuelto con una macro:

#define showpx asm("   MOV     [W8], W9"); \
    asm("   BTSC    W9,#3"); \
    asm("   BSET    PORTC, #3"); \
    asm("   MOV     W9, PORTB"); \
    asm("   INC2    W8, W8");

y lo repetí así:

#define show8px showpx; showpx; showpx; showpx; showpx; showpx; showpx; showpx;

    show8px show8px show8px show8px show8px show8px show8px show8px show8px show8px

¡Esto elimina la sobrecarga del bucle y funciona perfectamente!

    
respondido por el AEIO
1

La respuesta corta es que un PIC24F no es lo suficientemente rápido como para ser un controlador de pantalla útil por sí solo. Tendría más posibilidades con un PIC24E debido a su reloj más rápido y DMA, pero aún así dudo que sea práctico porque (como ya descubrió) el PIC estaría tan ocupado escribiendo la señal de video que nunca tendría tiempo para recibir o cargar nuevos datos.

Para un controlador VGA de fabricación casera no se puede pasar por un FPGA; es sorprendentemente fácil hacer que VGA funcione en un Spartan-3. Si usa el PIC24F para controlar lo que muestra el FPGA, entonces tendrá una solución viable.

    
respondido por el markt
1

El truco es reconocer que no tienes tiempo durante la línea visible de 640 píxeles de VGA para "contar" o "hacer un bucle" en absoluto ... y, por supuesto, no hay suficiente tiempo para "golpear y golpear" un pin i / o ...

Sin embargo, agregue un registro de desplazamiento externo (74HC166) y configúrelo hasta 'cargar' 1 byte a la vez desde 8 pines de entrada / salida del PIC y será posible visualizar 80 caracteres ASCIi mapeados (8x8) FONT en cada uno de los 48 líneas.

Registra el cambio de velocidad a 24MHz (que está dentro de la mayoría de los límites de visualización VGA) y ejecuta el PIC con un clk de CPU (OSC / 2) de 15 MHz (por lo tanto, OSC es de 30MHz) y eso le da exactamente 5 CPU. ciclos para actualizar los bytes de entrada / salida.

5 ciclos de CPU significan que no hay que contar, llamar, regresar o perder cualquier tiempo inútil. En lugar de eso, 'construimos' la tabla de fuentes de 8x8 caracteres de 'conjuntos' de 5 instrucciones que envían un byte a los pines de entrada / salida y luego 'saltan' a la siguiente ubicación de fuente que se debe generar.

Entonces, cada entrada en la tabla de fuentes contiene 8 conjuntos, 5 instrucciones que 'generan un byte' y luego 'encuentran el siguiente byte' ... específicamente: -

Cargar byte literal a W, Salida byte W a PORT (2) Cargue W word desde Index ++, agregue W word a PCL (3)

Para 'controlar' esta secuencia, se cargan 80 registros de índice con las compensaciones que llevan la ejecución de una ubicación de fuente a la siguiente. El último registro de índice contiene un desplazamiento que lo lleva al código de sincronización de línea, durante el cual tiene que cargar los registros de índice para que la próxima línea salga, es decir, modifique el contenido de los 80 registros de índice con 80 nuevas compensaciones.

Dentro de una línea de caracteres, 'mod que registra el índice' significa volver a configurar el PRIMERO para que 'apunte' al siguiente 'inicio de la tabla de la línea de fuentes' (es decir, la siguiente línea de escaneo 'hacia abajo en la fuente) - todos los demás los saltos son "relativos", por lo tanto, permanece igual.

Si está mostrando fuentes de 8x8 caracteres, por lo general tendrá un 'espacio' entre líneas de caracteres entre líneas de escaneo raster 2 (por lo que 480 líneas de escaneo mostrarán 48 líneas de texto de 80 caracteres) y 2 líneas es suficiente tiempo para trabajar las 'compensaciones relativas' para el siguiente conjunto de 80 caracteres.

Tenga en cuenta que esto no puede hacer gráficos de mapa de bits sin la ayuda de RAM externa (8kb no es suficiente para almacenar todos los datos de mapa de bits, necesita al menos 640 * 480/8 bytes)

    
respondido por el SteveB

Lea otras preguntas en las etiquetas