Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: BootLoader, AT90CAN128, WinAvr.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Igor_U
Не возьму в толк где грабли.
Первоначально шью бутлаудер. С помощью него загружаю прикладную программу. Все работает. Но не получается вызвать бутлаудер из прикладной программы. Точнее переход осуществляется (jmp 0x1F000), но программа циклится где-то на инициализации bootloader секции. Вот код:

...
здесь инициализация портов (опускаю, так как все равно поломает)
...
здесь я дергаю ножками, чтобы сообразить где застревает
On_1();
Off_2();
Off_3();
On_3();
Off_1();

// Timer_0 - CTC, prescaling - 64, Force Output Compare A, 2003Гц
TCCR0A=ХХ;
OCR0A=0x73;

// USART0_Init (unsigned int baud)
/* Set baud rate */
UBRR0H = ХХ;
UBRR0L = ХХ;

UCSR0A=ХХ;
/* Set frame format: 8data, no parity & 1 stop bits */
UCSR0C=ХХ;
/* Enable receiver and transmitter */
UCSR0B=ХХ;

/* Write logical one to WDCE and WDE */
WDTCR =ХХ; здесь выставляю флаги WDCE и WDE
/* Turn off WDT */
WDTCR = 0x00;
time = MCUCR;
/* Enable change of Interrupt Vectors */
MCUCR = time | ХХ; здесь выставляю флаг IVCE;
/* Move interrupts to bootloader section */
MCUCR = time | ХХ; здесь выставляю флаг IVSEL;

// прерывание по совпадению для таймера 0
TIMSK0=ХХ;

flags.byte=0;
flags.wait=1; // будем ожидать команду 0xA5, 0xA5
sei();

До цикла расположенного ниже программа не доходит. _1() и _2() вывод переключаются через 250мкс (~3700 тактов). Где и что делает в это время контроллер не понимаю.

while (flags.wait)
{
OffLed();
OnLed();
}
OnLed();
On_1();

Смотрел ассемблерный код. Переключение векторов прерывания и выключение собачки укладывается в 4-х тактный допуск:
1f6dc: 88 e1 ldi r24, 0x18 ; 24
1f6de: 80 93 60 00 sts 0x0060, r24 - это собачка
1f6e2: 10 92 60 00 sts 0x0060, r1 - это собачка
1f6e6: 85 b7 in r24, 0x35 ; 53
1f6e8: 98 2f mov r25, r24
1f6ea: 91 60 ori r25, 0x01 ; 1
1f6ec: 95 bf out 0x35, r25 ; 53 - это вектора
1f6ee: 82 2b or r24, r18
1f6f0: 85 bf out 0x35, r24 ; 53 - это вектора

В общем ничего не понимаю. Самое смешное, что какое-то время эта связка (aplication & bootloader) работала нормально.

Фьюзы: BLB = 3, т.е. ни каких ограничений, все разрешено. Bootsz-1, bootrst-1(aplication), wdton-1.
defunct
Включите WatchDog и зациклите программу. Процессор ребутнется и начнет выполнять код бутлоадера.
Igor_U
Сброс у меня с нулевого адреса. Я таким образом перехожу на прикладную программу из бутлодера. У меня появились подозрения, что может быть контролер переходы по прерываниям делает не корректно. Например если вектора прерываний располагает с адреса 0xF000, то ситуация будет похожия на мой случай. Единственно не понятно, почему все корректно работает при первоначальном пуске. Т.е. до тех пор пока не загружена прикладная программа. В общем пока ничего не понимаю, так как считывал код с контроллера после "зависа". Код совпадает с компиленным, т.е. ничего не портится. Фьюзы так же все в норме. В общем пока загадкаsad.gif
Спасибо за ответ.
defunct
Цитата
Единственно не понятно, почему все корректно работает при первоначальном пуске. Т.е. до тех пор пока не загружена прикладная программа.

Это как раз понятно. Когда флеш пустой, то проц спокойно попадает на код бутлоадера, когда есть программа - то перейдя "через круг" попадает на код основной программы. Вы это видите так как-будто программа циклится..

У меня есть предположение, что Вы промазали с адресом бутлоадера. Либо код бутлоадера располагается "ниже" чем надо, либо адрес перехода Вы задаете "выше" чем надо.
Igor_U
Все оказалось проще и элементарней.

Я в прикладной программе и в бутлаудере использую прерывания. При переходе на бутлаудер не хватило головы ощистить флаги используемых в бутлаудере и запретить используемые только в прикладной программе, за что и поплатился 3-мя днями поиском этой, теперь очевидной, промашкойsad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.