Category: hobbies


Built a USB PIC microcontroller programmer, the usbpicprog. I used Marcelo Maggi’s version with daughter boards for the USB and ZIF. The boards had some narrow traces–I had two small defects after eteching, and lost a few more pads soldering the components on. Small wires fixed things up and it worked first time.

The instructions aren’t very clear. The bootloader .hex gets burned using a JDM programmer using the self programmer header. Then place a jumper on the self programming header Vpp and Vdd, plug it into the USB port, run usbpicprog. These messages appear on the command line:
Bootloader Devid: 11240
Autodetected PIC ID: 0x11240

Then open the firmware .hex and burn it. The program said it completed OK. Then quit the program, remove the USB cord, and add a second jumper on the self programming header from the Clk pin to Gnd.

After this it I connected my PIC18F46K20 to the ICSP header (on a breadboard), plugged in the USB cable, and ran usbpicprog again. I opened my .hex and burned it. It said the code burned OK but gave an error for the configuration bits (like I was getting from the JDM programmers). Then I tried erasing it followed by running blank check. Both of these completed OK. I re-burned my program, and this time it worked! Configuration bits were programmed and verified!

So far I’ve only finished the main board. I made the USB board but haven’t populated it yet. I intend this mainly for ICSP programming, so I haven’t decided on whether to make the ZIF board. I do need to make an enclosure.

usbpicprog top side
usbpicprog bottom side
You can see some of the trace repairs.

JDM programmer

Here’s a JDM programmer for PIC microprocessors that works for me.

circuit board

I used it to put the bootloader on a usbpicprog PIC programmer I am building. It also programmed my PIC18F46K20. It worked with picpgm and picprog on Linux. Picprog still gave me config bit errors.

I have tried other JDM programmers–simpler ones using no transistors like Simple JDM programmer (though with not-quite-right zeners). It worked intermittently for a while, then stopped working altogether on my PIC18F46K20.

Here’s a JDM programmer that usbpicprog recommends. I haven’t tried it.

JDM prog breadboard

Etching circuit boards

Note to self: on my HP LaserJet6L, board traces printed from Eagle using the PS device need to be printed out at 110%.

Postscript site

Here’s a site with a good Postscript library for drawing variable width lines.

To add a rounded end I added an arc command after the bolt function:
20 setlinewidth
newpath 0 0 moveto
0 -50 200 -150 200 0 rcurveto
reversepath bolt
5 0 179 arc

I used two of these curves to draw a stylized pear.

L-system Iterator

I’ve put up a web site for exploring L-system images, L-system Iterator.

Well known L-systems

The snowflake shape is only one example of the pictures that can be drawn this way.

L-systems are simple iterated drawing rules. Simple rules for turning and drawing put together in this way make quite interesting and complicated patterns. The ones shown above are well known. From the the left, the Koch snowflake, the Sierpinski triangle, a kolam-like image, and a plant-like image. On the second row, the Heighway dragon, the Hilbert curve, and another plant.

The Heighway dragon has many interesting properties–for example, it can be tiled over the plane.

Some iterated objects are fractals–the Koch snowflake, Sierpinski triangle, and Hilbert curve are famous simple fractals.

L-systems can be quite complicated. The systems modeled on my web site use a single rotation angle and only one line width. More complicated models can make surprisingly realistic plants. Prusinkiewicz and Lindenmayer (the L in L-system) have developed detailed plant models.

The web site is based on the Perl code I wrote for my Biomorph evolution/selection web site. The images are generated using Postscript to draw the L-system, and then the ImageMagick convert program to change it to a PNG image. Images are given a file name that describes the L-system, effectively caching the image. The Prototype Javascript library is used to assist in making the popup boxes.

Each L-system variant has two changes from the current L-system. Some logic is used to keep the L-system in the same family–if there’s no Y equation, one isn’t added. Existing equations are grown or shrunk but not dropped. These images can take much longer to generate than the Biomorph images, so a number of limits are placed to keep the L-system from getting too complicated or taking too much CPU time.

The hardest part of the Postscript was getting the images scaled and centered appropriately. The images can extend in any direction and some are large, others small. The centering code generates the image twice, once to find out its dimensions and then a second time scaled and centered. Here’s the code to record the dimensions of each part of the image. It gets called before each stroke operation.

