Hello everyone, 

Going forward on my study about VGA signal, now I could generate the sync signals (horizontal and vertical), and also play with the RGB ones. Now I can generate vertical color bars and rectangles. :)

I am still facing some problems, like to fill the entire screen area (it still shows an empty bar on the right), but I think I can solve this with a better adjust on horizontal timing.

Besides, not all kind of monitors can recognize my signal, some LCDs are not ok (no problem for CRT). I believe the solution is a better adjust on timing and/or impedance coupling.

Take a look what I got so far:

This was the first step: generate a solid stable rectangle on screen. It is white because I put all the RGB bits to HIGH, but the important was the sync signals worked very well (I think). 

The ugly/terrible picture above (the camera and my photographic skills didn't help), shows the colored vertical bars I could get from my Arduino UNO, changing the RGB bits. Actually, it would be possible to generate many more colors using some tricks or simply changing the analog levels of the RGB bits (0 to 0.7V), but I think Arduino wouldn't have speed enough on DAC. Well, for me, there is A LOT to learn yet.  

Below you can check the code, which I am not very proud of, but i works!!! :)). I think it can be useful for somebody: 

#define NOP asm("nop")
#define BLACK PORTB = B00000000;
#define BLUE PORTB = B00000001;
#define GREEN PORTB = B00000010;
#define CYAN PORTB = B00000011;
#define RED PORTB = B00000100;
#define MAGENTA PORTB = B00000101;
#define YELLOW PORTB = B00000110;
#define WHITE PORTB = B00000111;

unsigned int linecount = 1;

void setup()
{
//Set pins 5, 6 e 7 as output
// 7 - HSYNC
// 6 - VSYNC
// 10 - R
// 9 - G
// 8 - B

DDRD |= B11100000;

DDRB |= B11100111;
PORTD |= B11000000;

//set timer
TCCR2A = 0x02; // WGM22=0 + WGM21=1 + WGM20=0 = Mode2 (CTC)
TCCR2B |= (1 CS20); //
TCCR2B |= (1 CS21); // Set prescaler
TCCR2B &= ~(1 CS22); //

TCNT2 = 0; // clear counter
OCR2A = 0x0f; // set counter for comparison

TIMSK2 |= (1OCIE2A); // set interrupt by comparison
}

 

void loop()
{
do{
}while(1);

}

 

ISR(TIMER2_COMPA_vect){
PORTD &= ~(1 7);
if (++linecount == 525){ //525 lines
linecount = 1;
}
PORTD |= (1 7);

NOP;NOP;NOP;NOP;NOP;NOP;
if (linecount == 492){
PORTD &= ~(1 6);
} else {
PORTD |= (1 6);


if ((linecount >= 2) && (linecount <= 480)){

//Print a vertical rainbow on screen 
for (int j=0; j<6; j++){
BLACK;NOP;
BLUE;
BLACK;NOP;
GREEN;
BLACK;NOP;
CYAN;
BLACK;NOP;
RED;
BLACK;NOP;
MAGENTA;
BLACK;NOP;
YELLOW;
BLACK;NOP;
WHITE;
BLACK;NOP;
}
}

}

NOP; //small time adjust, it may or may not be necessary depending on your board

}

 

That's it! This was the first step for understand the basics about VGA, specially the SYNC signals. Now it's time for a better understanding about sizes and times. Also, the impedance coupling must be adjusted between the Arduino and the monitor (it could be the reason for some LCDs not understand my signal).

And more precision on timing is still possible.

Then, I will try to create some time windows for data acquiring, allowing the Arduino to get info to plot.

If, everything goes fine, maybe we can create a library for everyone use with any Arduino and any monitor, including TFTs. Too much maybe?? :)) 

Let's see what we gonna get! 

I will post every step, maybe they can help our friends here in GarageLab...

Thanks for reading this post! :)

Views: 2371

Comment by Ryadh on April 2, 2012 at 4:10pm

Great hope that will work on my board i will try it tomorrow thanks a lot !!

Comment

You need to be a member of GarageLab (arduino, electronics, robotics, hacking) to add comments!

Join GarageLab (arduino, electronics, robotics, hacking)

Latest Activity

iftekhar Mobin is now a member of GarageLab (arduino, electronics, robotics, hacking)
yesterday
Profile IconLeicester Hibbert and Michael Young joined GarageLab (arduino, electronics, robotics, hacking)
Jan 9
Profile IconThorsten Schwarz and Dana Custer joined GarageLab (arduino, electronics, robotics, hacking)
Jan 2
Aqeel munir updated their profile
Dec 31, 2016
Todd Enger updated their profile
Dec 29, 2016
FRANK KWABENA is now a member of GarageLab (arduino, electronics, robotics, hacking)
Dec 28, 2016
Ayhan Chaplan commented on GarageLab's blog post How to use a Peltier with Arduino
"Hi! Will this setup work with a 3,8V / 2,5A Peltier element? Or do I have to reduce the resistance…"
Dec 26, 2016
Profile IconAyhan Chaplan, Erva and Donna Carter joined GarageLab (arduino, electronics, robotics, hacking)
Dec 26, 2016
Galy Huang posted a discussion

Ubuntu on Firefly-RK3399

Firefly-RK3399 with dual-core Cortex-A72 and quad-core Cortex-A53, ARM® Mali-T860 MP4 quad-core…See More
Dec 20, 2016
Chase Rangel posted a discussion

What is the simplest way to control one brushless motor forward/reverse?

  Hello everyone I don't know much about this type of stuff had only a handful of RC cars.I've been…See More
Dec 12, 2016
Profile IconErving Howe, Chase Rangel, Werner Pretorius and 1 more joined GarageLab (arduino, electronics, robotics, hacking)
Dec 12, 2016
Frank Turner is now a member of GarageLab (arduino, electronics, robotics, hacking)
Dec 9, 2016
Marcelo Rodrigues and swapnil are now friends
Dec 6, 2016
Marcelo Rodrigues replied to swapnil's discussion Tiny 85 based Thermometer
"Dear Swapnil, Since you don't have any experience with programming you should consider start…"
Dec 5, 2016
swapnil posted a discussion

Tiny 85 based Thermometer

Hi, can any one guide me how to make the tiny 85 based Thermometer which will glow the LED…See More
Dec 4, 2016
Spyros Svoronos is now a member of GarageLab (arduino, electronics, robotics, hacking)
Dec 4, 2016
K Biju is now a member of GarageLab (arduino, electronics, robotics, hacking)
Nov 29, 2016
Profile Iconswapnil and Yasser joined GarageLab (arduino, electronics, robotics, hacking)
Nov 28, 2016
udit is now a member of GarageLab (arduino, electronics, robotics, hacking)
Nov 25, 2016
Aqeel munir is now a member of GarageLab (arduino, electronics, robotics, hacking)
Nov 23, 2016

© 2017   Created by Marcelo Rodrigues.   Powered by

Badges  |  Report an Issue  |  Terms of Service