incredible explanation my friend, thank you very much!
to answer your question (or at least if i understand it right) im not programming a programmer. im using the pocket AVR programmer by sparkfun (link in my first post) to program a custom atmega32u4 circuit board i created.
i "think" the pocket AVR programmer is qualified as a 'real' programmer? is it not? please let me know if it isnt :o lol
you did kind of loose me on the last part. if im not programming the programmer, do i need to reset the vector points?
if using the avr programmer i mentioned, should i be able to simply change the fuses, upload with full access to the atemga32u4, and reprogram it again and again without editing? then if i want the bootloader back on the atmega32u4, burn bootloader? if this is the case then i think mission accomplished :)
OK, let me try to explain it. I'll use the Arduino UNO and ATMega328p as my example, but the idea is the same for all of them.
In the "high fuse", bit 0 is called "BOOTRST". If the bit is programmed (i.e. the bit is "0" or "cleared"), then upon reset the CPU jumps to the bootloader address (which is located at address 0x7E00 in an Arduino UNO). That location is 512 bytes below the top of memory because the UNO bootloader is 512 bytes in size.
The address that the reset goes to is determined by the "BOOTSZ1" and "BOOTSZ0" bits in the high fuse (bits 2 and 1 respectively - which are both "1" in this case).
So, let's say you wrote your own bootloader with extra features (i.e. larger) and it took 1024 bytes instead of 512. Well, you would look up in the data sheet and find that "BOOTSZ0" would need set to "0" to set the boot block start address to 0x7C00 instead of 0x7E00. (those of you who know keep quiet - explanation is below!)
And of course, the reset vector now also jumps to 0x7C00 instead of 0x7E00 (make sense so far?).
Now, AVR/Arduino PROGRAMS (sketches) are loaded into flash memory starting at 0x0000. So what the bootloader does upon reset is check "is someone trying to upload a sketch?", "wait", "nope, jump to 0x0000 and run what's already there".
But if you DON'T use a bootloader and instead program with a programmer (in order to use all the memory), the AVR will jump to the bootloader section, not find anything and crash.
What you need to do is tell the chip "you have no bootloader, jump directly to 0x0000 upon reset" and you do this by setting the BOOTRST bit to "1".
Now, looking at the data sheets, you can get confused very easily. Atmel usually enables an option by PROGRAMMING a certain fuse bit. But a programmed bit is "0" which we normally think of as "cleared" or "disabled". It's bass-ackwards and confusing.
To give you another example to help clarify, look at the CKDIV8 fuse bit which controls whether the CPU boots up at full clock speed or "crystal / 8" speed. To enable the "divide clock by 8" feature, you PROGRAM the CKDIV8 bit (which, confusingly, sets it to "0"). This is a very important concept to get... usually "Feature Enabled" = "Feature Bit Programmed" = "Feature Bit is 0".
Another goody... the bootloader area memory addresses are specified as WORDS, not BYTES in the datasheet. So, for example, the Arduino UNO bootloader takes up 512 bytes, the datasheet says that it takes up 256 WORDS and the bootloader section starts at WORD 0x3F00 (which is BYTE address 0x7E00) and therefore the fuse bits for that are "BOOTSZ1=1" and "BOOTSZ0=1" (which is Atmel's perverse thinking means those bits are UNPROGRAMMED).
Actually, I know why they did it that way... EEPROM and FLASH memory cells are normally all ones (an erased byte is 0xFF) and you program bits LOW. To make a bit high, you have to erase the whole byte to 0xFF, then program low the bit(s) you want to be 0.
In fact, some flash memory devices can't even be programmed byte by byte. If you want to change one byte (or even one BIT) you need to read the entire flash page into a temporary buffer, modify the bits/bytes in the buffer, erase the entire flash page, then finally write the updated page data from the buffer back into the flash.
Hope this all makes sense....... :)