реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Прерывания в области загрузчика в 8-й меге
Hz!
сообщение Nov 27 2006, 17:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 указывает на адрес обработчика, а в реале туда не переходит.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 27 2006, 18:00
Сообщение #2


кекс
******

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



Цитата(Hz! @ Nov 27 2006, 17:05) *
В чем может быть причина, почему не работают прерывания в область загрузчика.
При аппаратном UART-е функционирует как надо, но расстраивает небольшая скорость
(стабильно работает тока на 4800 при 8МГц). Может кто сталкивался с такой проблемой и решил ее.
BOOTRST ставлю в 0.

Так что вас больше расстраивает? То что УАРТ сбоит на скоростях более 4800 или то, что не происходит перехода на обработчик прерывания?
UART будет сбоить пока вы чип не начнете тактировать нормальной частотой, при которой ошибка UARTа будет в приемлемых пределах.
Go to the top of the page
 
+Quote Post
Hz!
сообщение Nov 28 2006, 14:48
Сообщение #3


Участник
*

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



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

Тут все упирается не столько в скорости самого uart-a, сколько в скорость записи во флэш.
Время записи страницы во флэш д.б. меньше времени приема след. значения по uart-у.
Понятное дело, что увеличение тактовой частоты поможет решить проблему, но это будет решение "в лоб".
Если использовать прерывания и буфер, то скорость uart-a можно будет увеличить и не меняя частоты контроллера. Вопрос именно в том, что в области загрузчика не обрабатывается прерывание от uart-а.
Если кто знает в чем может быть проблема - подскажите.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 28 2006, 15:27
Сообщение #4


кекс
******

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



Цитата(Hz! @ Nov 28 2006, 14:48) *
Вопрос именно в том, что в области загрузчика не обрабатывается прерывание от uart-а.

Посмотрите реальное значение регистра GICR после инициализации. А также посмотрите куда осуществялется переход при прерывании.
Go to the top of the page
 
+Quote Post
Hz!
сообщение Nov 28 2006, 22:18
Сообщение #5


Участник
*

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



значение регистра GICR в начале = 0 и после установки IVSEL становится равным 0х02. Бит I в SREG тоже устанавливается.
После наступления прерывания программа прыгает по неизвестному адресу(не знаю как его определить) и больше не возвращается.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 28 2006, 23:58
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Hz!
сообщение Nov 29 2006, 01:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
viakon
сообщение Nov 29 2006, 10:36
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



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

В хексе бутлоадер должен быть с адреса 0х3800 и заработает
Go to the top of the page
 
+Quote Post
Hz!
сообщение Nov 29 2006, 12:41
Сообщение #9


Участник
*

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



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

тогда, наверное, с 0x1800. Вообще путаница с этими байтами и словами, блин. Возможно дело в этом. Ща нет возможности посмотреть. Вечером проверю.
Go to the top of the page
 
+Quote Post
Hz!
сообщение Nov 30 2006, 11:13
Сообщение #10


Участник
*

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



Вобщем получалось несоответствие начала загрузчика и битов BOOTSZ.
Исправил - все заработало. Теперь работает даже при скорости 57600.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016