ICSP does not require a different programming protocol. A socket-based programmer already produces the required signaling, but sends it to the socket rather than through wires. Most socket programmers can be used as an ICSP by rigging wires from the socket to the application circuit.



For example, the original JDM2 programmer (here: http://www.jdm.homepage.dk/newpic.htm ) can be used to do ICSP programming by bringing the 5 required signals to a header. This can be seen in the programmer here: http://www.belza.cz/digital/jdm.htm . To keep things handy, I remade this design in Eagle Cad and attached it to this instructable. Watch the transistor orientation, one of the footprints may be incorrect (I made this more than a year ago, I don't remember anymore).



Similarly, my updated JDM2 programmer (here: https://www.instructables.com/id/EN28KZDDYVEP286GRI/ ) can be used for ICSP by sticking wires into the DIP sockets and connecting them to the target PIC.



*****JDM2s use funky voltages...connect it to the circuit WITHOUT external power (or even ground) connected to the application circuit. Remove the ICSP connections before applying power. Failure to do this is not destructive, but will result in failed programming*******



Another option is a (semi-)proper ICD programmer. ICD allows you to control firmware execution on your PIC by setting break points in the code or reading out memory and port values. An ICD can also animate the execution of code, power the application circuit, and program the PIC. It does all this through the same 5 pin ICSP connection we have discussed. Several ICSP clones that you can make yourself can be seen here: http://www.icd2clone.com/wiki/Main_Page . I built the PiCS (rev B) a few months ago and love it.

