TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: jeremylf 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.
#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:
(http://imageshack.us/a/img15/795/tiemposvga.jpg)
Si todo esta bien, la pantalla debe estar negra (no apagada) y comprobando en sus configuraciones nos muestrará lo siguiente:
(http://imageshack.us/a/img210/4571/image001pb.jpg)
Esquema:
(http://img600.imageshack.us/img600/9362/esquemal.png)
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!
-
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!
-
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
-
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.
-
Aquí tengo algo con color :lol:
#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!
-
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:
(http://img89.imageshack.us/img89/9888/dsc00587rr.jpg) (http://imageshack.us/photo/my-images/89/dsc00587rr.jpg/)
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
-
Interesante, pero lastima que estar para ARDUINO http://www.gammon.com.au/forum/?id=11608
-
Hola compñero
esto parece sencillo,
tengo que probarlo
me apunto este hilo