Цитата(alag57 @ May 19 2010, 16:22)

Кто вылетает? Студия? Отладчик виснет? Винда синий экран кажет?
Как-то бы поподробней

Вылетает на адрес сброса. Если там установлен 0, то с 0 начинает команды выбирать. Если установить 0xF000, то пишет, что оттуда неверный опкод прочитан (это приложение, у меня загрузчик в другом проекте)
Цитата(alag57 @ May 19 2010, 16:22)

У меня при живой программе все работает нормально. Может код для опробования выложить?
Интерес в том, чтобы разобраться, в чем проблема. Может быть это все-таки не новость?
Сейчас ещё поэкспериментировал. Оказывается вылетает на подсчёте CRC16 FLASH.
Код
.DEF RBN0=R12
.DEF RBN1=R13
FlAC:; готовимся к подсчёту CRC-16 FLASH Приложения
eor RBN0,RBN0; обнуление CRC
eor RBN1,RBN1; аккумулятора
ldi ZL,low(TbFlAd<<1); Z - ук-ль на таблицу блоков
ldi ZH,high(TbFlAd<<1); с подсчётом CRC во FLASH
movw R1:R0,ZH:ZL; сохраним адрес в R0, R1
FlAC1: movw ZH:ZL,R1:R0; ук-ль на таблицу адресов
lpm YL,Z+ ; адрес начала
lpm YH,Z+ ; очередного блока
add YL,YL ; перейдём от
rol YH ; слов к байтам
; при увеличении кода сверх FFFF так работать не будет
brcs FlAC3 ; C=b15=1 -> посчитано, на сравнение
lpm XL,Z+ ; адрес конца
lpm XH,Z+ ; очередного блока
add XL,XL ; перейдём от
rol XH ; слов к байтам
movw R1:R0,ZH:ZL; сохраним адрес таблицы в R0, R1
sub XL,YL ; X = конец - начало (в байтах)
sbc XH,YH ; = кол-во байт в блоке (сч-к)
FlAC2:; цикл вычисления CRC байта из FLASH
wdr ; сбросим Watchdog (попытка справится с отладчиком)
movw ZH:ZL,YH:YL; адрес во FLASH (байтовый)
adiw YH:YL,1 ; inc адреса счётных байт
lpm ZL,Z ; очередной байт из FLASH (токо до FFFF!)
eor ZL,RBN1 ; проксорим данные с.б. старого CRC
ldi ZH,Hi1021; там с.б. таблицы 2110
elpm RBN1,Z ; это с.б. т.к. таблица переставлена
eor RBN1,RBN0; получили с.б. нового CRC
ldi ZH,Lo1021; там м.б. таблицы 2110
elpm RBN0,Z ; м.б. CRC просто из таблицы
; вычислено CRC очередного байта
sbiw XH:XL,1 ; уменьшим счётчик
brne FlAC2 ; циклимся (подсчёт CRC-16 блока)
rjmp FlAC1 ; циклимся (переход к след. блоку)
FlAC3:; CRC-16 подсчитано - сравним с тем, что д.б.
.....
TbFlAd:; таблица адресов подсчёта CRC у Flash
.dw CRC_B1, CRC_E1; начало (включительно) и конец (исключительно)
.dw CRC_B2, CRC_E2
.dw CRC_B3, CRC_E3
.dw CRC_B4, CRC_E4
.dw CRC_B5, CRC_E5
.dw 0xFFFF; признак конца этой таблицы
RAMPZ0=1, поэтому lpm обращается к 1-й половине FLASH, а elpm ко 2-й.
Во второй половине по адресу Hi1021 лежит выровненная (мл. байт адреса =0) таблица ст. байтов CRC 1021. Lo1021 - соответственно младшие байты. Но это, скорее всего, не сыграет.
Всё остальное в 1-й половине FLASH.
Когда подсчитывается небольшой блок, то всё нормально. Но при большом отладчик вылетает на адрес запуска. Кстати, а не при подсчёте ли того блока, в котором находится эта самая программа? Надо будет проверить.
Прерывания запрещены, введение сброса WD в цикл не повлияло...
Ах да, процессор AT90CAN128.
Последними билдами AVR Studio не пользовался т.к. вообще давно AVR не занимался. Но судя по тому, что глюк с невозможностью программирования загрузчика из hex-файла с помощью AVRISPMK2 кочует из версии в версию, думаю, что и этот глюк присутствует в поздних версиях...