/max_path {
gsave initmatrix pathbbox grestore

ur_y false eq { /ur_y exch store } { dup ur_y gt { /ur_y exch store } { pop } ifelse } ifelse
ur_x false eq { /ur_x exch store } { dup ur_x gt { /ur_x exch store } { pop } ifelse } ifelse
ll_y false eq { /ll_y exch store } { dup ll_y lt { /ll_y exch store } { pop } ifelse } ifelse
ll_x false eq { /ll_x exch store } { dup ll_x lt { /ll_x exch store } { pop } ifelse } ifelse
} def

The ‘initmatrix’ command is required to reset things because of all the rotation operations.

The code for the site is linked on the L-system iterator home page.

Update: Added color variation as an option. And a reverse direction primitive.

Also, the code now runs under mod_perl.

Note for mod_perl users–mod_perl 2.0 has no way of handling alarms. select() doesn’t work either as a way of timing out pipes. The only usable method is prepending commands with ‘ulimit -t secs’ and letting the shell limit the system process.

To make the split color B&W images I used these ImageMagick commands:
convert -size 150x150 tile:color.png tile:bw.png ../temp/mask.png -composite split.png
using a half black, half white split image as the mask.

Then added the split line using:
convert -size 150x150 -fill white -stroke black -draw "line 0,0 150,150" split.png split_line.png

PIC servo pot controlled

Third PIC program, this one moves a hobby servo motor using a 10kΩ pot. The pot is read using the A/D converter function on the PIC. The four high bits of the value are used to control the servo to sixteen positions over its range. Two more bits could easily be added to give finer control.

It has a light that flips on/off with each jump of the servo, another light that is always on and a third that switches the servo on/off.

PIC12F683 servo motor movie:

Here are the code files: p12_servo2.asm and p12_servo2.hex.

It is wired as shown in the video.

PIC servo control

Second PIC program, this one moves a hobby servo motor to one of two positions. The switch needs to be pulled up with a resistor.

It has one light that is always on and a second that switches on/off when the servo moves.

PIC12F683 servo motor movie:

Here are the code files: p12_servo1.asm and p12_servo1.hex.

Assembly of the .asm to a .hex:
>gpasm p12_servo1.asm

Write it to the PIC12 using:
wine “C:\Program Files\PICPgm\WinPICPgm.exe”

It is wired as shown in the video.

The servo timing is off from what I calculated. A calculated 1ms to 2ms gave about 60 degrees of movement, what’s shown is 0.75 to 1.25 ms pulses every 20 ms. I haven’t measured the pulse lengths with a scope.

PIC first light!

Got my first PIC microprocessor program running on a PIC12F683.

It has one light that is always on and a second that switches on/off.

PIC12F683 LED lighting movie:

The assembler code:

;written by: Jim Lund
;date: 11-09
;version: 1.00
;for PIC: PIC12F683
;Memory: 2048=800h, RAM 128, EEPROM 256
;clock frequency:

        list      P = PIC12F683

        include  /usr/local/share/gputils/header/

        __config _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF

        errorlevel -302

        org     0x000
        goto    Start



        clrf    STATUS;
        clrf    GPIO ; resets input/output ports

        bsf     STATUS,RP0 ;Bank 1
        ;movlw  b'00000000'
        ;movwf  OSCTUNE

        bcf     STATUS,RP0 ;Bank 0
        movlw   b'00000111'     ;comparator off
        movwf   CMCON0  ;digital IO
        bsf     STATUS,RP0 ;Bank 1
        clrf    ANSEL   ; digital IO

        movlw   b'001111'      ; sets up which GPIO pins are inputs and which
        movwf   TRISIO          ; are outputs

        movlw   b'00000111'      ; option bits
        movwf   OPTION_REG
        bcf     STATUS,RP0 ;Bank 0
        retlw   0
;Program Start:
        call   Init
        bsf     GPIO, 4  ; turns on LED

        btfss   GPIO, 0 ;test pin 7, next if pin is 0
        goto LEDoff
        bsf     GPIO, 5 ; turns on LED
        goto Main

LEDoff  bcf     GPIO, 5 ; turns off LED
        goto Main


Assembly of the .asm to a .hex:
>gpasm p12_led.asm

Write it to the PIC12 using:
wine “C:\Program Files\PICPgm\WinPICPgm.exe”

and wire it up as shown in the video!