Перейти к содержанию
    

таблица векторов прерываний

Доброго времени суток!

 

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

 

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

Что я делаю неверно, как нужно правильно делать?

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что я делаю неверно, как нужно правильно делать?
Вот для меги8, делайте аналогично: 
GICR = (1<<IVCE);
 GICR = (1<<IVSEL);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот для меги8, делайте аналогично:
GICR = (1<<IVCE);
  GICR = (1<<IVSEL);

То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся..

Сам понимаю, что должно работать, но не работает почему-то :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То, что я делаю для ATmega64x анологично вашему, только биты в другом регистре находятся..
Нет, не аналогично. Смотрите внимательнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, не аналогично. Смотрите внимательнее.

Спасибо!

Действительно я был невнимателен :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот для меги8, делайте аналогично: 
GICR = (1<<IVCE);
 GICR = (1<<IVSEL);

Не могли бы вы прислать рабочий код с переносом таблицы векторов. В своём проекте пытался перенести таблицу векторов в загрузочную область - нехотит переноситься. Проблема в том, что иногда затирается начальная область программной памяти и поэтому хотел перенести программу повыше. Но без переноса векторов это невозможно сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могли бы вы прислать рабочий код с переносом таблицы векторов.
Это код не переноса векторов, а переключения таблиц. У AVR есть вторая таблица - в начале секции загрузчика. Этот код переключает ядро на работу с этой второй таблицей. Чтобы таблица не затиралась вам надо сделать загрузчик полностью отдельным проектом, уместить его полностью в секции загрузчика (средствами скрипта линкера), конфигурационным битом BOOTRST заставить процессор стартовать с вектора RESET этой таблицы и битами BLB запретить запись в секцию загрузчика. А уже загрузчик после старта при необходимости переключит ядро на эту свою таблицу векторов указанным выше кодом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...