PIC ICSP gives you a convenient way of programming PIC Micros without removing the chip from the development or production board.
Note: ICSP stands for In Circuit Serial Programming.
All you need is a programmer that provides the ICSP connector (usually a six pin molex/dupont connector) which you plug into your target board. For example PicKit2/Pickit3 uses the ICSP connections shown in the diagrams below. .The programmer is controlled from the PC using an IDE and for the PicKit2/3 this will be MPLAB X IDE. This program loads up your hex file (that you want to burn into the PIC device) and sends commands to the programmer to do that job via the ICSP signals that you connect to your PIC device (see below).
Note: This is for the 16F877 and other 40 pin chips that have the same pinout for the ICSP connector e.g. 18F2550 (or at least MCLR at top left and PGD and PGC at top right).
The PIC ICSP reset circuit is an over the top over-protected circuit that you would use if you were being ultra cautious or producing a developed PCB design. It stops high volts going back to the 5V power line (D2), has a fast shut down when 5V is off (D1) - allows fast rest from power Off-to-On and has a defined rise time for a delayed reset start.
As you can see pin 6 on the ICSP connector - the PGM connection - is not connected. PGM is a specialised programming control pin, useful only in a production environment, and is used for low volt programming (See Section below on PGM). PIC chips come with the PGM interface enabled so that a PIC chip can be inserted into a production board and can be programmed by another device at the system level voltage. So you could have a situation where several PIC devices are connected to a master device and are re-programmable in the unit possibly over the web etc.
The important point is that a high voltage programmer such as a PICKit2/3 can always override the PGM interface and program the chip regardless of whether the PGM input is high or low and for single board use you set the PGM control inactive - this is a setting within the programming software such as MPLAB X etc. If the LVP mode is not turned off then the pin is not usable as normal I/O it can only be used for PGM signal.
Here is a simplified ICSP connection for lab development:
Note: When you develop a board quickly e.g. on a solderless breadboard you only really need a 10k pullup from MCLRn to 5V - sometimes you will program that pin as an input in which case the reset is handled internally. With the 10k only; When programming, Does it put high voltage against the 5V? - Yes, however - the lab bench PSU will be fine (since there is (13V-5V)/10k ~ 10/10k = 0.1mA flowing)! - Put a diode in if you really want (you do loose 0.6V though).
Alternatively turn off the PSU and power the chip from the PicKit3 (the power setting is in MPLAB X IDE).
PIC ICSP provides 6 connections from the pic ICSP programmer to your board as follows :
|1. VPP (or MCLRn)||Programming voltage (usually 13V).|
|2. Vcc||Power (usually 5V).|
|3. GND||Ground (zero volts).|
|4. PGD - Data||usual port and connection RB7.|
|5. PGC - Clock||usual port and connection RB6.|
|6. PGM - LVP enable||usual port and connection RB3/RB4.|
Note: With the connections made in this order on the connector it will not matter if the connector is placed the wrong way round as GND and VCC are then applied to clock and data. If VCC and GND had been at opposite ends of the connector then there would be a problem.
Vpp connects to the reset input of the pic microcontroller labelled MCLR. During programming or verify this signal is raised to the programming voltage (13.5V) - or VCC+3.5V. This signals to the microcontroller that programming/verification is about to start and for older parts, supplies current.
Note: Older pic micros used this line to directly power the programming circuit that updates the Flash memory. So this connection had to supply some current. With the newer parts that allow LVP (Low Volt programming) the programming voltage is generated internally so the Vpp signal from the pic ICSP is only used as an indicator i.e. it doesn't have to supply current.
This connection may supply power to your board - usually using a 5V regulator (probably a 7805). This is ok for some use as you can develop a prototype board without needing any other power supply (just a power brick that plugs into the pic programmer circuit).
The only problem with it is that the programmer circuit is not designed for your circuit (does it have a heatsink) and it can also introduce noise to your circuit. If the programmer uses a 78L05 then you will only get 100mA maximum current output.
The ground reference - 0V.
These are the signals that do the work. Data (PGD) and clock (PGC) transmit data to the pic micro. First data is sent either high or low voltage (0/1). After a suitable time the clock is strobed low to high - rising edge clocking the data into the microcontroller.
PGD is also the line driven by the pic micro during verify i.e. it is bi-directional.
You do not need to worry about this pin - it is for Low Volt Programming (see below).
The purpose of this pin (on the ICSP connection) is to hold PGM low so the microcontroller does not enter LVP mode. It will usually be done using a pull down resistor e.g. 10k.
Note: If you program the microcontroller with LVP mode off then this signal will have no effect.
Note: PIC microcontrollers shipped with LVP enabled - so if you use a brand new chip you can use it in LVP mode. The only way to change the mode is by using a high voltage programmer.
It is there in case you use a device that is enabled for LVP - low volt programming. Basically when you use a new device that has never been programmed before LVP programming is enabled by default (p58, p148 - 16F88 datasheet DS30487C) so the resistor holds LVP mode off (low). This is implied in other datasheets and not specifically stated e.g. for the 18F2550.
However in MPLABX If you program the chip using a project file (from the on site projects) it is turned off anyway because I turned it off in MPLABX project settings. Once programmed off it is never turned on again unless you change it in a compiler project setting.
You can forget about PGM especially if you have programmed the chip for the 1st time using a high-volt programmer (e.g. pickit3). Remember you can always program the device regardless of the LVP setting using a high-volt programmer i.e. LVP is an additional feature. If the LVP mode is not turned off then the pin is not usable as normal I/O it can only be used for the PGM signal - which is why you really want to turn it off.
The purpose of LVP is to allow complete programming using only Vcc i.e. 5V and no higher voltage and that means you don't have to have a dedicated power supply voltage e.g. 12 V to program the device. i.e. you could program multiple devices on a board from one central microcontroller using LVP.
The actual LVP control is in the CONFIG1 register ( p130 16F88 datasheet DS30487C - probably different for other devices) so it is either set in the IDE (MPLABX etc.) or using a #pragma directive (see your compiler documentation).
Note: You can only program the LVP bit off using a high volt programmer.
Using LVP means you do not need a bootloader so valuable program memory is saved - but you have to arrange the hardware to do it..
Note that the diagram from pic ICSP application note 'DS33023A' specifically goes out of its way to not design it for you saying RB6 and RB7 should be isolated but this depends on your circuit! This is not very helpful so I have included the circuit I use on my development board (See the diagram shown earlier):
To ensure you can program and verify correctly two 10k resistors isolate the programmer (and RB6 and RB7) from the rest of the circuit i.e. they stop signals at the other side from interfering with RB6 and RB7 during programming. If you don't use the isolation resistors then loading or driving the pins can stop programming all together.
For example if you put an LED on RB6 (PGD) that draws 20mA when on. The output voltage (when the output is on) will be pulled so low that the pic ICSP programmer will not be able to read back the desired voltage i.e. it will give a verification failure.
Click PIC ICSP Setup for more details on how to setup your ICSP system.
Click PIC Parallel Port Programmer for a Parallel port (legacy) PIC ICSP programmer project schematic.
Arduino Battery Charger: A very useful project that lets you charge 'un-rechargeable' alkaline batteries!
The Essential Guide to the 74HC595; What it is and how you can easily use one in any of your projects.
How to use the MCP23017 to increase your I/O by 16 pins (or more) and use its interrupt system.