[an error occurred while processing this directive]
Что-то совсем застрял... скоро свихнусь. Bootloader, AT90CAN128, WinAvr (+).
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Igor 28 марта 2006 г. 13:24

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

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru