Mitch Altman and I are in the process of writing a book about Making Cool Things with Microcontrollers (for people who know nothing.)
The book features several DIY projects that use AVR microcontrollers. We’re aiming to teach absolute beginners how to solder, basic electronics, and the process of turning a cool idea into reality by using microcontrollers.
I wrote these instructions about setting up a working avr-gcc environment in Windows, Mac OS X, or Linux. Mitch and I felt that they could use some beta testing in the real world before bring included in the book, so we decided to make them available here. We also felt that they might help some people get started with AVRs before the book is available.
We want to make the process of writing and compiling code for the AVR simple and accessible, so we’re not using any fancy IDEs (eg. no AVR Studio). We also wanted to use the same software on all three operating systems, so Windows-only tools were out. Instead, we’re using avr-gcc, the compiler behind WinAVR, CrossPack, and Arduino.
I would appreciate any feedback on these instructions.
Make sure that the Display Style is set to “Collage” mode (the center option) as shown above. Click Test and you should see photos from the pool appear on your screen. Now the next time your screen saver activates, you should see a collage of cool photos from the PCB photo pool.
PS. If anyone knows of an equivalent screen saver for Windows or Linux, please let me know in the comments. I don’t want OS X users to have all the fun!
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!
“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.
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.