Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания в области загрузчика в 8-й меге
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Hz!
В чем может быть причина, почему не работают прерывания в область загрузчика.
При аппаратном UART-е функционирует как надо, но расстраивает небольшая скорость
(стабильно работает тока на 4800 при 8МГц). Может кто сталкивался с такой проблемой и решил ее.
BOOTRST ставлю в 0.
В поиске нашел, что кто-то поборол подобную проблему следующим образом:
GICR = _BV(IVCE);
GICR = _BV(IVSEL); , а не
GICR = _BV(IVCE);
GICR |= _BV(IVSEL); , но мне это не помогло.
Линкуется все правильно, размещается в памяти с адреса 0x1С00 (BOOTSZ = 0);
В листинге вектор прерывания от RX указывает на адрес обработчика, а в реале туда не переходит.
defunct
Цитата(Hz! @ Nov 27 2006, 17:05) *
В чем может быть причина, почему не работают прерывания в область загрузчика.
При аппаратном UART-е функционирует как надо, но расстраивает небольшая скорость
(стабильно работает тока на 4800 при 8МГц). Может кто сталкивался с такой проблемой и решил ее.
BOOTRST ставлю в 0.

Так что вас больше расстраивает? То что УАРТ сбоит на скоростях более 4800 или то, что не происходит перехода на обработчик прерывания?
UART будет сбоить пока вы чип не начнете тактировать нормальной частотой, при которой ошибка UARTа будет в приемлемых пределах.
Hz!
Цитата(defunct @ Nov 27 2006, 18:00) *
Так что вас больше расстраивает? То что УАРТ сбоит на скоростях более 4800 или то, что не происходит перехода на обработчик прерывания?
UART будет сбоить пока вы чип не начнете тактировать нормальной частотой, при которой ошибка UARTа будет в приемлемых пределах.

Тут все упирается не столько в скорости самого uart-a, сколько в скорость записи во флэш.
Время записи страницы во флэш д.б. меньше времени приема след. значения по uart-у.
Понятное дело, что увеличение тактовой частоты поможет решить проблему, но это будет решение "в лоб".
Если использовать прерывания и буфер, то скорость uart-a можно будет увеличить и не меняя частоты контроллера. Вопрос именно в том, что в области загрузчика не обрабатывается прерывание от uart-а.
Если кто знает в чем может быть проблема - подскажите.
defunct
Цитата(Hz! @ Nov 28 2006, 14:48) *
Вопрос именно в том, что в области загрузчика не обрабатывается прерывание от uart-а.

Посмотрите реальное значение регистра GICR после инициализации. А также посмотрите куда осуществялется переход при прерывании.
Hz!
значение регистра GICR в начале = 0 и после установки IVSEL становится равным 0х02. Бит I в SREG тоже устанавливается.
После наступления прерывания программа прыгает по неизвестному адресу(не знаю как его определить) и больше не возвращается.
defunct
Цитата(Hz! @ Nov 28 2006, 22:18) *
После наступления прерывания программа прыгает по неизвестному адресу(не знаю как его определить) и больше не возвращается.

Значит все более-менее хорошо. Адрес определить не сложно, всего 5 точек куда может прыгнуть
1. по вектору таблицы векторов в начале памяти (адрес 0),
либо по вектору в секции бутлоадера, начало секции бутлоадера взависимости от размера секции (256, 512, 1024, 2048 байт) может располагаться по четырем различным адресам.
2. Flashsize - 128.
3. Flashsize - 256.
4. Flashsize - 512.
5. Flashsize - 1024.

Вероятно вы просто ошиблись с адресом начала секции бутлоадера, вот оно и прыгает бог знает куда.
Если смотрели в симуляторе, где размер секции бутлоадера (boot size) не задан (и не может быть задан) программа прыгает в неизвестном направлении.
Если же смотрели через JTAG эмулятор, то очевидно неверно запрограммированы Fuses BOOTSZ.
Hz!
Нет, с адресом я не ошибся, он же в хекс-файле указывается
:101C000012C02BC02AC029C028C027C026C025C0AA
:101C100024C023C022C094C120C01FC01EC01DC04C
:101C20001CC01BC01AC011241FBECFE5D4E0DEBF0C.....
по адресу 0х1С00 начинается вектор прерываний (12C02BC02AC0....) и весь последующий код. BOOTSZ я тоже не перепутал (=0) т.к. у меня код еле вмещается в 1024 байта, т.е. в противном случаи он просто не влез бы в загрузочный сектор.
Симулятор выдал следующую ошибку предупреждение:
AVR Simulator: Invalid opcode 0xffff at address 0x000000,
но продолжил выполнение программы, а при прерывании прыгнул на 0x000c0b и тоже выдал:
AVR Simulator: Invalid opcode 0xffff at address 0x000c0b.
Но он то не знает что BOOTRST = 0, это в 1-м случае, а во втором - там действительно ничего нет. Я изменил код, чтобы сместились адреса подпрограмм, но он опять прыгнул на 0x000c0b. Странно, он ведь ничему даже не кратен. Попробую разместить по этому адресу какую-ть подпрограмку, но уже не сегодня...
viakon
Цитата(Hz! @ Nov 29 2006, 04:38) *
Нет, с адресом я не ошибся, он же в хекс-файле указывается
:101C000012C02BC02AC029C028C027C026C025C0AA
:101C100024C023C022C094C120C01FC01EC01DC04C
:101C20001CC01BC01AC011241FBECFE5D4E0DEBF0C.....
по адресу 0х1С00 начинается вектор прерываний

В хексе бутлоадер должен быть с адреса 0х3800 и заработает
Hz!
viakon:>В хексе бутлоадер должен быть с адреса 0х3800 и заработает

тогда, наверное, с 0x1800. Вообще путаница с этими байтами и словами, блин. Возможно дело в этом. Ща нет возможности посмотреть. Вечером проверю.
Hz!
Вобщем получалось несоответствие начала загрузчика и битов BOOTSZ.
Исправил - все заработало. Теперь работает даже при скорости 57600.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.