Мой под CodeVIsion.
После того, как создал тему досконально проштудировал выложенный код и в прнципе, во всем разобрался. Осталось только два вопроса.
1. Чем после этого программировать-то по USB? Я прошил бут, прошил основную программу. Она точно работает, так как отправляет по USART приветствие и на отправку условного символа "<" отвечает. ПРобовал после этого в настройках CodeVision поменять номер порта програамматора на соответствующий - пытается программировать, но вытает сообщение которое обычно бывает при отсутствии ответа от МК.
2. как-то странно все работает. Поставил флажки в программе загрузки и основной программе. Когда прошиваю бут - срабатывает флажок бута и из бута программа не выходит. КОгда прошиваю основную программу - срабатывает ее флажок. В параметрах проекта бутлодера тип "bootloader" ставил, и при программмировании пишет, что прошиваю бут. Размер - 512 слов, начальный адрес бута 0xE00. ВРоде все правильно. Где копнуть, как понять где ошибка?
Цитата
Вряд ли из настроек проекта. Хотя...
Наверное все-таки как-то из настроек проекта параметр берется:
в хидере бута есть такие строки
Код
#elif defined _CHIP_ATMEGA32_
#define DeviceID 'E' // Mega32
#define FlashSize 'n' // Flash 32k
#define PageSize 'S' // 128 Bytes
#define PageByte 128 // 128 Bytes
#define AddressLshift 7
#asm(".EQU SpmcrAddr=0x57")
#include <mega32.h>
Когда связываюсь через терминал с устройством (путем отправки "<") устройство в ответ присылает те самые символы "Ens".
Вот для информации:
главный цикл бутлодера:
CODE
// USART initialization <<<
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
//UBRRH=0x00;
//UBRRL=0x2F;
DDRD.5=1;
ubbr = (unsigned long int)_MCU_CLOCK_FREQUENCY_ / (BAUDRATE * 16) - 1;
UBRRH=ubbr >> 8;
UBRRL = ubbr;
putchar('>'); // ПРИ ЗАПУСКЕ КОНТРОЛЛЕРА ПОСТОЯННО ШЛЕТСЯ ПРИВЕТСТВИЕ.
while ( (! (UCSRA&128)) &( i < 32000) ) i++; //wait for data in or timeout
if (i < 32000) inchar= getchar();
if (inchar == '<') BootLoad(); // ПРИ ПОСЫЛКЕ ИЗ ТЕРМНАЛА УКАЗАННОГО СИМВОЛА ПРОГРАММА ЗАХОДИТ В
// BootLoad, проверено установкой флажка.
ExecCode(); // set up and jump to application
А вот собственно функция запуска основной программы:
CODE
void main(void)
{
void ExecCode(void)
{
#if defined _CHIP_ATMEGA128_
RAMPZ = 0;
#endif
MCUCR = 0x01; // Enable interrupt vector select
MCUCR = 0x00; // Move interrupt vector to flash
//<---- ФЛАЖОК, ПОСТАВЛЕННЫЙ ЗДЕСЬ СРАБАТЫВАЕТ
#asm("jmp 0x00"); // Run application code
//<---- А ФЛАЖОК, ПОСТАВЛЕННЫЙ ЗДЕСЬ УЖЕ НЕ СРАБАТЫВАЕТ, ТО ЕСТЬ ПРЫЖОК НА НУЛЕВОЙ АДРЕС ВСЕ ТАКИ ПРОИСХОДИТ.
// ВОТ ТОЛЬКО ПО ЭТОМУ АДРЕСУ НИЧЕГО НЕ ВЫПОЛНЯЕТСЯ, БУТ ЗАПУСКАЕТСЯ СНАЧАЛА.
}
}
Что делать и кто виноват?
В общем, складывается ощущение, что бутлодер пишется не на адрес 3E00, а на нулевой адрес, затирая основную программу. Потому что флажок в функции срабатывает постоянно, то есть программа бутлодера запускается вновь и вновь.