First of all, see this weblog post for an overview of what ISP is, why you’d want to know, and when you need it.
There have been quite a few posts about ISP on this weblog over time – all tagged, so they can be reached via this link: https://jeelabs.org/tag/isp/.
I’ll summarize here, since particularly the different sketches floating around by now might be a bit confusing.
The ZIF socket is a way to connect to chips before they have been soldered into a circuit. There’s one for through-hole DIP chips, and one for 32-TQFP SMD chips:
Once soldered into a circuit, you can use an I(C)SP programmer, which not everyone has. So I created a couple of different options based on a JeeNode (can also be an RBBB or Arduino) to perform the same function.
My first trial was a hack with the isp_flash.pde sketch, which then led to the Flash Board (info). The nice thing about this board is that it has 128 Kbyte of EEPROM on board – enough to hold the complete programming instructions for an ATmega168 or ATmega328.
One way to use the Flash Board is as capturing ISP programmer: you send a sketch to it as if it were an ISP programmer, and then you can disconnect it and use it repeatedly to upload that sketch to other boards via ISP:
I used this to build a 4-fold Multi-ISP programmer to program all those gazillion ATmega’s needed for JeeNodes:
Took a few attempts to get all the bugs worked out, but now it works perfectly.
But there’s a much simpler way to do this, if all you want is to fix a JeeNode, occasionally:
… or use an Arduino:
These two ISP setups use an isp_repair.pde sketch, which has as novelty that it includes the sketch and bootstrap its needs for programming – as data array in flash memory. So all that’s needed is: connect the two boards and power up the master. No need to use the Arduino IDE’s “Burn Bootloader” command or anything.
Then came OptiBoot, which is compatible with the Arduino Uno, and smaller/faster. This is a relatively new boot loader so you might want to update your current JeeNodes – even though an ISP programmer isn’t normally needed for development.
I updated the isp_repair.pde sketch, and then fixed a few remaining problems with it:
And finally, I added a LiPo battery, and 4 config switches, to end up with this tool:
On the software side, the most recent design is called isp_repair2.pde. It supports two different sketches, up to four different bootstrap loaders, and setting the fuses either as 16 MHz crystal or optimized specifically for ceramic resonators.
The include files with the bootstraps included with these sketches are generated from HEX files created by the Arduino IDE. This is done with a small Tcl script called hex2c.tcl, which is located in a slightly older isp_prepare example sketch folder. It’s not needed for normal use, only when one of the boot loaders changes.
Phew. Still there?
In a nutshell: if you need to re-flash your ATmega, pick one of the above options to hook things up, and use the isp_repair2 sketch in the Ports library. By default, it’ll upload a blink demo sketch and the OptiBoot loader.
I tried to update an RBBB kit to optiboot, which has the same chip on it but somehow it won’t update to optiboot. It just dies and I can’t seem to program it after that as an arduino uno and/or as an older arduino.
I can update the old bootloader back though and when I do that it works fine again, but without optiboot.
Could this be a problem with voltage levels?
Hmm… I’ve posted a Q about this on the forum. Can’t quite explain what’s going on – it’s as if the fuses don’t get adjusted properly.