|
|
  |
Прерывания в области загрузчика в 8-й меге |
|
|
|
Nov 27 2006, 17:05
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
В чем может быть причина, почему не работают прерывания в область загрузчика. При аппаратном UART-е функционирует как надо, но расстраивает небольшая скорость (стабильно работает тока на 4800 при 8МГц). Может кто сталкивался с такой проблемой и решил ее. BOOTRST ставлю в 0. В поиске нашел, что кто-то поборол подобную проблему следующим образом: GICR = _BV(IVCE); GICR = _BV(IVSEL); , а не GICR = _BV(IVCE); GICR |= _BV(IVSEL); , но мне это не помогло. Линкуется все правильно, размещается в памяти с адреса 0x1С00 (BOOTSZ = 0); В листинге вектор прерывания от RX указывает на адрес обработчика, а в реале туда не переходит.
|
|
|
|
|
Nov 28 2006, 14:48
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
Цитата(defunct @ Nov 27 2006, 18:00)  Так что вас больше расстраивает? То что УАРТ сбоит на скоростях более 4800 или то, что не происходит перехода на обработчик прерывания? UART будет сбоить пока вы чип не начнете тактировать нормальной частотой, при которой ошибка UARTа будет в приемлемых пределах. Тут все упирается не столько в скорости самого uart-a, сколько в скорость записи во флэш. Время записи страницы во флэш д.б. меньше времени приема след. значения по uart-у. Понятное дело, что увеличение тактовой частоты поможет решить проблему, но это будет решение "в лоб". Если использовать прерывания и буфер, то скорость uart-a можно будет увеличить и не меняя частоты контроллера. Вопрос именно в том, что в области загрузчика не обрабатывается прерывание от uart-а. Если кто знает в чем может быть проблема - подскажите.
|
|
|
|
|
Nov 28 2006, 22:18
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
значение регистра GICR в начале = 0 и после установки IVSEL становится равным 0х02. Бит I в SREG тоже устанавливается. После наступления прерывания программа прыгает по неизвестному адресу(не знаю как его определить) и больше не возвращается.
|
|
|
|
|
Nov 28 2006, 23:58
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(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.
|
|
|
|
|
Nov 29 2006, 01:38
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
Нет, с адресом я не ошибся, он же в хекс-файле указывается :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. Странно, он ведь ничему даже не кратен. Попробую разместить по этому адресу какую-ть подпрограмку, но уже не сегодня...
Сообщение отредактировал Hz! - Nov 29 2006, 02:05
|
|
|
|
|
Nov 29 2006, 10:36
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(Hz! @ Nov 29 2006, 04:38)  Нет, с адресом я не ошибся, он же в хекс-файле указывается :101C000012C02BC02AC029C028C027C026C025C0AA :101C100024C023C022C094C120C01FC01EC01DC04C :101C20001CC01BC01AC011241FBECFE5D4E0DEBF0C..... по адресу 0х1С00 начинается вектор прерываний В хексе бутлоадер должен быть с адреса 0х3800 и заработает
|
|
|
|
|
Nov 29 2006, 12:41
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
viakon:>В хексе бутлоадер должен быть с адреса 0х3800 и заработает
тогда, наверное, с 0x1800. Вообще путаница с этими байтами и словами, блин. Возможно дело в этом. Ща нет возможности посмотреть. Вечером проверю.
|
|
|
|
|
Nov 30 2006, 11:13
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
Вобщем получалось несоответствие начала загрузчика и битов BOOTSZ. Исправил - все заработало. Теперь работает даже при скорости 57600.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|