Beyond Logic

How does the Microchip ICD Work?

The Debug Capabilities of the PIC16F877

The PIC16F877 was the first Microchip Microcontroller to have in-built debugging capabilities. The actual silicon area used for the debug facilities is tiny compared to the major peripherals. Microchip initally kept the operation of the debug facilities pretty well under raps, but has recently released the specifications under DS51242A.

Making your own ICD

Fancy making your own ICD? I wouldnít imagine it would be any cheaper, considering the development time. Microchip has released the silk screen overlays and schematics for their ICD in Appendix A of the MPLAB ICD Users Guide (DS51184A). The code was suppose to be restricted, preventing you from making them. However d877.hex first appeared in the MPLAB 4.x directory. Upon closer examination of this file, you discover itís the source code for the ICD complete with embedded (retlw x-opcode) debug code which is loaded into the target at 0x1F00.

The code is for a PIC16F876 device which is the little brother of the 16F877. The PIC16F876 is a 28 pin device with a few less I/O ports, and the Parallel Slave Port. What this means, is you can use a PIC16F877 as the heart of the ICD if you are having difficulties sourcing the 16F876.

What Microchip hasnít released is the licensing information for the D877.HEX. Is it freely available for private and commercial use? Iíve already seen some making derivatives of the I CD for commercial gain. My guest would be that they are using the D877.hex in itís raw unaltered form, bearing in mind that dis-assembly is most cases is not legal either.

Revisions for the ICD

When Microchip released MPLAB v5.00 in March 2000, they shipped new firmware for the ICD, firmware version 2.04 (MPL876.HEX in your MPLAB 5 directory). This gave the end user support for the PIC16F873/874, supposedly better serial communications and the ability to perform flash upgrades over the wire with one mouse click.

They also released a Engineering Technical Note ETN#21, ďUpgrading MPLAB ICD Flash and Operating ICD below 4.5VĒ. This included two modifications, one for better support when operating the ICD from a supply voltage lower than 4.5V and the other to enable flash upgrades.

The first modification involved changing R21 and R22 which make up a voltage divider monitoring the VPP. These resistors were increased by a factor of 10 to reduce the load when low currents are available as a result of running the unit from under 4.5V.

Most of the early ICDís included OTP 16C73B. These of course cannot be updated over the wire, thus the second modification is to replace the 16C73 with a 16F876 which is pin to pin compatible, only in a re-programmable flash version. This enables to user to update the code at a later date.

Making your own modifications

The only reason for making your own ICD is to make some modifications in the process. Some users are unhappy with the exposed board. You could quite easy provide mounting holes to enable the board to be mounted inside a small box making the ICD more rugged.

Others wish to use the ICD to program 16F877 and 16F876. While you can use the ICD cable and header, and external power source needs to be provided. Iíve seen many provide a built in power supply. Speaking of power supplies, if you provide one for your ICD you could look at doing away with the VPP charge pump and also providing the 13V Programming Supply.

What have I done myself? Well I couldnít help miniaturising it. Iíve replaced most of the parts with surface mount equivalents. Most of the transistors have been replaced with digital transistors that do away with the two bias resistors for each device. Iíve also placed a power supply on board which does wonders for ICSP.

Now on the cards is a USB version of the ICD based on the FTDI FT8U232AM. See USB with the simplicity of RS-232 for further information on these devices. FTDI have virtual COM port drivers which allow the USB based ICD to integrate with MPLAB as if it was talking on a Serial Port. Needless to say, USB will offer a bus powered device which will take some of the load of the circuit under test, especially if it is a battery powered device. USB will also be more flexible for use with Laptops etc.

Photo of the author's redesigned ICD complete with on-board power supply

Links - Linux Software which can program 16F87x devices using the ICD. Geir Thomassen has been examining the protocol between the ICD and MPLAB.


John Andrews (, John Day (
"Debugging, In-Circuit Style", Circuit Cellar #109 August 1999

DS51242A On-Chip Debugger Specification, Microchip Technology Inc 2001.

PICmicro Firmware is copyrighted by Microchip Technology Inc., and is intended for Microchip Development Tools only. Modified firmware code will not be supported by Microchip Technology Inc.

Copyright 2001-2005 Craig Peacock 15th June 2005.