Не возьму в толк где грабли. Первоначально шью бутлаудер. С помощью него загружаю прикладную программу. Все работает. Но не получается вызвать бутлаудер из прикладной программы. Точнее переход осуществляется (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.
|