Перейти к содержанию
    

дошел просто до пустой функции main(void) - он в функцию входит но из нее не выходит и висит - что это может быть?
Где-то ошибка. Попробуйте получившийса .hex пройти по шагам в симуляторе AVRStudio. Сразу увидите - куда код входит и куда выходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эмм ошибка в пустой функции??? Кстати в АврСтудио все норм, как и должно быть а в железе чушь ((( Уже 5 ночей бьюсь ничего не помогает... Контроллер скажете вы, увы, пробовал на 3-х - один результат.

Я грешу на настройки компилятора или фьюзы. Может есть какой нить заковыйрестый фьюзик?

Вообще был бы благодарен если бы кто нить откомпили пустую функцию main в IAR 4 - тогда сразу бы нашел у себя ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может есть какой нить заковыйрестый фьюзик?

 

А что там у вас с M103C ?

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что там у вас с M103C ?

 

Анатолий.

 

Был запрограммирован (PonyProg), щас распрограммировали и... ЗАРАБОТАЛО!!! Ребята вы боги!!! :yeah:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Breese

были приколы с "пустой функции main(void)". она была заоптимизирована. можно указать чтоб она не оптимизировалась или вставить в нее переход по метки, расположенной в main

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот и у меня пришло время писать boot loader, начитавшись и натренировавшись столкнулся с такой проблемой... бут лоадер грузит программу с адреса 000000 и вроде запускает, первые команды проходят а дальше тишина, такое впечатление что не работают прерывания, может кто сталкивался с подобным - помогите - сижу уже битый час и все никак..

(компилятор IAR проц ATMega1280)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такое впечатление что не работают прерывания,
Или вы переключили вектора на нулевые адреса, но забыли отключить какое-то из прерываний загрузчика. В результате оно стало попадать на пустой обработчик, а часть прерываний (TXE, UDR) не сбрасываются просто от самого факта входа в обработчик. Поставьте заглушки на все неиспользуемые вектора и дергайте в каждой заглушке своей ногой. Легко найдете, в каком прерывании вы зацикливаетесь. Если свободных ног мало, но есть осциллограф, можно наблюдать разные затычки на одной ноге так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей спасибо за подсказки...

Все оказалось тривиально просто, после возвращения из бут лоадера не переключился бит IVSEL, и вектора остались в бут области, переключив этот бит в 0 все заработало на ура....чего и всем желаю... :)

 

------------------------------------------------------------------------------------------

__disable_interrupt();

char temp;

temp = MCUCR; // Get MCUCR

MCUCR = temp|(1<<IVCE); // Enable change of Interrupt Vectors

MCUCR = temp|(1<<IVSEL); // Move interrupts to Boot Flash section

-------------------------------------------------------------------------------------------

__disable_interrupt();

temp = MCUCR; // Get MCUCR

MCUCR = temp|(1<<IVCE); // Enable change of Interrupt Vectors

MCUCR = temp&(0<<IVSEL); // Move interrupts to 0x00000 Flash section

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

после возвращения из бут лоадера не переключился бит IVSEL
То есть как это? Вы его переключали, а он сопротивлялся? ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеется основная программа в ATmega16, которая по команде с UARTа стирает одну страницу, вызывая следующую подпрограмму:

void erase_test(void) @ "BOOTSECTION"
{
_WAIT_FOR_SPM();        
_ENABLE_RWW_SECTION();
_PAGE_ERASE(0x2800);
}

Непосредственно перед вызовом прерывания запрещаю. Сама подпрограмма лежит в области загрузчика (в линкере секция BOOTSECTION прописана "куда надо"), страницу действительно стирает, но назад в основную программу не возвращается. Контроллер, кстати, продолжает генерировать ШИМ по одному из таймеров.

В чём может быть проблема?

 

Добавлю, что по адресу 0x2800..0x2880 (1 страница = 128 байт) нет кода программы, там лежат данные, так что сама себя программа стиранием этой области не портит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но назад в основную программу не возвращается.
Там нужно еще что-то типа unlock делать, насколько помню - чтобы область приложения стала доступной на чтение. В avr-gcc это boot_rww_enable();

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей Борщ, спасибо.

Похоже, надо делать так:

void erase_test(void) @ "BOOTSECTION"
{
_PAGE_ERASE(0x2800);//стираем страницу
_WAIT_FOR_SPM();//ждём выполнения команды SPM
_ENABLE_RWW_SECTION();//активируем RWW-секцию
_WAIT_FOR_SPM();//опять ждём выполнения команды SPM        
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавлено: теперь работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...