The Tank Project

K2 #177

K2 Bicycle Mobile



PIC µControllers


Mobile Computing

What's QRP?

Online Log (old)

About Me

MX Riding

My "Ham History"

QRP Wattmeter


This site was last updated 4/13/2002.

There have been visitors to my site since it began on August 25, 2000.


PIC µControllers

I have been interested in PIC microcontrollers for several years, after first seeing them in QST, and I had heard of them from the BASIC Stamp stuff I was doing. I wanted to use them, but kind of stayed away due to the need for a programmer (simple ones are available, but only for the FLASH parts, and a PICSTART is $200), and the assembly language that they used. I found out that a BASIC compiler was available for the PICs, but the $100 cost and the fact that the BASIC coding was not a flexible as assembly kept me still waiting.

In the summer of 2000, I looked more in-depth at PIC information. I found a programmer that is identical to the PICSTART, but only costs $100. It is the WARP-13 available from Newfound Electronics. Then, the factor that really convinced me was the web page written by Jim Brown on how to program PICs in assembly language. I already had the MPLAB progam, so I started writing some simple programs in order to learn basic assembly language instructions. I found out that with the nice guide, it wasn't as tough as I thought. Also, by using the simulator in MPLAB, I could run my programs step-by-step and see where the problems were. The simulator was great and so about two months before I got a programmer and programmed my first PIC, I felt that I had a reasonably good understanding of basic assembly language programming. I finally got a WARP-13 programmer around the beginning of October 2000, and worked on a few projects with a PIC16C84.

First I just played with eight segments of an LED bargraph, and then moved to three seven-segment LED displays. I had the segment pins off all three hooked in parallel, and drove them off of the 8-bit port, PORTB. Then I had the three common pins hooked to seperate pins of the 5-bit port. By multiplexing the common lines, I could control three segments with only 10 pins. Each digit is in a lookup table that returns a byte value that is written to PORTB. When the common pin is taken low, the number is displayed. It worked when I first powered it up. I worked on advancing that program but had problems for awhile and moved on to other projects. I think that with the programming experience I have now it would be pretty easy for me to do.

After that, I was kinda frustrated and didn't do much with PICs for a couple of months. I wrote a simple program to control the PLL of the MP20. The code worked, but the hardware interface didn't work correctly. After that the next major project was in the spring of 2001. It was a lap timer I made for myself to mount to the handlebars of my dirtbike so that I could time my laps and get faster. It had 8 LEDs that would light differently depending on how many seconds faster or slower the previous lap was than the one before it. The rider pushed a button at the same spot on the track every lap to indicate the end of a lap. It used repeated subtraction to determine how much faster or slower the last lap was. It was a great idea and I tried it out once, but the battery holder I was using was very intermittent and made the timer keep resetting every few seconds. I need to get a better battery holder and try it again.

The next large project was in July 2001 and was done to help with the code for the tank. I wrote a program to control a "standard" Hitachi HD44780-based LCD. I got the basic program working and then modified it to run in the 4-bit data mode. This cut the number of control lines needed from 10 to 6, and was pretty simple. When I finished that, I worked on using the same port of the PIC for both the data lines and control lines. All this did was make the code a bit more messy. The final enhancement to the program was placing all of the LCD signals on PORTC, which on the 16F873 is the same port that the USART (serial port) is on. Since the LCD only uses 6 port pins, I modified the program to free up the transmit and receive lines, and then made a simple serial terminal so that I could type on the computer and have the LCD update, as well as send data back to the PC. With this done, I left the code alone because it will let me use an LCD and serial comms in future projects (I was planning to use it in the tank, but found out we couldn't use bidirectional data because the radio couldn't switch between transmit and receive fast enough) using only PORTC and leaving ports A and C open for use in the application. Some of the code (I got it from a more recent program and edited out all but the LCD stuff) can be seen here. The "LCD control functions" are just routines I wrote to make some common LCD tasks easier.

I have written several other programs for the tank, including some experimental joystick decoding code, a test program for the video overlay board, servo control code, an H-bridge test controller, and some modem test code. I also got a book on Windows programming in C and wrote a couple tank programs in C for Windows (they use the Win API and look like VB programs) that interface to a PIC.

On one weekend during March of 2002, my math class was given an optional extra credit project to write a program that would calculate the sine and cosine of a number from 0 to 360 degrees by converting the angle to radians, dividing the angle into one of eight 45 degree segments (pi/4 rad), then using Taylor Series' to find the sin and cos of the angle (over the 0 to 45 degree segment), and then using identities to find the final sin and cos values. I thought it would be neat to use a PIC as the computer and write the code in C. For input I decided to use a rotary encoder that I had and use an LCD for output. I spent most of the following Saturday working on the code, and got the Taylor Series, input, and output working. It took a while longer to implement the identities, and I started running out of space in the PIC, even though it was a 16F627 with 4K of ROM. After that was done there was another problem that I fixed by type casting a variable in one of the equations. That took me a while to find, and when I was done with that I modified a copy of the program to find the sin and cos of all angles between 0 and 360 degrees and output the results to the serial port (for part of the assigment we had to turn in a listing of the values that the program calculated).

[The Tank Project] [K2 #177] [K2 Bicycle Mobile] [MultiPIG] [Projects] [PIC µControllers] [Antennas]
[Mobile Computing] [What's QRP?] [Online Log (old)] [About Me] [MX Riding]
[My "Ham History"] [QRP Wattmeter] [SW40+] [Home]

This page last updated 4/13/2002.
© 2002 N8MX.