Мало данных... _PAGE_WRITE - это стирание+запись?
Можно попробывать перед началом записи разрешить RWW_SECTION:
_ENABLE_RWW_SECTION();
for(int i=0; i < 256; i+=2)
{
_FILL_TEMP_WORD(0x0000+i, 0xFFFF);
}
_PAGE_WRITE(0x0000);
_WAIT_FOR_SPM();
_ENABLE_RWW_SECTION();
Хотя может и не в этом дело.
Покурил даташит, предположил, что контроллер не позволяет изменять свои вектора, если они определены в секции Application, а программа стартует с секции Bootloader.
Это врядли, разве что в атмеле решили для ATmega640 по-другому сделать...
P.S. Чем результат смотрите?