legotron 0 10 марта, 2009 Опубликовано 10 марта, 2009 · Жалоба Доброго времени суток! ATMega644, WinAVR 20081124rc3 Возникла проблема: не удается перенести таблицу векторов прерываний в область загрузчика :( Необходимо изменить IVSEL в течении 4 машинных циклов, пока активен IVCE? 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 По результатам проверки на практике, таблица осталась в области приложения.. Что я делаю неверно, как нужно правильно делать? Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 10 марта, 2009 Опубликовано 10 марта, 2009 · Жалоба Что я делаю неверно, как нужно правильно делать?Вот для меги8, делайте аналогично: GICR = (1<<IVCE); GICR = (1<<IVSEL); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
legotron 0 10 марта, 2009 Опубликовано 10 марта, 2009 · Жалоба Вот для меги8, делайте аналогично: GICR = (1<<IVCE); GICR = (1<<IVSEL); То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся.. Сам понимаю, что должно работать, но не работает почему-то :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 10 марта, 2009 Опубликовано 10 марта, 2009 · Жалоба То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся..Нет, не аналогично. Смотрите внимательнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
legotron 0 10 марта, 2009 Опубликовано 10 марта, 2009 · Жалоба Нет, не аналогично. Смотрите внимательнее. Спасибо! Действительно я был невнимателен :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OkhinVI 0 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Вот для меги8, делайте аналогично: GICR = (1<<IVCE); GICR = (1<<IVSEL); Не могли бы вы прислать рабочий код с переносом таблицы векторов. В своём проекте пытался перенести таблицу векторов в загрузочную область - нехотит переноситься. Проблема в том, что иногда затирается начальная область программной памяти и поэтому хотел перенести программу повыше. Но без переноса векторов это невозможно сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 17 февраля, 2010 Опубликовано 17 февраля, 2010 · Жалоба Не могли бы вы прислать рабочий код с переносом таблицы векторов.Это код не переноса векторов, а переключения таблиц. У AVR есть вторая таблица - в начале секции загрузчика. Этот код переключает ядро на работу с этой второй таблицей. Чтобы таблица не затиралась вам надо сделать загрузчик полностью отдельным проектом, уместить его полностью в секции загрузчика (средствами скрипта линкера), конфигурационным битом BOOTRST заставить процессор стартовать с вектора RESET этой таблицы и битами BLB запретить запись в секцию загрузчика. А уже загрузчик после старта при необходимости переключит ядро на эту свою таблицу векторов указанным выше кодом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться