Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: таблица векторов прерываний
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Legotron
Доброго времени суток!

ATMega644, WinAVR 20081124rc3

Возникла проблема: не удается перенести таблицу векторов прерываний в область загрузчика sad.gif
Необходимо изменить IVSEL в течении 4 машинных циклов, пока активен IVCE?

Цитата(ATMega644 Datasheet)
To avoid unintentional changes of Interrupt Vector tables, a special write procedure must
be followed to change the IVSEL bit:
a. Write the Interrupt Vector Change Enable (IVCE) bit to one.
b. Within four cycles, write the desired value to IVSEL while writing a zero to IVCE.


Делаю следующее:
Код
MCUCR |= (1 << IVCE);
MCUCR |= (1 << IVSEL);
MCUCR &= ~(1 << IVCE);


Оптимизация -Os:
Код
MCUCR |= (1 << IVCE);
                           e000:    85 b7           in    r24, 0x35   ; 53
                           e002:    81 60           ori    r24, 0x01   ; 1
                           e004:    85 bf           out    0x35, r24   ; 53
MCUCR |= (1 << IVSEL);
                           e006:    85 b7           in    r24, 0x35   ; 53
                           e008:    82 60           ori    r24, 0x02   ; 2
                           e00a:    85 bf           out    0x35, r24   ; 53
MCUCR &= ~(1 << IVCE);
                           e00c:    85 b7           in    r24, 0x35   ; 53
                           e00e:    8e 7f           andi    r24, 0xFE   ; 254
                           e010:    85 bf           out    0x35, r24   ; 53


По результатам проверки на практике, таблица осталась в области приложения..
Что я делаю неверно, как нужно правильно делать?

Спасибо!
Сергей Борщ
Цитата(Legotron @ Mar 10 2009, 12:43) *
Что я делаю неверно, как нужно правильно делать?
Вот для меги8, делайте аналогично: 
Код
GICR = (1<<IVCE);
 GICR = (1<<IVSEL);
Legotron
Цитата(Сергей Борщ @ Mar 10 2009, 13:59) *
Вот для меги8, делайте аналогично:
Код
GICR = (1<<IVCE);
  GICR = (1<<IVSEL);

То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся..
Сам понимаю, что должно работать, но не работает почему-то sad.gif
Сергей Борщ
Цитата(Legotron @ Mar 10 2009, 13:20) *
То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся..
Нет, не аналогично. Смотрите внимательнее.
Legotron
Цитата(Сергей Борщ @ Mar 10 2009, 15:03) *
Нет, не аналогично. Смотрите внимательнее.

Спасибо!
Действительно я был невнимателен smile.gif
Екклесиаст
Цитата(Сергей Борщ @ Mar 10 2009, 16:59) *
Вот для меги8, делайте аналогично: 
Код
GICR = (1<<IVCE);
 GICR = (1<<IVSEL);

Не могли бы вы прислать рабочий код с переносом таблицы векторов. В своём проекте пытался перенести таблицу векторов в загрузочную область - нехотит переноситься. Проблема в том, что иногда затирается начальная область программной памяти и поэтому хотел перенести программу повыше. Но без переноса векторов это невозможно сделать.
Сергей Борщ
Цитата(Екклесиаст @ Feb 17 2010, 11:41) *
Не могли бы вы прислать рабочий код с переносом таблицы векторов.
Это код не переноса векторов, а переключения таблиц. У AVR есть вторая таблица - в начале секции загрузчика. Этот код переключает ядро на работу с этой второй таблицей. Чтобы таблица не затиралась вам надо сделать загрузчик полностью отдельным проектом, уместить его полностью в секции загрузчика (средствами скрипта линкера), конфигурационным битом BOOTRST заставить процессор стартовать с вектора RESET этой таблицы и битами BLB запретить запись в секцию загрузчика. А уже загрузчик после старта при необходимости переключит ядро на эту свою таблицу векторов указанным выше кодом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.