Category Archives: Projects

PIC RGB Video – Technical Details

This page summarizes the technical details behind my PIC LCD video project.  This is a basic tutorial on how to generate analog RGB video using a PIC16F628 microcontroller.

Previous posts on this project:

Materials needed:

  • An LCD screen like the Sharp 4L-U4EB that accepts a noninterlaced NTSC analog RGB video signal (red/green/blue and composite sync all as separate signals).  Poor quality datasheet here.
  • (1) PIC16F628 (the PIC16F628A should be a drop-in replacement.  Sorry, I have old PICs lying around.)
  • A PIC programmer – I am using a K128, but support for it has been discontinued.  Microchip’s PICkit2 is probably your best bet, but I haven’t used one (yet).
  • MPLAB – the free Microchip IDE, or a compatible PIC assembler
  • (1) 20MHz crystal (HC-18 or whatever fits your breadboard)
  • (2) 22pF ceramic capacitors
  • (3) 470 Ohm 1/8W resistors
  • (5) 10K 1/8W resistors
  • A 1K potentiometer for brightness control (if needed, my LCD needs one to display anything)
  • A regulated 5V supply for the PIC, and my LCD needed an 8V supply of its own
  • Anything else specific to your LCD – hopefully not much.

Firmware:

Schematic:

(click to enlarge)

Schematic

Theory of Operation:

The LCD I chose for this project needs four main electrical signals to display video.  Three of them carry color information – red, green, and blue.  These three signals can vary from 0V (black) to 0.7V (full brightness).  To achieve this, I placed 470 ohm resistors in series with each, as shown in the schematic.  The LCD terminates each color signal with a 75 ohm resistor, so the 470 ohm series resistors serve to convert the 5V output of the PIC to a 0.7V max signal for the LCD (using a resistive divider).

The other signal the LCD needs is CSYNC – an inverse TTL composite sync signal.  This signal provides both the horizontal and vertical sync for the LCD.  Without these sync signals the image rolls across the display because the LCD doesn’t know where the image starts or ends.  Composite sync seems to be a little bit unusual – most RGB video signals have separate horizontal and vertical sync signals on separate wires.

A horizontal line of NTSC video is roughly 64μs long. (μs = microseconds)  At the beginning of each line, CSYNC is held low for 4us, then set high again.  The RGB lines are held low during sync and stay low for 8μs after sync, then set to the desired levels display the desired image on that line.  2μs before the end of the line, RGB are set low again to signal the end of the visible image.  At 64μs, the program loops back to start another line.

You can generate video like this but there would be no vertical hold – the image would be stable in the horizontal direction because we are generating a horizontal sync but not in the vertical direction.

To create a stable image with vertical sync, you have to create a valid “field” of video.  We’re creating non-interlaced video, so every field is the same (in contrast with ordinary interlaced video used in television.)  A field is composed of 262 horizontal lines.  The first line is blank, with CSYNC set low for the entire line.  This is the vertical sync.  The next 17 lines are called the “blanking interval” and occur above the visible image, during these lines horizontal sync is applied but no RGB signals.  The next line is the first visible line and consists of both a horizontal sync and RGB signals as discussed earlier.  243 lines later, we write one blank line, then loop back and repeat the process all over again.  Now we have a valid non-interlaced analog RGB video signal.

The blank lines are mostly due to compatibility with old television sets that needed time to reset the electron gun for the next field.  The nice thing is that they give us time to do housekeeping before displaying the next field.  For example, during the blanking interval I load the image to display into memory so it can be easily read back later.

The critical thing with regards to timing is that the PIC needs to execute the same number of instructions each time it loops, such that the sync signals always occur at the right time.  This is why there are a lot of ‘nop’ instructions in my code – to pad the program execution in the right spots and maintain sync.  I started by counting instructions to figure out where to put the ‘nop’s, but by the end of writing the program I was using MPLAB’s builtin “Stopwatch” feature instead.

That’s it for now!  If you have any questions, make use of these routines in your own projects, or just find this interesting, please leave a comment!

PIC Microcontroller RGB Video – Animations!

Update: For those who are interested in seeing how this is done, I have posted schematics and source along with some technical details about this project.  Click here to learn more.

After two days of straight coding, this is the result – two more aliens and an animation routine that toggles between 2 images for each alien and changes aliens every n frames.  The alien selection routine is implemented as a state machine and uses way too many instructions, but fit within a blank line of video so I called it good.  The hardest part again was maintaining a constant number of clock cycles regardless of the program flow through the display loop.  This is required to maintain the video timing and keep the LCD happy.

I also changed the image lookup table routine so that the image to be displayed is loaded during the blanking interval above the top of the visible screen.  This makes the pixel display much more efficient during the field but at the cost of a bunch of memory.  Now instead of execution time during the horizontal line limiting the max resolution, it’s memory instead…  sometimes you can’t win.  If I encoded color more efficiently the memory limitation would go away.

I need to clean up the code and add some more comments, but I’ll post the source in case anyone else is interested in learning how to generate RGB video with a PIC or wants to try a similar project.

Update: The LCD display I am using is a Sharp 4L-U4EB I bought surplus years ago.  I haven’t been able to find any more of them since, does anyone have a source?

Here are some still images showing the animation sequence for each alien.  Click on each for a bigger version.

Still images from space invaders animation Red!

Still images from space invaders animation Green!

Still images from space invaders animation Blue!

Previous posts related to this project:

https://mightyohm.com/blog/2008/09/space-invaders/

https://mightyohm.com/blog/2008/09/generating-analog-rgb-video-with-a-pic-microcontroller/

Also check out my flickr set, PIC Microcontroller RGB Video.

DIY Light Tent

Homebrew Light Tent

I have always struggled to take decent macro photos of small objects to document my hobbies.  I finally got fed up with poor lighting and blurry shots and decided to build my own light tent to solve the problem.  There are lots and lots of examples on the web showing how to build a DIY light tent.  I wanted something cheap, small, and portable, so I merged ideas from a couple existing designs and used some scrap materials I had in the garage.  In the end I managed to make a light tent for about $35.

The major components are:

  • Light. I bought two desk lamps at Target for $9.99 ea.  I bought 100W CFL lights from Home Depot to avoid the unwanted heat and energy usage of conventional light bulbs, $9 for two.  I bought the color balanced type (3500K) which cost a little more but help accurate color reproduction in the photos.
  • Frame.  I used an old shoe rack, but almost anything can be made to work.
  • Light diffuser.  I tried bedsheets, which attenuated too much of the light.  Instead I used tracing paper (vellum) that I had left over from another project.
  • Background.  I used poster board from Target.  I bought one sheet each of 6 colors, for about $5.
  • Tripod – I didn’t have one so I bought the cheapest one Best Buy had, around $30.  Since I needed this for general use anyway, it’s not included in the total.

The results are really spectacular.  Now I can take macro shots of small objects without the glare and lighting problems I have experienced in the past.  For an example check out the photo below or see the complete set on flickr.

playing with my new light tent

Learn how to make a wiring harness

“Wiring harnesses are an essential and often overlooked part of any electrical system. On a car, a good wiring harness can make the difference between a weekend joyride and a long tow home. Building a quality wiring harness requires a couple inexpensive tools and the right techniques…”

The Maker Faire is an event held twice a year (alternating between San Mateo, California and Austin, Texas) by the folks at Make Magazine, one of my favorite publications from O’Reilly. The event centers on DIY culture, covering everything from making combat robots to felting and needlepoint.

This year I participated in the 2008 Bay Area Maker Faire in San Mateo and showed people how to make better wiring harnesses for things like cars and electronic projects.

During the Maker Faire I handed out a one page tutorial with information about where to buy the tools and supplies as well as the steps needed to create a template and make a wiring harness from scratch.

Here is a pdf version of the  handout.

Or grab it in .png format, click on the image below for a full size version.

Learn how to make a wiring harness!
Make Professional Quality Wiring Harnesses

Check it out and let me know what you think.