Picprog 1.1 documentation


  1. Background reading
  2. Requirements
  3. Hardware
  4. Installation
  5. Usage
  6. Burning PICs
  7. Reading PICs
  8. Exit values
  9. Internals
  10. Changes
  11. Other available programmers
  12. Available languages
  13. Other software
  14. Copyright notice
PIC84 is a fine chip that is especially easy to program with a simple device attached to a parallel or serial port. Because of the EEPROM memory, it is also easy and fast to erase and reprogram without need for UV equipment. This makes it very popular among electronics hobbyists.

At the moment this is the second implementation of an PIC programmer for Linux that works with the very simple and cheap serial port programmers. The first one I know was made by Ralph Metzler. My programmer was originally designed for PIC16C84 and PIC16F84 chips back in 1997, and since then I have implemented other chips without access to actual hardware. I hope it works.

1. Background reading

You really should take a look at the Microchip www-pages and read the device datasheets and programming specifications there.

Today maybe the best source for PIC information is the home page of PICLIST discussion group. Also historically a good collection of links and software for PIC was in David Tait's PIC links page and in Rick Miller's GNUPIC pages. I have also documented here the software I took a look at back in 1997. I have focused into Linux support, so I haven't ever used any DOS software mentioned.

2. Requirements

Serial port pic16c84 programming hardware
See the hardware section. This device is connected to a usual serial port of your PC, and is the same device as used with many DOS PIC burning programs.
g++ compiler for Linux
This program is written in C++, so you need a C++ compiler to compile it. This you should already have installed on your Linux system.
Linux kernel version 2.0.32 or 2.1.45 or later.
This programmer needs some functionality in Linux serial driver that as of kernel versions 2.0.32 and 2.1.45 is available in standard kernels. The programmer uses TIOCSBRK and TIOCCBRK ioctl to control the state of TxD serial port output accurately. These ioctl's are standard on BSD flavor unixes, like SunOS 4, but they still are unimplemented on many serial drivers in Linux kernel. Only the standard serial port is known to work by me.
A compiler for PIC
Your assembler, or C compiler, or whatever, should produce either Intel IHX16 or IHX8M format hex files. For assembler I recommend picasm105 by Timo Rossi.

3. Hardware

Use a serial port programmer device with the following pinouts:
Programming voltage, pin /MCLR
Clock pulse, pin RB6
DTR (output), CTS (input)
Serial data, pin RB7
A very good programmer like this is for example jdm84v23 designed by Jens Madsen.

I made a minor modification to the jdm84v23 schema and pcb mask, because I thought D4 was stressed on positive clock pulses - it short circuits the rs-232 RTS pin to GND. I added a 10k resistor there. I believe it does not do any harm. But it also is not absolutely required, as the clock pulses are short and rs-232 is protected for short circuits anyway.

The schemantics diagram:

The 300 dpi pcb mask:

4. Installation

First, if you have not yet done so, download the picprog-1.1.tar.gz package, if you do not already have it.

Check your system against the requirements mentioned above.

Untar the archive and change to the source file directory. You should only have to type:

and the program should compile without errors or warnings. If it does not, please check that your compiler, c and c++ libraries and utilities like make are of a reasonably recent, bugfree and compatible version.

After compilation you can, as a root user, just type:

make install
to install the program and manual page to /usr/local. Or just copy the files picprog and picprog.1 manually.

5. Usage

To get information about the usage of the program, just type the program name. These options give information about the program:
--warranty, --copyright, --help
Display warranty or copyright information or the help text.
--quiet, -q
Do not display the copyright notice.
The actual operation of the program is controlled by the options --input-hexfile and --output-hexfile. If the former is present, the program acts as a burner. If the latter is specified, the program will read the contents of the PIC device eeprom memories. Both may be specified on the same command line, in which case the chip is first programmed and then read.

6. Burning PICs

Simple instructions:
  1. Compile your program into a hex file.
  2. Insert the pic16c84 chip into the socket in the programmer, or connect the in-circuit programming cable to your device.
  3. Connect the programmer device to a serial port.
  4. Burn the program with command:
    picprog --burn --input file.hex --pic /dev/ttyS1
  5. If the above command produces error output that suggests that the chip was in the code protection state, retry with the following command:
    picprog --erase --burn --input file.hex --pic /dev/ttyS1
The burning options are:
To be able to reprogram a PIC device that has previously been programmed into Code Protection state (Control Word fuse bit 0x10 cleared), it is necessary to bulk erase the chip. It is done by adding this option to the command line. The default is not to bulk erase the chip.
Actually program the device. Without this option only the syntax of input files and command line options is checked.
--input-hexfile path, -i path
Specifies the input hex file. The file can be either in IHX16 or IHX8M formats, the format is automatically recognized.
--cc-hexfile path, -c path
Only necessary for debugging. Outputs the same data as was read from the input hex file.
--pic-serial-port device, -p device
The device name of the serial port the programmer is connected to. Default is /dev/ttyS0.
--device chipname, -d chipname
The chip type. Currently supported by code are pic16c84, pic16cr83, pic16cr84, pic16f83, pic16f84, pic16f84a, pic16f87, pic16f88, pic16f89, pic16c61, pic16c62, pic16c62a, pic16c62b, pic16c63, pic16c63a, pic16c64, pic16c64a, pic16c65, pic16c65a, pic16c65b, pic16c66, pic16c66a, pic16c67, pic16cr62, pic16cr63, pic16cr64, pic16cr65, pic16c620, pic16c620a, pic16cr620a, pic16c621, pic16c621a, pic16c622, pic16c622a, pic16f627, pic16f628, pic16ce623, pic16ce624, pic16ce625, pic16c641, pic16c642, pic16c661, pic16c662, pic16c71, pic16c710, pic16c711, pic16c712, pic16c715, pic16c716, pic16c717, pic16c72, pic16c72a, pic16cr72, pic16c73, pic16c73a, pic16c73b, pic16c74, pic16c74a, pic16c74b, pic16c76, pic16c77, pic16f73, pic16f74, pic16f76, pic16f77, pic16c432, pic16c433, pic16c781, pic16c782, pic16c745, pic16c765, pic16c770, pic16c771, pic16c773, pic16c774, pic16f870, pic16f871, pic16f872, pic16f873, pic16f873a, pic16f874, pic16f874a, pic16f876, pic16f876a, pic16f877, pic16f877a, pic16c923, pic16c924. I do not know if they all work or if any other than pic16c84 and pic16f84 works, these I have tested myself. Default is pic16c84. To add a new supported chip type, just edit the table in Only things to know about the chip are the programmable program and data memory sizes.
The hex file addresses (in IHX16 format) used are the ones specified by Microchip. This example is for pic16c84 / pic16f84:
Program memory, 1024 words * 14 bits.
ID locations.
Control word fuses
Data memory, 64 bytes * 8 bits.

