Autor Tema: VGA con PIC  (Leído 7898 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
VGA con PIC
« en: 14 de Noviembre de 2012, 04:48:11 »
Estoy usando un PIC18F2550 a 12MIPS para controlar un monitor LCD TFT SAMSUNG, a travéz del VGA.

Mucha de la información que encontré, estaba realizada en assembler y yo quería hacerlo en C. En este caso, con el CCS v.1.134 y con el PICkit2 como quemador

Como un primer paso, el monitor debe reconocer las tramas que le enviamos.

De esta forma, las lineas de sincronismo horizontal (HS) y sincronismo vertical (VS) son imprescindibles para que podamos comunicarnos correctamente con el monitor y decirle a que resolución y frecuencia queremos trabajarlo. Las lines R, G y B no son necesarias para este fin.

Para controlar HS y VS lo hacemos por interrupcion con el timer0.

Código: [Seleccionar]
#INCLUDE <18F2550.h>

#FUSES PLL5, CPUDIV1,  NOUSBDIV, HSPLL, NOFCMEN, NOIESO
#FUSES PUT, NOBROWNOUT, NOVREGEN, NOWDT, CCP2C1, NOPBADEN, NOLPT1OSC
#FUSES MCLR, STVREN, NOLVP, NOXINST, NODEBUG, PROTECT

#USE DELAY (CLOCK = 48 000 000)

#USE FAST_IO  (A)
#USE FAST_IO (B)
#USE FAST_IO (C)

#DEFINE LED    PIN_A0
#DEFINE RED    PIN_C6
#DEFINE BLUE   PIN_C2
#DEFINE GREEN  PIN_C7
#DEFINE H_SYNC PIN_C0
#DEFINE V_SYNC PIN_C1

#BIT T0IF = 0xFF2.2

int16 cont = 524;
int1 EstadoHS = 0;

void main (void)
{
   set_tris_a(0);
   set_tris_b(0);
   set_tris_c(0);
   
   delay_us(500);
   
   output_high(V_SYNC);
   output_high(H_SYNC); EstadoHS=1;
   output_low(GREEN);
   output_low(RED);
   output_low(BLUE);
   
   delay_ms(17);
   
   setup_timer_0(T0_INTERNAL | T0_DIV_1);
   set_timer0(65362);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
   while (true)
   {   
   
   }
}
   
#INT_GLOBAL
void isr_timer0(void)
{
   static int1 flag1;
   
   // T = 31.67us, Tlow=3.25us
   if (T0IF)
   {
      if (estadoHS == 1)
      {
         set_timer0(65511);
         output_low(H_SYNC);
      }
      else
      {
         set_timer0(65207);
         output_high(H_SYNC);
         cont++;
         
         if (flag1 == 0)
         {
            if (cont >= 525)
            {
               output_low(V_SYNC);
               flag1 = 1;
               cont = 0;
            }
         }
         else
         {
            if (cont >= 2)
            {
               output_high(V_SYNC);   
               flag1 = 0;
               cont = 0;
            }
         }
      }
   
      EstadoHS++;
   }
   
   clear_interrupt(INT_TIMER0);
}

Estos tiempos son  muy pequeños:


Si todo esta bien, la pantalla debe estar negra (no apagada) y comprobando en sus configuraciones nos muestrará lo siguiente:


Esquema:



Luego pondré fotos con mayor resolución, es que mi cámara se quedo sin batería. También, comenzare por generar las señales RGB que ya estoy en pruebas pero tengo algunas dudas con los tiempos, pues esas señales no son continuas si quiero mostrar toda la pantalla de un solo color.

Bueno, también tengo mis dudas de si es la mejor forma en como estoy generando las señales VS y HS con el PIC pero con eso me ha reconocido la pantalla correctamente.

Adjuntado en RAR, esta el C, hex, simulacion y esquema.

Links:
VGA:
http://tinyvga.com/vga-timing/640x480@60Hz
http://www.epanorama.net/documents/pc/vga_timing.html
PIC:
http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/(guia)-generar-senal-vga-con-un-pic-18fxxxx/
http://www.ucontrol.com.ar/forosmf/proyectos-en-general/como-generar-una-senal-vga-de-640x480-puntos-con-ttlpic/
http://www.pic24.ru/doku.php/osa/articles/vga_terminal#view_generating
http://www.pic24.ru/doku.php/en/osa/articles/vga_game
FPGA:
http://www.fpga4fun.com/PongGame.html
http://www.ece.ualberta.ca/~elliott/ee552/studentAppNotes/1998_w/Altera_UP1_Board_Map/vga.html#anchor2505379
http://www.xilinx.com/support/documentation/boards_and_kits/S3E_Starter_Schematic.pdf


Saludos!

Desconectado fantaxmax

  • PIC16
  • ***
  • Mensajes: 107
    • Libertycraft - Minecraft
Re: VGA con PIC
« Respuesta #1 en: 15 de Noviembre de 2012, 20:13:37 »
Hola jeremylf, muy interesante tu proyecto, semanas atras tambien me dispuse a hacer una conexion vga con el pic, pero como tambien mencionas toda la info estaba en asm, espero todo te vaya sobre ruedas, y si puedo ayudar en algo, con gusto lo hare.

Saludos!
"El presente es suyo, El futuro es mio" N.T.
El conocimiento es gratuito e ilimitado, solo debes saber donde buscarlo.

Desconectado sirias52

  • PIC10
  • *
  • Mensajes: 40
Re: VGA con PIC
« Respuesta #2 en: 26 de Noviembre de 2012, 13:14:35 »
Saludos jeremylf; esperamos avances de tu proyecto, pero ya tambien hay un tema de VGA aqui en el foro. Espero te sea de ayuda.

http://www.todopic.com.ar/foros/index.php?topic=39225.0

y espero que en particular te pueda ser de gran ayuda este link

http://www.lucidscience.com/pro-vga%20video%20generator-1.aspx

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: VGA con PIC
« Respuesta #3 en: 26 de Noviembre de 2012, 14:21:29 »
Gracias muchahos!

sirias52, si he revisado esos enlaces y mucho.

Por el momento, lo he dejado en stanby el proyecto, pues lo he estado haciendo en FPGA para la universidad y, vaya que fácil es con FPGA. Cuando acabe exámenes lo retomare para sacar algo de color, aun que analizando, si quiero algo mas decente creo que tendré que recurrir a un PIC24.


Saludos.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: VGA con PIC
« Respuesta #4 en: 02 de Diciembre de 2012, 04:22:32 »
Aquí tengo algo con color  :lol:


Código: [Seleccionar]

#INCLUDE <18F2550.h>

#FUSES PLL5, CPUDIV1,  NOUSBDIV, HSPLL, NOFCMEN, NOIESO
#FUSES PUT, NOBROWNOUT, NOVREGEN, NOWDT, CCP2C1, NOPBADEN
#FUSES NOLPT1OSC, MCLR, STVREN, NOLVP, NOXINST, NODEBUG, PROTECT

#USE DELAY (CLOCK = 48 000 000)

#USE FAST_IO (A)
#USE FAST_IO (B)
#USE FAST_IO (C)

#DEFINE LED PIN_A0
#DEFINE R   PIN_B2
#DEFINE B   PIN_B1
#DEFINE G   PIN_B0
#DEFINE HS  PIN_C0
#DEFINE VS  PIN_C1

#BIT T0IF = 0xFF2.2
#BIT T1IF = 0xF9E.0

int16 cont = 509;
int1 EstadoHS;

int8 dat = 0b111;

void main (void)
{
   set_tris_a(0);
   set_tris_b(0);
   set_tris_c(0);
  
   delay_us(500);
  
   EstadoHS = 1;
   output_high(VS);
   output_high(HS);
  
   output_low(G);
   output_low(R);
   output_low(B);
  
   delay_ms(17);
  
   setup_timer_0(T0_INTERNAL | T0_DIV_1);
   set_timer0(65362);
   enable_interrupts(INT_TIMER0);
  
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   set_timer1(0);
   //enable_interrupts(INT_TIMER1);
  
   enable_interrupts(GLOBAL);
  
   while (true)
   {    
      delay_ms(100);
      dat--;
      if (dat == 255) dat = 0b111;
   }
}

#INT_GLOBAL
void isr_h(void)
{
   static int1 Flag1=0;

   // T = 32us, Tlow=3.82us
   if (T0IF)
   {  
      output_b(0);
      if (estadoHS == 1)
      {
         set_timer0(65505);
         output_low(HS);
         if (++cont > 480) Flag1 = 1;
      }
      else
      {
         set_timer0(65211);
         output_high(HS);

         if (Flag1)
         {
            if (cont == 510)
               output_low(VS);
              
            if (cont == 512)
               output_high(VS);
              
            if (cont == 521)
            {                    
                  cont = 0; Flag1 = 0;
            }            
         }
         else
         {
            delay_us(1); delay_cycles(6);
            output_b(dat);
         }
      }
  
      EstadoHS++;
   }
  
   clear_interrupt(INT_TIMER0);
}

A diferencia del primero, he cambiado los pines RGB al puerto B para poder conmutarlos paralelamente. También, el periodo de Hs es de 32us con 3.82us en bajo.

Decir que aun estoy muy ajustado con los tiempos para hacer algo un poco mas allá, tal vez sea porque gran parte (por no decir todo) del código lo estoy tratando dentro de la interrupción del TMR0. He intentado poner la ejecución de la lineas RGB y VS en el while pero tengo problemas de sincronismo.

Posiblemente, si no me da por pasarme de una vez a un PIC24 o mayor, pueda perfeccionar el código un poco más, pero de verdad que me da muchos dolores de cabeza  :mrgreen: También, estaba pensando en aumentar los colores hasta 64, usando un pin mas en paralelo por cada linea RGB, pues aún me quedan pines del puerto B.


Gracias!
« Última modificación: 02 de Diciembre de 2012, 23:10:04 por jeremylf »

Desconectado sirias52

  • PIC10
  • *
  • Mensajes: 40
Re: VGA con PIC
« Respuesta #5 en: 25 de Diciembre de 2012, 00:51:16 »
Tienes toda la razón  jeremylf es mucha mas sencillo en FPGA, hasta demos hay jejeje, pero el reto esta hacerlo trabajar en PIC.
porque así teniendo un PIC, una SD, un monitor LCD  y una retratera pues se haría una retratera digital. Algo asi:



En todo caso para hacerlo mas directo y no VGA (con monitores LCD), pues seria hacerle un control mas directo a la LCD manejando su señal LVDS con FPGA. Aqui unos ejemplos:

http://www.energylabs.com.br/el/documento/Controlando_um_LCD_LVDS_com_FPGA

http://hackaday.com/2011/09/09/putting-laptop-lcds-to-use-with-an-fpga/

Lastima que no manejo mucho de FPGA jejeje. Bueno esto son solo ideas.


Saludos  jeremylf y Feliz navidad

Desconectado sirias52

  • PIC10
  • *
  • Mensajes: 40
Re: VGA con PIC
« Respuesta #6 en: 27 de Diciembre de 2012, 01:38:32 »
Interesante, pero lastima que estar para ARDUINO http://www.gammon.com.au/forum/?id=11608

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: VGA con PIC :: PIC :VGA ::
« Respuesta #7 en: 23 de Enero de 2013, 22:02:07 »
Hola compñero

esto parece sencillo,
tengo que probarlo     

me apunto este hilo