7. Reading PICs

Simple instructions:
  1. Insert the pic16c84 / pic16f84 chip into the socket in the programmer, or connect the in-circuit programming cable to your device.
  2. Connect the programmer device to a serial port.
  3. Read the device with command:
    picprog --output ofile.hex --pic /dev/ttyS1
The reading options are:
--output-hexfile path, -o path
Specifies the output hex file. The file will be written in IHX16 format, unless otherwise specified by the --ihx8m option.
When reading the PIC device, do not consider the all-ones memory locations to be programmed, and skip them in the hex file output. This skips the program memory locations that have hex value 0x3FFF and data memory locations that have hex value 0xFF.
--ihx16, --ihx8m
Select the output hex file format to be either ihx16 or ihx8m, respectively. The default is ihx16.
--pic-serial-port device, -p device
The device name of the serial port the programmer is connected to. Default is /dev/ttyS0.

8. Exit values

Exit values are as defined in :
EX_OK, 0
no error
command line option syntax error
file or serial port io error, or after-programming verification failed
input file syntax error, not in IHX8M or IHX16 format
unable to find input file or file open failed
user or signal interrupted programming

9. Internals

Source files and their contents:, .h
class picport: manipulates the serial port hardware. With this class you can execute programming commands like read a word, program a word, increment address etc. Look at picport.h for details., .h
class hexfile: contains a PIC memory image. You can load and save the contents of this class to a file, and you can program and read it from the PIC chip. Programming uses class picport., h
class program: just some generic option handling.
Just the main () to parse command line and call class hexfile to do its job.

10. Changes

This document has not changed much since it was first released with the 1.0 programmer. The changes include some information about new software and more accurate links to PIC information. New options to select type of device other than pic18c84 are also present.

11. Other available programmers

serp-0.5 (serp-0.5.tgz)
A serial port programmer software for Linux, written in c++, author Ralph Metzler. It directly handles the serial hardware, standard 16450/16550 compatible uarts, and needs root priviledges for that.
jdm84v23 (,
A serial port programmer, schema (gif) and DOS software. The hardware manages with rs-232 interfaces with low voltage output, even as low as ±7V is fine. 300dpi layout and PCB masks available at the home page. Author Jens Madsen. This is the programmer I use with linux with my own software.

I did a minor modification to the jdm84v23 schema and pcb mask, because I thought D4 was stressed on positive clock pulses - it short circuits the rs-232 RTS pin to GND. I added a 10k resistor there. I believe it does not do any harm. But it also is not absolutely required, as the clock pulses are short and rs-232 is protected for short circuits.

pip-02/com84 (
A serial port programmer, schema (gif) and DOS software. Needs +12V rs-232 positive voltage level.
prog84-0.9 (prog84-0.9.tar.gz)
A parallel port programmer, schema (postscript) and software for Linux, Written by Wim Lewis: or This is based to the dvtait84 package.
dvtait84, pic84faq (,
A parallel port programmer, schema (ascii) and DOS software with basic and turbo-C sources included. Author David Tait. He has a lot more stuff, and some new designs to program other PICs in his links page.
mjcox84 (
A parallel port programmer, no schema, written in assembler for DOS with 486/33 timings. Very limited. Author: Mark J Cox,
ngoodw84 (
A parallel port programmer and disassembler, no schema, seems to use pins DATA1 = data and DATA2 = clock and needs external programming voltage. From Everyday Practical Electronics, February 1996, author Derren Crome. Disassembler by Nigel Goodwin
Minimized PIC16C84 Programmer
Parallel port programmer, DOS software, needs external 13V power source. Author Stephen M. Nolan.

12. Available languages

Free compilers

picasm105 (picasm105.tar.gz)
Assembler in ANSI-C by Timo Rossi. Outputs both IHX16 and IHX8M. Looks pretty nice. You can also find disassemblers for 12 bit and 14 bit PIC's there.
asm_c84 (
Assembler in ANSI-C by James Cleverdon, No INCLUDE, no IF, outputs IHX8M. The manual.
I have heard of free SIL language (something like Pascal/M2) compiler for PIC.

Commercial demos

HI-TECH Software C compiler
A demo is available of their currently beta version compiler.

13. Other software

PIC simulator for 16Cxx

14. Copyright notice

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

The author may be contacted at:


Please send any suggestions, bug reports, success stories etc. to the Email address above.

Best viewed with any
Jaakko Hyvätti/ 40 5011222